새로운 코드 통합으로 인해 개발 및 운영팀에 발생하는 문제 (integration hell) 를 해결하기 위한 솔루션으로, 앱 개발 단계를 자동화하여 앱을 보다 짧은 주기로 사용자에게 제공하는 방법입니다. 애플리케이션의 통합 및 테스트 단계에서부터 제공 및 배포에 이르는 애플리케이션의 라이프사이클 전체에 걸쳐 지속적인 자동화와 지속적인 모니터링을 제공합니다.
CI (Continuous Integration) 란 테스트, 빌드 자동화를 말합니다. 다수의 개발자가 동시에, 긴 텀으로 관련 작업을 할 경우 통합과 충돌 해결은 더 어려워지고 버그 발생 위험은 더 커집니다. CI 는 이를 위한 해결법으로, 새로운 코드 변경 사항이 짧은 텀으로 빌드, 테스트 되어 병합될 수 있도록 합니다.
CD (Continuous Delivery(Deployment)) 란 배포 자동화를 말합니다. 최소한의 노력으로 새로운 코드를 배포하는 것을 목표로 합니다.
더 알아보기
redhat: CI/CD(지속적 통합/지속적 제공): 개념, 방법, 장점, 구현 과정
fullstackopen: Introduction to CI/CD
GitHub Acitons 는 소프트웨어의 워크플로우를 쉽게 자동화할 수 있는 CI/CD 툴입니다. 이벤트 기반으로 작동하며, 명시된 이벤트 가 발생할 때마다 지정된 일련의 명령들을 자동으로 실행할 수 있습니다.
특정 브랜치에 변경 사항이 push 될 때마다 자동으로 프로젝트를 빌드 후 배포하도록 하는 예를 들어보겠습니다. push 라는 이벤트 (event)
가 발생할 때 마다 워크플로우 (workflow)
가 자동으로 트리거 되고, 워크플로우 내부에 명시된 작업 (job)
의 단계 (step)
별로 해당하는 액션 (action)
들이 실행됩니다.
Github Actions 의 사용량에 따라 요금에 부과될 수 있습니다. Total concurrent jobs 20개 까지 Free plan 으로 부담갖지 않고 충분히 사용해 볼 수 있습니다. (참고: Usage limits, billing, and administration)
참고: Introduction to GitHub Actions
레포지토리에 추가할 수 있는 자동화된 절차가 workflow
입니다. workflow
는 하나 이상의 job
으로 구성되며 event
에 의해 scheduled 나 트리거 될 수 있습니다. 프로젝트를 build, test, package, release, deploy 하는데 사용할 수 있습니다.
코드 변경 사항 push , issue 또는 pull reqeust 생성과 같은 event
발생 시 workflow
를 트리거합니다. Events that trigger workflows 에서 전체 event
목록을 확인해 볼 수 있습니다.
동일한 runner
에서 실행되는 step
들의 집합입니다. 기본적으로 workflow
는 여러 job
을 병렬로 실행합니다.
job
간에 종속성을 부여해 job
들이 순차적으로 실행되도록 workflow
를 구성할 수도 있습니다. 예를 들어, 빌드 job
이 성공적으로 완료되면 테스트 job
을 수행하도록 구성할 수 있습니다. 이 경우 빌드 job
이 실패하면 테스트 job
은 실행되지 않습니다.
step
은 commands 를 실행할 수 있는 개별 task 입니다. 동일한 job
내 step
들은 동일한 runner 에서 실행되므로 action
간에 데이터를 공유할 수 있습니다.
action
은 job
생성 시 step
으로 결합되는 독립적인 command 로 workflow
에서 가장 작은 building block 단위입니다. 사용자 action
을 만들거나 GitHub 커뮤니티에서 만든 action
을 사용할 수 있습니다. workflow
내에서 action
를 사용하고자 한다면 반드시 step
내에 포함하여야합니다.
runner
는 GitHub Actions runner 앱이 설치된 서버입니다. GitHub에서 호스팅하는 runner
를 사용하거나 직접 호스팅할 수 있습니다.
Github Actions 는 YAML 로 작성합니다. 해당 파일은 저장소 내 .github/workflow 경로에 저장합니다.
YAML 은 XML, JSON 처럼 소프트웨어 간 데이터 전달 목적으로 약속된 포맷, 양식입니다. XML, JSON 에 비해 사람이 더 읽기 쉽게 만들어져있습니다. 설정 파일로 많이 사용됩니다.
workflow
syntax 는 Workflow syntax for GitHub Actions 문서를 참고합니다.
특정 브랜치에 푸시가 되면 자동으로 프로젝트를 build 해 S3 bucket 에 deploy 하는 예제 (CICD.yaml) 를 작성해보았습니다.
name: CICD
on:
push:
branches:
- main
# ...
paths-ignore:
- "README.md"
jobs:
integration:
# ...
deploy:
if: github.event_name == 'push'
name: deploy
runs-on: ubuntu-latest
needs: integration
steps:
- uses: actions/checkout@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
# ...
- name: Install dependencies
run: yarn install
- name: Run build
run: yarn build
- name: Create bucket
# ...
- name: Allow public read
# ...
# ...
YAML 이 indent 기반이므로 예상치못한 indent 로 action 이 실패할 수 있어 주의해야합니다. 🥲
Context and expression syntax for GitHub Actions 를 참고하여 더 세밀한 workflow
를 작성해볼 수 있습니다.