Github Actions - Matrix & Secrets

이번에는 Matrix를 활용하여 다중 OS 환경, 다양한 버전의 언어, 프레임워크 등을 활성화 시키는 워크플로우를 작성해보겠습니다.

 

Matrix

Matrix는 Array와 유사합니다. YAML에서는 특정 변수를 선언할 수 있는데, 이를 복수개로 선언하고 싶을 경우에는 Matrix를 사용할 수 있습니다. 아마 기존의 Travis CI를 써보신 분들이라면 익숙할 것입니다.

name: Practice actions

on:
  push:
    branches:
      - master

  pull_request:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: [2.7, 3.5, 3.6, 3.7]
    
    steps:
      - uses: actions/checkout@v1
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v1
        with:
          python-version: ${{ matrix.python-version }}
      - name: Install dependencies...
        run: python -m pip install --upgrade pip  # Instead of APT for debian package manager

기존에 사용했던 Workflow를 기반으로 하여 master 브랜치에 Push, PR을 기본 이벤트로 두고, Python 언어에서 작업한다고 가정해보겠습니다. Python 버전은 생각보다 많기 떄문에 여러 버전에서 호환을 원한다면 각 버전에서 테스트해야 할 필요가 생기게 됩니다. 

 

이럴 때는 Github Actions에서 제공하는 setup 레포지터리를 사용할 수 있습니다. 해당 레포지터리에서 제공하는 Python Setup 패키지를 steps에 추가하고, with 반복문을 사용하면, matrix에서 본인이 정의한 버전을 설치해줍니다.

 

그러면 왼쪽에 보시는 것과 같이 빌드 환경이 버전별로 나열이 되는 것을 확인하실 수 있습니다. 그런데, 꼭 굳이 step을 밟을 때 Github Actions에서 제공하는 코드만 써야할까요? 물론 그것은 아닙니다. 이 코드는 보다시피 OS 환경을 Ubuntu로 사용하고 있고, 빌드 환경 또한 Travis CI를 사용하고 있기 때문에 Debian에서 제공하는 apt package manager를 사용해도 될 것입니다. 

name: Practice actions

on:
  push:
    branches:
      - master

  pull_request:
    branches:
      - master

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      max-parallel: 4
      matrix:
        python-version: [2.7, 3.5, 3.6, 3.7]
        os: [ubuntu-latest, windows-latest, macOS-latest]
    
    steps:
      - uses: actions/checkout@v1
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v1
        with:
          python-version: ${{ matrix.python-version }}
      - name: Install dependencies...
        run: python -m pip install --upgrade pip  # Instead of APT for debian package manager

추가로 OS에 대해서도 위와 같이 Matrix를 적용할 수 있습니다.

 

패러랠를 활성화 시켰더니 환경 만드는 작업이 그렇게 오래 걸리진 않네요.. 전부 다 해서 한 5분 정도 소요된 것 같습니다. 

이를 응용해서 Java, Javascript 등의 언어도 동일하게 워크플로우를 만드실 수 있습니다.

 

 

 

Secrets

다음은 Secrets입니다. Secrets는 매우 중요하죠. 여러분들이 만약, PR Workflow에서 기본적인 테스트를 진행하고, 이것이 Merge가 이루어지면 배포를 해야겠죠? Git flow를 예로 들었을 때, develop이 끝나면, Test 후, Production으로 가는 것과 비슷한 상황인 것입니다.

 

하지만 On-Premise 환경에서 배포를 하는 것이라면, IP 주소가 가장 민감한 사항일 것이고, VPN을 사용한다면 그에 입력되는 계정사항이 최상의 보안 정보에 해당될 것입니다. 안전한 프로토콜이나 Secure Layer를 적용했다 하더라도 이들이 같이 레포지터리에 공유된 상태로 있다면 검색 엔진 환경에 노출이 되기 때문에 이는 결코 권장하지 않는 사항 중에 하나입니다.

 

Travis CI에서는 자체적으로 Virtual Environment를 제공하여 민감한 정보를 보관할 수 있는 곳이 있었죠. Github에서 또한 이러한 가상 환경을 제공하여 민감한 정보를 안전하게 보관할 수 있는 방법이 있습니다.

 

레포지터리의 설정에 가면 Secrets 메뉴가 생겨져 있습니다. Secrets 메뉴에서 환경 변수를 암호화하여 Actions에 제공을 하기 때문에 보다 안전하게 클라우드의 IAM 인증 정보 등을 사용하여 API로 쉽게 배포하는 환경을 만들 수 있습니다.

name: Practice actions

on:
  push:
    branches:
      - master

  pull_request:
    branches:
      - master

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      max-parallel: 4
      matrix:
        python-version: [2.7, 3.5, 3.6, 3.7]
        os: [ubuntu-latest, windows-latest, macOS-latest]
    
    steps:
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v1
        with:
          python-version: ${{ matrix.python-version }}
      - name: Install dependencies...
        run: python -m pip install --upgrade pip  # Instead of APT for debian package manager
      - name: Download for changes...
        uses: actions/checkout@v1
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

환경변수를 부르는 방법은 secrets 라는 객체를 사용할 수 있습니다. 이렇게 배포 환경을 만드는 것도 문제 없이 Actions를 이용해서 쉽게 만드실 수 있습니다.

 

다음 글에서는 React 프로젝트 + Firebase Deploy 환경을 사용한 자동 배포 환경을 만드는 시간을 가지도록 하겠습니다.

comments powered by Disqus

Tistory Comments 0