Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

GitHub Actions 워크플로우의 승인 기능 사용하기

GitHub Actions에 CI/CD도 다양하게 사용할 수 있도록 작년에 기능이 추가된 것 같은데 지난달에 모두가 이용할 수 있도록 공개되었다.

이번에 공개된 기능에는 워크플로우의 잡에 지정할 수 있는 환경(Environments)과 환경 보호 규칙, 환경에 한정된 시크릿이 포함되어 있다. 이전에도 배포를 못 한 것은 아니지만 이 기능이 있으면 더 편하게 사용할 수 있다. 시크릿 같은 경우도 이전에는 전체 저장소에 시크릿을 지정해야 했지만 이번에는 같은 환경변수라도 개발/알파/프로덕션 같은 식으로 따로 지정해서 사용할 수 있다.

Environments는 작년인가 추가되었던 거로 기억하는데 마침 승인 기능이 필요하던 차에 베타가 끝나고 공개적으로 이용할 수 있게 되어서 이번에 사용해보았다.

간단한 배포 파이프라인

간단한 배포를 생각하면 테스트를 실행하고 개발 환경에 배포하고 프로덕션 환경에 배포하게 된다. 배포를 위한 GitHub Actions 워크플로우를 작성해보자.

name: Deployment
on: push

jobs:
  test:
    name: Test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: echo 'run tests'

  deploy-dev:
    name: Deploy(Dev)
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: echo 'dev deployment'

  deploy-production:
    name: Deploy(Production)
    needs: deploy-dev
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: echo 'production deployment'

테스트, 개발 배포, 프로덕션 배포 순으로 파이프라인을 연결했고 어떻게 배포하는지는 중요하지 않으므로 echo로 문자열만 출력했다. 실제로는 여기서 빌드나 컨테이너 이미지 생성 등의 배포 준비를 하고 Docker 레지스트리에 푸시하거나 AWS EC2나 S3에 배포하는 작업이 이뤄질 것이다.

GitHub Actions 워크플로우

이를 실행하면 Actions에서 위처럼 이어지게 된다. 각 잡마다 needs를 지정해서 이전 잡이 성공해야만 다음 잡이 실행되게 된다. 여기서는 실패할 이유가 없으므로 프로덕션 배포까지 모두 실행된다.

잡 승인

GitHub Actions 실행에 다양한 조건을 넣을 수 있지만, 예시로 든 배포 흐름을 생각하면 개발 배포까지는 자동으로 나가도 되지만 프로덕션 배포는 승인이 필요하게 하고자 한다. 자동화가 잘 되어 있다면 프로덕션 배포도 자동으로 나가게 할 수 있지만 이렇게 하려면 많은 작업이 필요하므로 여기서는 개발자가 확인 후 원하는 타이밍에 승인하면 프로덕션 배포가 나가도록 수정해보자.

Environments 생성

프로덕션 배포만 따로 관리해야 하므로 일단 GitHub 저장소에서 Environments를 생성해야 한다.

GitHub의 Environment 설정

저장소에 Settings 아래 Environments 메뉴에서 새로운 환경을 생성할 수 있다.

GitHub의 Environment 설정에서 production 환경 생성

원하는 환경 이름을 지정하면 되는데 여기서는 production 환경을 만들었다.

GitHub의 Environment 설정에서 production 환경 설정

다음은 환경을 설정하는 화면인데 여기서 이 환경의 시크릿이나 적용할 브랜치를 지정할 수 있다. 상단에 환경 보고 규칙이 있는데 현재 수동 승인을 위한 "Required reviewers""Wait timer"를 지정할 수 있다.

GitHub의 Environment의 보호 규칙

규칙을 키면 추가 설정을 볼 수 있다.

"Required reviewers"를 키면 이 환경의 잡은 누군가 승인해 주어야 실행되고 그렇지 않으면 대기 상태가 된다. 승인자는 개인이나 팀을 6개까지 추가할 수 있는데 여기서 추가하려면 해당 개인이나 팀이 저장소에 read 권한이 있어야 한다. 없다면 "Magage access"에서 collaborator로 읽기 권한을 추가해 주어야 한다.

"Wait timer"은 해당 환경의 잡이 트리거 된 뒤에 대기하는 시간을 말한다. "Required reviewers"를 활성화했다면 승인한 뒤에 여기서 지정한 시간만큼 기다린 후에 잡이 실행된다.

Environments 연결

앞에서 만든 워크플로우에 Environments를 연결해 보자.

deploy-production:
  name: Deploy(Production)
  needs: deploy-dev
  runs-on: ubuntu-latest
  environment: production
  steps:
    - uses: actions/checkout@v2
    - run: echo 'production deployment'

여기서 달라진 점은 environment: production 부분뿐이다. environment을 이용해서 앞서 생성한 환경을 지정해 주면 된다.(참고로 환경변수는 env이다.

GitHub Actions 워크플로우가 대기 중인 화면

다시 워크플로우가 실행하면 아까와 달리 Deploy(Production) 잡이 실행되지 않고 리뷰를 기다리는 것을 볼 수 있다.

GitHub Actions 워크플로우 승인 화면

지정한 환경을 확인하고 승인을 누르면 배포가 진행된다.

GitHub Actions 워크플로우의 승인 기록

승인에 대한 기록은 실행된 워크플로우 화면에서 볼 수 있다.

GitHub Actions 워크플로우의 거절 기록

승인하지 않고 거절하면 해당 잡은 실행되지 않고 위처럼 기록이 남게 된다.

2021/07/30 20:20 2021/07/30 20:20