회사에서 다음의 이슈를 할당받았다.
https://github.com/lablup/backend.ai/issues/319
이슈를 진행하기 위해선 Github Action에 대한 공부가 필요했다.
따라서 이 글에 공식 문서를 보며 공부한 내용을 정리해본다.
참고: https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions
공식 문서에 나온 Github Action에 대한 설명을 번역하면 아래와 같다.
GitHub Actions는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 지속적인 통합 및 지속적인 배포(CI/CD) 플랫폼입니다. 리포지토리에 대한 모든 풀 요청을 빌드 및 테스트하는 워크플로를 생성하거나 병합된 풀 요청을 프로덕션으로 배포할 수 있습니다.
Runner는 workflow를 실행하는 서버이고, workflow는 하나 이상의 job으로 구성된다. event가 발생했을 때 workflow가 실행된다.
Workflow는 하나 이상의 job을 실행하는 자동화된 프로세스이다. .github/workflows
폴더 안에 있는 yaml파일에 의해 정의된다.
Push, Pull request 만들기, 이슈 열기와 같이 저장소에서 일어나는 특정 활동을 Event라고 한다. Event가 일어나면 Workflow가 실행된다. 어떤 Event가 일어났을 때 workflow를 실행시킬 것인지 지정할 수 있다.
동일한 runner에서 실행되는 단계의 집합. 각 단계는 순서대로 실행된다. 같은 runner에서 실행되기 때문에 이전 단계의 결과를 다음 단계로 공유할 수 있다. job은 다른 job에 종속적이지 않으며, 병렬로 실행된다.
복잡하지만 자주 반복되는 작업을 수행하기 위한 custom application이다. Job의 각 단계에서는 스크립트를 실행하거나 액션을 수행한다. action은 직접 만들 수도 있고, Github Marketplace에서 찾아서 사용할 수도 있다.
Marketplace에는 다양한 action들이 있는데, 그 중 Cache를 선택했을 때의 화면은 아래와 같다. actions/cache@v2
action을 사용하려면 코드 부분을 복사해서 사용하면 된다.
runner는 workflow를 실행하는 서버이다. 각각의 runner는 한번에 하나의 job만 실행할 수 있다. Github는 worklow를 실행할 수 있는 Ubuntu Linux, Microsoft Windows, macOS runner을 제공한다. 각 workflow는 새로 프로비저닝된 가상 시스템에서 실행된다.
* 프로비저닝: 서버 프로비저닝이란, 사용될 서버를 설정하는 프로세스입니다. 서버 프로비저닝은 데이터센터에 물리적 하드웨어 설치, 소프트웨어 설치 및 설정, 운영 체제 및 애플리케이션 포함, 미들웨어와 네트워크 및 스토리지 연결로 이루어집니다.
참고: https://www.redhat.com/ko/topics/automation/what-is-provisioning
1) github/github-action 이라는 새 브랜치 만들기
2) repository안에 .github/workflows 폴더 만들기
3) .github/workflows 폴더 안에 github-actions-demo.yml 파일 만들기
4) github-actions-demo.yml 파일 안에 아래의 내용 붙여넣기
name: GitHub Actions Demo
on: [push]
jobs:
Explore-GitHub-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
- run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
- run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
- name: Check out repository code
uses: actions/checkout@v2
- run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- name: List files in the repository
run: |
ls ${{ github.workspace }}
- run: echo "🍏 This job's status is ${{ job.status }}."
test:
runs-on: ubuntu-latest
steps:
- name: Install dependencies
run: |
echo "Installation Start!"
python -m pip install -U pip setuptools
echo "Completion 😃"
5) commit 하고 push 하기
위의 예시를 살펴보면, Github Actions Demo
workflow가 Explore-Github-Actions
와 test
2개의 job으로 구성되어있다.
아래에서 코드를 조금 더 자세하게 살펴보도록 한다.
코드 | 설명 |
---|---|
name: GitHub Actions Demo | 선택항목. Github Action tab에 표시되는 workflow의 이름. |
on: [push] | workflow를 trigger하는 이벤트 지정. 이 예시에서는 push를 하면 workflow가 실행된다. |
jobs: | 모든 job을 그룹화한다. |
Explore-GitHub-Actions: | job의 이름. 이 이름 아래에 정의되어 있는 child key들은 job의 속성을 정의한다. |
runs-on: ubuntu-latest | job의 속성 중 하나. job을 실행할 runner를 설정한다. |
steps: | job안에서 일어나는 모든 단계를 그룹화한다. |
uses: actions/checkout@v2 | uses 키워드는 이 단계에서 actions/checkout 의 v2 action을 실행하도록 지정한다. 이것은 repository를 runner로 체크아웃하는 동작으로, 사용자가 사용자의 코드에 대해 스크립트 또는 기타 작업(예: 빌드 및 테스트 도구)을 실행할 수 있게 한다. 워크플로가 리포지토리 코드에 대해 실행될 때마다 체크아웃 작업을 사용해야 한다. |
run: | runner안에서 실행할 명령어를 정의한다. |
한 번에 여러 명령어들을 수행하고 싶을 땐, run 뒤에 | 이 기호를 붙여 사용한다. YAML 파일에서 multi-line string을 표현하기 위한 문법이다.
1) github에서 action 탭으로 이동하기
2) 확인하고 싶은 workflow 선택하기
왼쪽 workflows 사이드바를 보면, 위에서 정의했던 workflow 이름을 확인할 수 있다. 그리고 오른쪽에서는 그 workflow를 수행한 기록이 나열되어 있다. 그 중 가장 위쪽 항목을 선택해보았다.
3) 왼쪽의 Jobs 사이드바에서 job을 선택하여 자세한 결과 보기
왼쪽 사이드바에는 workflow에서 실행되는 job의 목록을 확인할 수 있다. 그리고 job을 선택하면, 각 단계가 어떻게 진행됐는지 보여주는 로그를 확인할 수 있다.
https://docs.github.com/en/actions/quickstart
https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions