GitHub Actions는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 CI/CD 플랫폼입니다. 레포지토리에 대한 모든 풀 요청을 빌드 및 테스트하는 워크플로를 생성하거나 병합된 풀 요청을 프로덕션에 배포할 수 있습니다.
GitHub Actions는 단순한 DevOps를 넘어 리포지토리에서 다른 이벤트가 발생할 때 워크플로를 실행할 수 있도록 합니다. 예를 들어, 누군가가 저장소에 새 문제를 생성할 때마다 적절한 레이블을 자동으로 추가하는 워크플로를 실행할 수 있습니다.
-GitHub 홈페이지-
깃헙에서는 GitHub Actions를 위와 같이 설명하고 있다. 쉽게 얘기하면 깃헙에서 특정 이벤트가 발생했을 때 어떤 동작을 할지 설정해놔서 리액션을 자동화하는 서비스라고 생각하면 편할 것이다. 우리가 사용할 리소스를 순수 개발에 더 신경쓸 수 있게된다.
나는 주로 3가지의 설정을 많이 사용한다. 3가지 모두 Pull request를 날렸을 때의 액션이 일어난다. 린트 확인, 빌드 테스트, 배포이다. 이 세가지를 사용하여 CI/CD를 자동화하여 사용한다. GitHub Actions 파일들은 .github/workflows 폴더에서 관리해주면된다.
우선 전체 코드를 보여주고 한줄씩 설명하도록 하겠습니다.
name: Lint check
on: pull_request
jobs:
build-test:
name: Next Lint test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '16'
- run: npm i -g yarn
- run: yarn
- run: yarn lint
우선 첫 줄의 name
은 위크플로우의 이름이다. 위 값은 다른 워크플로우와 겹치지 않게 사용해야한다.
on
에서는 레포지토리의 어떤 이벤트를 감지할 것인지 설정해야한다. 위에서는 pull_request를 사용했지만 push를 사용하거나 특정 브랜치, 태그, path에서 작동하도록 설정이 가능하다.
그 다음은 jobs
에 관련된 설정이다. name에서 job의 이름을 설정해주고 runs-on에서 어떤 환경에서 사용할지 설정이 가능하다. steps에서는 이제 어떤 일을 해줄지에 대해서 설정을 할 수 있다. Github 마켓플레이스에 올라온 액션의 사용도 가능하고 shell script 실행도 가능하다. 누군가 만들어 놓은 액션을 사용할 때는 uses를 사용해야한다. 그리고 with를 사용하여 액션에 값을 전달할 수도있다. 위의 코드는 node-version이 16이라는 의미다. shell script를 실행할 때는 run 키워드를 사용하면된다. 우리는 npm i -g yarn, yarn, yarn lint 명령어를 실행 시켰다.
name: Build test
on: pull_request
jobs:
build-test:
name: Next build test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '14'
- run: npm i -g yarn
- run: yarn
- run: yarn build
위의 린트 확인 코드와 거의 동일하며 run에 yarn build 코드만 다르다.
GitHub Actions로 Vercel 배포도 자동화가 가능하다. 이 부분도 코드를 먼저 확인한 후 설명을 진행하겠다.
name: Deploy CI
on:
push:
branches: [main]
pull_request:
types: [opened, synchronize, reopened]
jobs:
deploy:
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, '[skip ci]')"
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Deploy to Vercel Action
uses: BetaHuhn/deploy-to-vercel-action@latest
with:
GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
Vercel 배포는 다른 액션들과는 다르게 push 옵션에 브랜치가 설정이 되어있다. main 브랜치에 푸시할 때만 진행된다. pull_request에서는 타입 설정이 되어있다. pull_request가 위의 세가지 타입일 때만 해당 액션이 진행될 것이다.
jobs에 if 키워드를 사용하여 커밑 메시지에 skip ci
가 포함되면 액션이 진행되지 않도록 설정되어 있다.
steps의 다른 키워드들은 이전에 봤지만 with 내부의 값들이 처음 보는 방식으로 값이 전달되고 있다. 위의 secret들이 어떻게 설정할 수 있고 위 값들은 어디서 가져와서 쓰는 것인지도 추가로 설명하겠다.
Secrets의 설정은 간단하다. 원하는 레포지토리의 Settings>Secrets>Actions로 들어가면 된다. 들어가면 우측 상단의 New repository secret
버튼을 눌러서 설정하면 된다.
GitHub Token은 레포지토리가 아닌 오른쪽 위 프로필에서 Settings로 들어가야 발급이 가능하다.
Settings>Developer settings>Personal access tokens에서 생성이 가능하다. 깃헙에 로그인이 되어있다면 이 링크로 접근이 가능할 것이다.
알맞은 페이지에 들어갔다면 우측 상단의 Generate new token
버튼을 눌러서 토큰을 생성하면된다. 토큰은 workflow 옵션 하나만 설정해주면 된다.
모든 설정 후 토큰을 만들면 토큰 값을 복사할 수 있게 나올 것이다. 해당 값을 복사하여 위의 GitHub Secrets에 들어가서 새 Secret을 만들면 된다.
이제는 Vercel token을 받으러 Vercel로 이동하여야한다.
Create
버튼을 눌러 토큰을 생성하고 SCOPE는 Full Account를 설정해주면 된다.마찬가지로 생성된 토큰의 값을 GitHub Secrets에 Secret으로 저장하면 된다.
이 두개는 한번에 받아올 수 있다. 이 두개는 vercel CLI를 사용해서 받아올 수 있다.
npm i -g vercel
vercel login
vercel
위의 과정이 끝나면 .vercel
폴더가 생긴다. 해당 폴더의 project.json
파일을 보면 orgId, projectId가 있다. 이 값도 GitHub Secrets에 Secret으로 저장하면 모든 설정은 끝난다.
위의 세가지를 풀 리퀘스트에서 자동화해주면 배포 시에 생길 문제를 자동으로 체크가 가능해지고 문제가 없다면 배포까지 자동화가 진행된다.
개발을 하다보면 자동화에 대해서 항상 생각하게된다. 개발하는 것 이외에 리소스를 사용하는 것이 너무 아깝기 때문이다. 혹시 저와 같은 생각을 하고 있다면 이 기회에 GitHub Actions를 사용하시는 것을 추천합니다. 그리고 오늘 소개해드린 세가지 말고도 GitHub에서 확인해보면 정말로 많은 workflow가 만들어져있으니 한번 보셨으면 좋겠습니다.