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에 배포하는 작업이 이뤄질 것이다.
이를 실행하면 Actions에서 위처럼 이어지게 된다. 각 잡마다 needs
를 지정해서 이전 잡이 성공해야만 다음 잡이 실행되게 된다. 여기서는 실패할 이유가 없으므로 프로덕션 배포까지 모두 실행된다.
잡 승인
GitHub Actions 실행에 다양한 조건을 넣을 수 있지만, 예시로 든 배포 흐름을 생각하면 개발 배포까지는 자동으로 나가도 되지만 프로덕션 배포는 승인이 필요하게 하고자 한다. 자동화가 잘 되어 있다면 프로덕션 배포도 자동으로 나가게 할 수 있지만 이렇게 하려면 많은 작업이 필요하므로 여기서는 개발자가 확인 후 원하는 타이밍에 승인하면 프로덕션 배포가 나가도록 수정해보자.
Environments 생성
프로덕션 배포만 따로 관리해야 하므로 일단 GitHub 저장소에서 Environments를 생성해야 한다.
저장소에 Settings 아래 Environments 메뉴에서 새로운 환경을 생성할 수 있다.
원하는 환경 이름을 지정하면 되는데 여기서는 production
환경을 만들었다.
다음은 환경을 설정하는 화면인데 여기서 이 환경의 시크릿이나 적용할 브랜치를 지정할 수 있다. 상단에 환경 보고 규칙이 있는데 현재 수동 승인을 위한 "Required reviewers"와 "Wait timer"를 지정할 수 있다.
규칙을 키면 추가 설정을 볼 수 있다.
"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
이다.
다시 워크플로우가 실행하면 아까와 달리 Deploy(Production)
잡이 실행되지 않고 리뷰를 기다리는 것을 볼 수 있다.
지정한 환경을 확인하고 승인을 누르면 배포가 진행된다.
승인에 대한 기록은 실행된 워크플로우 화면에서 볼 수 있다.
승인하지 않고 거절하면 해당 잡은 실행되지 않고 위처럼 기록이 남게 된다.
Comments