CI/CD (Continuous Integraion/Continuous Delivery)는 지속적 통합/지속적 배포를 말하는 것으로 애플리케이션 개발 단계를 자동화하여 애플리케이션을 더욱 짧은 주기로 고객에게 제공하는 방법이다.
CI/CD는 새로운 코드 통합으로 인해 개발 및 운영팀에 발생하는 문제(일명 "통합 지옥")를 해결하기 위한 솔루션이다. (redhat 참고)
보통 하나의 애플리케이션을 만들 때, 한 번에 끝나지 않는다. 불규칙적으로 생기는 버그와 수정 사항들, 그리고 기능 추가 등 배포를 해도 끊임없이 발생하는 문제점들을 고치기 위해 여러 번 다시 배포를 해야 하는 경우가 생긴다.
만약 이미 배포한 애플리케이션에 수정 사항이 생겨 코드를 수정했다면 그 수정 사항이 해당 애플리케이션에 바로 반영되지 않는다. 이를 위해 '통합' 과정은 필수지만, 이 '통합' 과정은 꽤나 어렵고 복잡하다. 그래서 지속적으로 통합하고 배포해주는 자동화 서비스들이 많이 생겨났다. (Jenkins, Github Actions, Travis CI 등)
현재 리액트로 만든 프로젝트 중 하나를 Github Pages로 배포를 했기 때문에 Github Actions로 CI/CD 자동화를 구축해보려 한다. 리액트 프로젝트를 Github Pages로 배포하는 과정은 이 포스트📄에서 확인하길 바란다.
Github Actions는 빌드, 테스트, 배포 파이프라인을 자동화해줄 수 있는 CI/CD 플랫폼이다. Github 저장소에서 매 pull request에 대한 빌드와 테스트 workflows를 생성하거나, 병합된 pull request를 배포해 줄 수 있다.
Github Actions의 구성 요소에는 Workflows, Events, Jobs, Actions, Runners가 있다. 각각에 대해서 간단하게 살펴보자. 자세한 내용은 Github Actions Docs에서 확인할 수 있다.
.github/workflows
디렉토리에 정의되며, 하나의 저장소는 각각 다른 일들을 수행할 수 있는 여러 개의 워크플로우들을 가질 수 있다. Github token은 workflow에서 사용하기 위해 Github가 자동으로 생성한 것으로 워크플로우 작업 중 인증하는데 사용한다. 자세한 내용은 Github Docs에서 확인할 수 있다.
Github에서 오른쪽 상단에 자신의 프로필을 누르고 settings
> 왼쪽 탭 제일 아래에 있는 Devloper settings
> 왼쪽 탭의 Personal access tokens
> Tokens(classic)
으로 들어간다.
이 곳에서 개인 토큰을 생성할 수 있는데 여기서 Generate new token (classic)
을 누른다.
그러면 이러한 페이지가 뜨는데 'Expiration' 만료 기한을 정하고 workflow
를 선택한 후 하단의 Generate token
버튼을 누르면 개인 토큰이 생성된다. 이 과정에서 토큰을 복사해두지 않으면 다시 확인할 수 없기 때문에 꼭 복사해둔다.
토큰을 복사했으면 프로젝트의 레포지터리의 Settings
탭 > 왼쪽 탭의 Secrets and variables
> Actions
로 들어간다. 그리고 New repository secret
을 클릭한다.
그리고 Name
에 이름을 입력해주고 Secret
에 복사해 둔 토큰을 복사한 후 Add secret
을 클릭하면 workflow에서 사용할 수 있는 토큰 설정이 완료된다.
자동화해줄 프로젝트의 레포지터리에 들어가면 Actions
탭이 있다. Actions
탭에서 workflow를 생성할 수 있다.
여기서 'set up a workflow yourself'를 클릭하거나 아래의 'simple workflow'를 클릭하면 되는데, 'simple workflow'를 클릭하는 것을 추천한다. 'simple workflow'에는 이미 최소한의 구조가 갖춰져 있기 때문에 조금 더 쉽게 워크플로우를 생성할 수 있다.
Github pages로 배포하지 않았더라도 다양한 워크플로우가 있으므로 잘 선택해 사용하면 된다.
프로젝트를 이미 배포했다면 배포 전 화면과는 다르게 되어 있을 것이다. 여기서 왼쪽 탭 상단에 New workflow
버튼을 클릭해 준다.
그러면 여러 워크플로우를 볼 수 있는데, 나는 간단한 워크플로우를 만들 것이기 때문에 검색 창에 'simple workflow'를 쳐서 해당 워크플로우를 선택했다.
'simple workflow'를 선택하면 아래와 같은 파일이 나온다. 어떤 일을 하는지 하나씩 살펴보자.
name: CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run a one-line script
run: echo Hello, world!
- name: Run a multi-line script
run: |
echo Add other actions to build,
echo test, and deploy your project.
name: CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run a one-line script
run: echo Hello, world!
- name: Run a multi-line script
run: |
echo Add other actions to build,
echo test, and deploy your project.
Github Pages를 Github Actions로 배포를 자동화하기 위해서 설정해야 할 workflow는 아래와 같다.
name: Deployment
on:
push:
# 'main' 브랜치에 푸시할때마다 워크플로우 트리거
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
# GITHUB_TOKEN을 사용하는 작업 내의 액세스를 추가하거나 제거
permissions:
# 작업이 릴리스를 만들 수 있도록 허용
contents: write
# 동일한 동시성 그룹을 사용하는 단일 작업 또는 워크플로우만 한 번에 실행
concurrency:
# 여러 워크플로우가 있는 경우 다른 워크플로우의 작업이 취소되지 않도록 동시성 그룹을 빌드
group: ${{ github.workflow }}-${{ github.ref }}
steps:
- uses: actions/checkout@v3
# node.js 사용
- uses: actions/setup-node@v3
with:
node-version: 18
# npm install 보다 빠른 npm ci로 빌드 및 테스트
- run: npm ci
- run: npm run build
- uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
# 배포할 디렉토리 이름 (꼭 확인!)
publish_dir: ./build
이렇게 워크플로우 파일 설정이 완료 후 커밋하면 자동으로 배포가 시작된다! 🙌
실제로 프로젝트를 구현 후 deploy 과정에서 계속 에러가 발생했다. 에러 내용을 보니 Run npm ci
부분에서 발생했다.
이는 프로젝트를 빌드할 때 yarn
만을 이용해서 생긴 문제였다. yarn
으로 프로젝트를 빌드하면 package.json
파일만 생긴다. Run npm ci
구문을 실행하기 위해서는 package-lock.json
파일이 필요하기 때문에 배포할 프로젝트에서 npm install
을 해주면 된다.
출처
🔗 https://www.redhat.com/ko/topics/devops/what-is-ci-cd?cicd=32h281b
🔗 https://docs.github.com/ko/actions/learn-github-actions/understanding-github-actions
🔗 https://docs.github.com/en/actions/security-guides/automatic-token-authentication