코드트리라는 코딩테스트 학습 사이트가 있다.
이 사이트에는 GitHub 연동을 통해 문제풀이 기록을 Repository에 커밋해주는 기능이 있다.
이런 식으로 날짜별로 풀이한 문제를 기록으로 남길 수 있으며, README.md
도 작성해준다.
아쉽게도 Repository 메인화면에는 따로 README를 작성해주지 않기 때문에, 어떤 문제를 풀이했는지 확인하려면 직접 날짜폴더를 찾아서 들어가야하는 불편함이 있었다.
이를 해결하고 싶었고, 그러던 와중에 GitHub Actions을 사용하게 됐다.
GitHub Actions는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 CI/CD 플랫폼이다. Repository에 대한 모든 PR을 빌드 및 테스트하고, merge된 PR로 배포하는 것도 가능하다.
즉, Repository에서 발생하는 이벤트 기반으로 수행될 작업들을 명시해놓고 자동으로 동작하게 할 수 있다는 말이다.
이러한 이벤트들을 트리거하기 위해서는 workflow를 구성해야한다. workflow는 순차적 혹은 병렬로 실행될 수 있는 작업(Job)들을 포함하고 있다. 각 작업들은 자체 가상 머신 runner 혹은 컨테이너 내에서 실행되며, 내부적으로 단계(step)들로 나뉘어진다.
workflow는 .github/workflows
폴더내에 yaml
형식으로 작성된다.
한 Repository는 여러개의 workflow를 가질 수 있으며, 각각 다른 작업들이 수행된다.
name: Merge READMEs
# 이벤트 트리거
on:
push:
paths:
- '**/README.md' # 하위 디렉토리의 README.md 파일이 변경되었을 때 트리거
pull_request:
paths:
- '**/README.md' # PR 생성 시 트리거
# ...
앞서 간단하게 살펴봤던 것처럼 workflow는 특정 이벤트가 트리거 되었을 때 동작하게 구성할 수 있다.
위 예시에서는 README.md
파일이 변경되거나, PR요청이 발생했을 때, workflow가 동작하도록 구성했다.
이벤트 구성을 완료하고나면 작업(Jobs)을 구성해야한다.
# ...
jobs:
merge-readmes:
runs-on: ubuntu-latest
permissions: # GITHUB_TOKEN의 권한 명시
contents: write # 커밋 및 푸시를 허용
steps:
작업은 여러개가 존재할 수 있지만, 이번 체험(?)에서는 merge-readmes
라는 하나의 작업만 구성할 것이다.
가상머신(runner)에서 작업들이 동작할 것이기 때문에, 가상머신이 동작할 OS를 지정해줘야 한다.
workflow 결과물로 다시 커밋과 푸시을 해줘야하기 때문에
permissions
도 작성했다. (관련 문서)
다음으로는 작업 내에서 수행될 단계(step)들을 작성해야한다.
# ...
jobs:
merge-readmes:
runs-on: ubuntu-latest
# ...
steps:
# 1. 코드 체크아웃
- name: Check out the repository
uses: actions/checkout@v2
# 2. JDK 설치
- name: Set up JDK 17
uses: actions/setup-java@v4.6.0
with:
java-version: '17'
distribution: 'zulu' # JDK 배포판
# 3. 프로젝트 빌드 (Java 파일 컴파일)
- name: Compile Java program
run: |
mkdir -p out # output 디렉토리 생성
javac -d out ./.github/workflows/ReadmeMerge.java # 현재 디렉토리 내에 있는 Java 파일을 컴파일
# 4. Java 프로그램 실행
- name: Run Java program
run: |
java -cp out ReadmeMerge # out 디렉터리 내에 컴파일된 클래스를 실행
# 5. 변경된 파일 커밋 및 푸시
- name: Commit changes
run: |
git config user.name "{name}"
git config user.email "{email}"
git add README.md
git commit -m "README 병합"
git push
env:
GITHUB_TOKEN: ${{ secrets.MY_SECRET_TOKEN }}
앞선 작업(Job) 구성에서 runs-on
을 통해 runner가 우분투 환경에서 동작하게 구성했다.
따라서, 수행되는 각 단계는 우분투 가상머신을 설치했다고 가정하고 작성하면 된다.
예를들어, 본인은 Java파일을 컴파일해서 폴더내의 README.md
를 순회할 예정이다.
예시를 살펴보면 Java를 실행하기 위한 JDK를 설치한 것을 확인할 수 있다.( 작성한 Java파일 )
이후에는 Repository내의 특정 java파일을 컴파일 및 실행, 그리고 새롭게 생성된 파일을 커밋한다.
GitHub 페이지에서 직접 yaml을 작성하고 있다면 위 이미지처럼 사이드바를 통해 작성법을 참고할 수 있다.
# 5. 변경된 파일 커밋 및 푸시
- name: Commit changes
run: |
git config user.name "ddings73"
git config user.email "ddings7303@gmail.com"
git add README.md
git commit -m "README 병합"
git push
env:
GITHUB_TOKEN: ${{ secrets.MY_SECRET_TOKEN }}
작업 단계의 마지막 부분에는 GitHub으로 다시 commit하는 코드가 자리잡고 있다.
커밋을 위해서는 사용자 권한인증이 필요하므로, GITHUB_TOKEN에 Personal Access Token을 작성해줬다.
이때 사용하는 환경변수는
Repository - Settings - Secrets and variables
에서 작성할 수 있다.
최종적으로 조건에 맞는 이벤트를 발생시키면 Repository의 Actions 탭에서 workflow가 동작하는 것을 확인할 수 있다.
이 외에 실패한 workflow를 확인할 수 있으며, 매 workflow에 작성된 yaml파일과 debug 로그들도 확인이 가능하다.