GitHub Action

서동수·2022년 10월 19일
0

GitHub Action

GitHub Action은 GitHub에서 제공하는
CI: 지속적 통합
CD: 지속적 배포
를 위한 서비스 입니다.

Repository에서 어떤 Event가 발생하면 그에 따른 작업수행, 반복이 가능해집니다.

예를 들어 특정 branch이름으로 Repositorypush를 하면 테스트코드를 실행하고 성공하면 정해진 Template으로 PullRequest를 생성하고 실패하면
작업을 취소하는 등의 편리한 작업이 가능해지는 겁니다.

많이 사용하는 Jenkins등의 도구도 있지만 GitHubAction은 진입장벽이 낮은 장점이 있어 DevOps가아닌 개발자도 CI/CD를 설정을 보다 쉽게 접근할 수 있게 되었습니다.

Workflows (GitHub Action에서 가장 상위 개념)

.github/workflows경로 하위에 yaml로 설정이 가능합니다.

  • yaml에는 크게 2가지를 정의해야 합니다.
    - on: workflow의 실행시점 입니다.
    - jobs: workflow의 작업내용 입니다.

  • 예제코드 (yaml파일)
참고링크(https://docs.github.com/en/actions/using-workflows/about-workflows)
name: learn-github-actions // Repository Actions탭에 표시될 이름
run-name: ${{ github.actor }} is learning GitHub Actions // Workflows의 이름
on: [push] // Workflows의 트리거
jobs: // learn-github-actions의 작업 그룹
  check-bats-version: // job(작업)
    runs-on: ubuntu-latest // 우분투 최신 버전에서 실행
    steps: // job의 단계 그룹
      - uses: actions/checkout@v3 // 워크플로가 실행될 떄마다 체크아웃 실행
      - uses: actions/setup-node@v3 // node14버전 설치
        with:
          node-version: '14'
      - run: npm install -g bats // 명령 실행
      - run: bats -v // 명령 실행
  • 예제코드 시각화
  • 민감한 데이터를 사용하는 경우
    아래와 같이 환경변수를 사용할 수 있습니다.
jobs:
  example-job:
    runs-on: ubuntu-latest
    steps:
      - name: Retrieve secret
        env:
          super_secret: ${{ secrets.SUPERSECRET }}
        run: |
          example-command "$super_secret"
  • 종속작업
    기본적으로 WorkFlows의 모든 작업은 병렬실행 입니다.
    needs를 이용해 종속을 만들 수 있습니다. 작업 중 하나가 실패하면 종속된 작업은 실행되지 않습니다.
    그럼에도 작업을 하고 싶다면 if문을 통해 정의가 가능합니다.
jobs:
  setup:
    runs-on: ubuntu-latest
    steps:
      - run: ./setup_server.sh
  build:
    needs: setup
    runs-on: ubuntu-latest
    steps:
      - run: ./build_server.sh
  test:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - run: ./test_server.sh
  • 매트릭스
    strategy,matrix를 이용해 여러 버전, 언어, 운영체제에서 코드를 테스트 할 수 있습니다.
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node: [12, 14, 16]
    steps:
      - uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node }}
  • 캐싱 종속성
    작업이 정기적으로 재사용되면 캐싱을 통해 성능 개선이 가능합니다.
    캐시가 생성되면 동일한 Repository의 모든 워크플로에서 사용이 가능합니다.
jobs:
  example-job:
    steps:
      - name: Cache node modules
        uses: actions/cache@v3
        env:
          cache-name: cache-node-modules
        with:
          path: ~/.npm
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-build-${{ env.cache-name }}-
  • 데이터베이스 및 서비스 컨테이너 사용
    데이터베이스, 캐시 서비스가 필요하면 services를 사용해 서비스를 호스팅하는 임시 컨테이너 생성이 가능합니다.
    컨테이너는 작업의 모든 단계에서 사용할 수 있고 이 후 제거됩니다.
jobs:
  container-job:
    runs-on: ubuntu-latest
    container: node:10.18-jessie
    services:
      postgres:
        image: postgres
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3
      - name: Install dependencies
        run: npm ci
      - name: Connect to PostgreSQL
        run: node client.js
        env:
          POSTGRES_HOST: postgres
          POSTGRES_PORT: 5432
  • 레이블을 사용하여 워크플로 라우팅
    추가 레이블을 할당할 수 있습니다. 배열에 있는 모든 레이블을 가진 러너에서만 실행됩니다.
    사용할 수 있는 항목이 없고 지정된 레이블이 있는 GitHub러너가 있는 경우 GitHub러너로 작업은 이동합니다.
jobs:
  example-job:
    runs-on: [self-hosted, linux, x64, gpu]
  • 워크플로 재사용
    다른 WorkFlows내에서 WorkFlows를 호출할 수 있습니다.

  • 환경 사용
    WorkFlows의 작업실행을 제어하기 위해서 보호, 비밀환경을 구성할 수 있습니다.

profile
devLog

0개의 댓글