프로젝트에서 자동화 파이프라인을 구성하는 도중 여러 환경에서 기능 테스트를 진행해보고, 프로덕션 환경에서 통합 테스트를 진행해 보기 위해 Git Actions을 학습했습니다.
파이프라인은 AWS 문서를 참고했습니다.
대표적인 빌드, 테스트 및 배포 파이프라인을 자동화를 도와주는 CI&CD 플랫폼이며 이벤트 기반으로 설정한 명령을 수행합니다.
Git Actions은 이벤트가 발생하면 트리거되도록 Workflow를 구성합니다. 전체적인 구조는 다음과 같습니다.
Git Actions의 구조로 이야기를 하자면 우리가 원하는 작업을 작성한 파일이 Workflow가 되고, Workflow를 어떤 시점에 실행할지 설정하는 부분은 Events, Workflow가 실행할 작업 단위를 Job이라 합니다.
Git Docs에 있는 그림으로 정리하면 다음과 같습니다.
그럼 깃 허브에서 제공해주는 템플릿 코드로 보면 쉽게 이해할 수 있습니다.
on
뒤에는 여러 개의 Event
를 설정할 수 있기 때문에 Events
라는 복수형을 사용하게 됩니다. Jobs
도 마찬가지로 여러 개의 Job
으로 구성되기 때문에 복수형을 사용하고 있습니다.
여러 개의 Event 구성
여러 개의 Event
를 구성하는 방법은 다음과 같습니다.
여러 개의 Job 구성
여러 개의 Job
을 구성하는 방법은 다음과 같습니다.
Workflow
에서 Events
를 이용해 원하는 상황에서 Jobs
를 실행할 수 있습니다. Event는 크게 github에서 제공하는 Event
와 특정 엔드포인트를 사용한 Event
가 있습니다.
Github에서 제공하는 Event는 정말 많기 때문에 일부분만 가져왔습니다.
해당 문서에서 모든 이벤트를 확인할 수 있습니다.
Event 등록방법은 다음과 같습니다.
on: push
두 개 이상을 등록하는 경우 다음과 같이 등록할 수있습니다.
on: [push, fork]
아래와 같이 특정 상황의 Event 를 지정할 수 있으니 이러한 부분을 잘 활용해 자동화를 구성할 수 있습니다.
on:
label:
types:
- created
특정 엔드포인트에서 사용하는 경우
특정 엔드포인트를 사용하여 GitHub 외부에서 발생하는 활동이 GitHub 작업 워크플로 또는 GitHub 앱 웹훅을 트리거할 수 있습니다.
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer <YOUR-TOKEN>"\
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/OWNER/REPO/dispatches \
-d '{"event_type":"on-demand-test","client_payload":{"unit":false,"integration":true}}'
저는 엔드포인트로 요청할 상황이 없기 때문에 읽기만 했습니다. 만약 필요하다면 문서를 읽어서 커스터마이징하면 됩니다.
Event를 트리거하는 방법은 다양합니다. 현재 상황에 맞게 Event를 작성하여 고도화된 자동화를 이룰 수 있으니 한 번쯤은 이해하고 넘어가는 걸 추천드립니다.
Job
Job은 작업 단위를 의미하며, 각자 실행할 환경을 가지고 있습니다. Job은 jobs.<job_id>이라는 고유 식별자를 부여하여 실행할 수 있습니다. (이 때 고유 식별자는 문자열입니다.)
jobs:
my_first_job:
name: My first job
my_second_job:
name: My second job
Job : 작업이 실행되기 전, 성공적으로 완료되어야 하는 작업 설정
작업이 실행되기 전에 성공적으로 완료되어야 하는 작업을 식별하려면 jobs.<job_id>.needs를 사용할 수 있습니다.
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]
각 작업은 jobs.<job_id>.runs-on
으로 지정된 러너 환경에서 실행됩니다. Git Actions에서 기본으로 제공하는 환경은 window
, ubuntu
, macos
이며 제공하는 버전을 선택해서 구성할 수 있습니다.
jobs:
runs-on: ubuntu-latest
Job의 Runner를 다양한 환경으로 구성하고 싶다면 다음과 같이 구성할 수 있습니다.
runs-on: [windows-latest, linux-latest, macos-latest]
추가로 matrix를 이용하면 실행하려는 구성도 다양하게 구성할 수 있는데, 아래 matrix에서 다뤄보겠습니다.
Job의 Runner를 원하는 환경에 구성하고 싶다면 runs-on
에 self-hosted
러너 라벨을 사용해 구성할 수 있습니다.
runs-on: self-hosted
self-hosted
라벨을 설정하는 방법은 repository의 settings 에 들어가서 runners 목록에서 관리할 수 있습니다.
Matrix를 활용한 운영 환경 설정
아래와 같이 구성한다면 세 개의 os 환경과 두 개의 자바 버전을 이용해 테스트를 진행할 수 있습니다.
jobs:
build:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
version: [11, 17]
fail-fast: false
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- name: 🛠 Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.version }}
distribution: 'corretto'
이렇게 구성한다면 총 6 번의 작업이 실행되게 됩니다.
Matrix를 활용한 구성 환경 설정
Git Actions docs에 따르면 구성 환경 설정도 변경하면서 작업을 실행할 수 있으니 활용할 수 있는 방안이 많습니다.
strategy:
matrix:
fruit: [apple, pear]
animal: [cat, dog]
include:
- color: green
- color: pink
animal: cat
위와 같은 matrix는 아래와 같은 조합을 완성할 수 있습니다.
{fruit: apple, animal: cat, color: pink, shape: circle}
{fruit: apple, animal: dog, color: green, shape: circle}
{fruit: pear, animal: cat, color: pink}
{fruit: pear, animal: dog, color: green}
{fruit: banana}
{fruit: banana, animal: cat}
많은 방법을 제공하지만, matrix를 많이 활용할 수록 가독성이 떨어진다는 단점도 보입니다.
jobs.<job_id>.if
조건문을 사용하여 조건이 충족되지 않으면 작업이 실행되지 않도록 할 수 있습니다. Git Actions에서 사용할 수 있는 방법은 env에서 설정한 환경과 같은지, github 이벤트와 같은지를 비교할 수 있습니다.
step 실행 여부를 env로 결정하는 방법
특정 환경에서만 실행할 수 있도록 설정할 수 있습니다.
env:
DAY_OF_WEEK: Monday
jobs:
greeting_job:
steps:
- name: "Say Hello Mona it's Monday"
if: ${{ env.DAY_OF_WEEK == 'Monday' }}
...
workflow 파일에서 설정한 env 말고도 secrets에 설정한 정보도 활용할 수 있으니 민감한 정보들은 secret에서 관리하면 됩니다.
job 실행 여부를 github event 로 결정하는 방법
아래와 같이 머지되는 상황에서만 작업을 실행할 수 있도록 설정할 수 있습니다.
build_and_containerization:
if: github.event.pull_request.merged == true
...
무조건 실행하고 싶은 경우
Git Actions는 상위 Job이 실패하면 작업이 중단되는 특성이 있는데, 만약 상위 Job 성공 여부와 관계없이 실행 시키고 싶다면 always() 를 사용할 수 있습니다.
jobs:
job1:
job2:
needs: job1
job3:
if: ${{ always() }}
needs: [job1, job2]
Git Actions를 학습하면서 장단점을 파악해 활용률을 높여보려 합니다.
Git Actions 장점
Git Actions 단점
Git Actions 보완할 방법
Git Actions가 제공하는 기능이 많아서 학습하는 시간이 오래 걸렸습니다. 다른 사용자들은 이 글을 읽고 쉽게 이해했으면 하는 마음으로 정리했습니다. 다음에는 Git Actions를 활용해 어떻게 테스트 파이프 라인을 구성했는지를 정리해보겠습니다.