Search

Github Actions 제대로 써보기

태그
CI/CD
팀 프로젝트
작성 상태
작성 완료
작성일
2024/01/05
참고 링크 2

GitHub Actions?

깃허브에서 제공하는 자동화 도구다. 깃허브를 사용하는 거의 모든 행동을 트리거로 하여, 특정 작업을 자동으로 수행 할 수 있도록 해준다.

활용 예시

예를 들어, 특정 레포지토리의 특정 브랜치에 커밋이 되면, 이를 빌드하고, 테스트를 수행한 뒤 자동으로 서버에 배포하는 작업을 할 수 있다.
좀 더 복잡한 예시로는, Pull Request가 발생하면, 이를 빌드하고 테스트를 수행한 뒤, 빌드나 테스트가 실패하면 pr에 이에 대한 comment를 추가하고, Pull Request를 닫은 뒤, 이를 외부 메신저를 통해 개발자에게 알림을 보내 줄 수 있다.

장점

1.
깃허브제어를 아주 쉽게 할 수 있다.
2.
문서가 잘 되어있다.
3.
수많은 오픈 소스를 활용해 쉽게 원하는 작업을 수행할 수 있다.

단점

1.
사용량 제한이 있다.
2.
다른 CI CD 도구에 비해 느리다.

GitHub Actions의 구조

하나의 저장소에 대한 여러개의 WorkFlow가 존재할 수 있다. 각각의 WorkFlow 는 여러개의 독립된 Job으로 구성된다. 각각의 Job은 여러개의 Step으로 구성된다.

Workflow

어떤 행위로 유발되는 작업의 흐름이다. 가장 추상화 된 개념이다.
.yml 파일로 작성한다.

name

WorkFlow를 구분하는 이름이다. 문자열로 표현한다.
name: Close PR when Build Fail
YAML
복사

on

WorkFlow를 실행시키는 레포지토리 조작 행위이다.
name: Close PR when Build Fail on: pull_request: types: [ opened ] branches: [ 'main' ]
YAML
복사
여러 이벤트를 지정할 수 있고, 당연히 여러 이벤트가 하나의 WorkFlow를 실행시키도록 할 수 있다. 위 코드는 main 브랜치를 대상으로 하는 Pull Request의 최초 open 시 WorkFlow를 실행하는 코드다.

Job

WorkFlow 에서 수행되는 하나의 작업이다. 여러개의 작업이 존재할 수 있고, 여러개의 작업은 기본적으로 병렬 수행된다.

runs-on

Job이 수행될 가상 머신을 설정한다. 리눅스, 윈도우, 맥OS 등으로 지정할 수 있다.
GitHub에서 제공하는 가상 머신을 사용할 수 있고, 직접 구축해서 사용할 수도 있다. 전자의 경우 간편하게 사용할 수 있고, 후자의 경우 더 많은 자원을 사용할 수 있다.
아래는 깃허브에서 제공하는 가상머신의 종류다.
name: Close PR when Build Fail on: pull_request: types: [ opened ] branches: [ 'main' ] jobs: build_and_test: runs-on: ubuntu-latest
YAML
복사
build_and_test 이라는 이름의 Job을 만들고, ubuntu-latest 환경인 가상머신에서 Job이 수행된다는 의미다.

permissions

Job이 GitHub의 여러 요소들을 사용하는 권한을 부여할 때 사용된다.
GitHub의 여러 요소들을 컨트롤하는 API는 GitHub Token을 요구한다. 이를 위해 GITHUB_TOKEN 이라는 컨텍스트가 기본으로 제공되는데, permissions 를 통해 토큰에 권한을 부여할 수 있다. 권한은 readwritenone 값 중 하나로 지정할 수 있고, 부여할 수 있는 권한의 종류는 다음과 같다.
name: Close PR when Build Fail on: pull_request: types: [ opened ] branches: [ 'main' ] jobs: build_and_test: runs-on: ubuntu-latest permissions: contents: read pull-requests: write issues: write
YAML
복사
위 코드는 깃허브 레퍼지토리를 읽을 권한을 주고, PR을 생성하고 코멘트를 다는 것을 허용하며, 이슈를 발행하거나 삭제하는 것을 허용하는 코드다.

Step

각 Job을 구성하는 여러개의 순차적인 명령이다. 쉘에서 커멘드 형태로 실행시킬 수도 있고, 오픈소스로 공개된 것을 사용할 수 있다.
각 Step 은 id 라는 속성을 통해 구분되고, 별도로 name 속성을 통해 이름을 가질 수 있다. “-” 를 이용해 각 스탭을 분리하여 표현한다.

uses

외부의 오픈소스를 사용할 때 사용한다.
마켓에 공개된 action을 사용할때 쓰는 속성이다. 별도의 설정 파일을 만들어야 할 수도 있다.
uses: actions/github-script@v6 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const pull_number = ${{ github.event.pull_request.number }} const updated_title = `[BUILD FAIL] ${{ github.event.pull_request.title }}` await github.rest.pulls.createReview({ owner: context.repo.owner, repo: context.repo.repo, pull_number: pull_number, body: '빌드에 실패했습니다.', event: 'REQUEST_CHANGES' }) await github.rest.pulls.update({ owner: context.repo.owner, repo: context.repo.repo, pull_number: pull_number, title: updated_title, state: 'closed' })
YAML
복사
위 코드는 github-script 라는 것을 사용하는 코드로 with 속성을 이용해 해당 스크립트에서 필요로 하는 내용을 설정할 수 있다. github-script 는 GitHub에서 제공하는 API를 JavaScript 문법을 이용해 좀 더 쉽게 사용할 수 있도록 해주는 action이다.

run

쉘 스크립트 명령을 사용할 수 있도록 하는 속성이다. 사용할 쉘 명령어를 작성하면 이것이 실행된다.
기본적으로 리눅스라면 bash, 윈도우라면 cmd로 설정되어있다. 별도의 속성을 통해 쉘의 종류를 바꿀 수 있다.
- name: Grant execute permission for gradlew run: chmod +x gradlew # gradlew 파일에 실행 권한을 부여한다. - name: Build with Gradle continue-on-error: true id: build_and_test run: ./gradlew clean build --stacktrace # gradlew 을 이용해 빌드작업을 수행한다.
YAML
복사

if

스탭의 실행 조건을 추가할 때 사용하는 속성이다.
예를 들어, 빌드가 실패할 경우 PR을 닫고, 디스코드에 메세지를 보내는 경우 PR을 닫는 스탭과 디스코드에 메세지를 보내는 스탭은 빌드 스탭이 실패한 경우만 수행되어야 한다. 이 처럼, 특정 스탭의 실행 여부가 경우에 따라 달라지는 경우 이 속성을 사용한다.
이때, 이후의 챕터에서 소개할 Github Actions Context 와 일반적인 표현식을 사용해 조건을 기술한다.
- name: Build with Gradle continue-on-error: true id: build_and_test run: ./gradlew clean build --stacktrace - name: If build fail continue-on-error: true # 이전 step이 실패한 경우에만 이 step을 실행시키는 syntax if: ${{ steps.build_and_test.outcome == 'failure'}} id: close_pr uses: actions/github-script@v6 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const pull_number = ${{ github.event.pull_request.number }} const updated_title = `[BUILD FAIL] ${{ github.event.pull_request.title }}` await github.rest.pulls.createReview({ owner: context.repo.owner, repo: context.repo.repo, pull_number: pull_number, body: '빌드에 실패했습니다.', event: 'REQUEST_CHANGES' }) await github.rest.pulls.update({ owner: context.repo.owner, repo: context.repo.repo, pull_number: pull_number, title: updated_title, state: 'closed' })
YAML
복사

Github Actions Context

컨텍스트는 WorkFlow 실행, 변수, 실행 환경, job, step 의 정보에 접근하는 방법이다.

github

WorkFlow 의 실행에 대한 정보를 다루는 컨텍스트다.
대상 레퍼지토리, WorkFlow를 트리거한 이벤트 등 다양한 것을 가져올 수 있다.

steps

각 step의 정보를 다루는 컨텍스트다.
스텝의 실행 결과 등을 가져올 수 있다.

secrets

깃허브에 공개되어선 안되는 파일이나, 비밀번호, 토큰 등을 위한 컨텍스트다.
Settings > Secrets and variables > Actions 에서 설정할 수 있다. 한번 설정하면 수정하거나 삭제할 수는 있지만, 확인할 수는 없다.