▶GitHub Action이란?
GitHub Actions는 빌드, 테스트 및 배포 파이프라인을 자동화 할 수 있는 CI/CD 플랫폼이다.
GitHub Repository가 있다면 GitHub Action을 사용하여 workflow를 구성할 수 있다.
GitHub Actions는 단순한 DevOps를 넘어 Repository에서 다른 event가 발생할 때 workflow를 실행할 수 있도록 한다.
▶ GitHub Action 구성요소
▷ Workflows
- Workflows는 GitHub Actions의 기본 구성 단위이다.
- 일반적으로 “.github/workflows/[이름].yml” 파일에 정의된다.
- Workflows는 하나 이상의 작업을 포함할 수 있으며 Repository에서는 push 또는 pull request와 같은 이벤트에 의해 트리거 된다.
▷ Events
- Event는 Workflow를 시작하는 트리거이다.
- 일반적인 이벤트에는 push, pull_request 및 일정이 포함된다.
- 특정 요구사항에 따라 Workflow를 트리거하는 사용자 지정 이벤트를 만들 수도 있다.
▷ Jobs
- Jobs은 Workflow 내에서 실행되는 개별 작업이다.
- Jobs은 여러 Step으로 구성되며, 가상 환경의 인스턴스에서 실행된다.
- Jobs은 종속성에 따라 병렬 또는 순차적으로 실행될 수 있다.
▷ Steps
- Step은 task들의 집합으로 쉘 명령을 실행하거나 action을 실행할 수 있다.
▷ Actions
- workflow의 가장 작은 블럭으로 job을 만들기 위해 step들을 연결할 수 있다.
- 재사용이 가능한 컴포넌트로, 반복적인 코드의 양을 줄일 수 있고 Git Repository를 가져오거나 클라우드 공급자에게 인증을 설정할 수도 있다.
- 또한 개인적으로 만든 action을 작성할 수 있고 GitHub Marketplace에 있는 공용 action을 사용할 수도 있다.
▷ Runner
- Runner는 Workflow가 트리거 될 때 실행하는 서버이다.
- 각 Runner는 한번에 한개의 Job을 실행할 수 있다.
- GitHub에서 호스팅해주는 GitHub-hosted runner와 직접 호스팅하는 Self_hosted runner로 나뉜다.
- GitHub-hosted runner는 Azure의 Standard_DS2_v2로 vCPU 2, 메모리 7GB, 임시 스토리지 14GB이다.
▶ Workflow 정의하기
Workflow는 하나 이상의 작업을 실행하는 구성 가능한 자동화된 프로세스이다.
GitHub Repository에서 .github/workflows 폴더 안에 .yml 파일을 생성하면 그 yml파일에 따라서 GitHub Action이 생성된다.
여기 set up a workflow yourself 누르면 만들 수 있다.
▷ yml파일 예시
Git의 프로필 README.md 파일을 자동으로 업데이트 해주는 yml파일을 가져왔다.
# This is a basic workflow to help you get started with Actions
name: Readme Update
# Controls when the workflow will run
on:
# 2시간에 한번씩 아래 스크립트를 실행한다.
schedule:
- cron: "0 */2 * * *"
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 21
- name: Install dependencies
run: npm ci
- name: Update README
run: npm start
- name: Commit README
run: |
git add .
git config --local user.email "kjm021221@icloud.com"
git config --local user.name "wlaud2000"
git commit -m "Update README.md"
git push
위에서 부터
- name : Workflow의 이름을 지정
- on
on:
# 2시간에 한번씩 아래 스크립트를 실행한다.
schedule:
- cron: "0 */2 * * *"
- 어떤 조건에 Workflow를 Trigger 시킬지 Event에 대해 작성하는 부분
- push, pull_request, schedule을 사용 할 수 있다.
- jobs
jobs:
# This workflow contains a single job called "build"
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 21
- name: Install dependencies
run: npm ci
- name: Update README
run: npm start
- name: Commit README
run: |
git add .
git config --local user.email "kjm021221@icloud.com"
git config --local user.name "wlaud2000"
git commit -m "Update README.md"
git push
- Workflow에서 실행되는 모든 job들을 그룹화한다.
- Workflow는 다양한 Job으로 구성된다.
- 여러 Job이 있을 경우, 병렬실행이 Default이다.
- build
- build라는 이름의 job생성.
- 위 yml파일에서는 build 하위에 1개의 step이 존재하는 구조이다.
- runs-on
- 어떤 OS에서 실행될지 지정하는 곳
- 위 파일에서는 ubuntu 최신 버전에서 실행되도록 설정
- steps
- build 작업에서 실행되는 모든 steps를 그룹화.
- 이 섹션 하위에 중첩된 각 항목은 별도의 작업 이거나 쉘 스크립트이다.
- uses
- uses키워드는 actions/checkout@/v3를 실행하도록 지정한다.
- 이것은 내 repository를 runner에서 checkout하여 스크립트 또는 빌드 및 테스트 도구를 실행할 수 있도록 하는 작업이다.
- repository의 코드에 대해 workflow가 실행될 때마다 checkout작업을 사용해야 한다.
- name
- 해당 step의 이름을 명시한다.
- run
- run 키워드는 runner에서 command를 실행하도록 지시한다.
- 여기에는 환경변수를 설정할 수도 있다.
▶ Workflow 관리하기
▷민감 정보 저장하고 사용하기
민감한 정보를 사용해야 된다면
Github > Settings > secrets 에 저장하여 환경변수로 사용할 수 있다.
jobs:
example-job:
runs-on: unbuntu-latest
steps:
- name: test secret key
env:
secret_key: ${{ secrets.SUPERSECRET }}
run: |
~~~ "$secret_key"
▷ job의 의존관계 설정하기
job끼리 의존 관계를 설정해 순서를 정의할 수 있다.
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]
job1은 job2가 시작되기 전에 성공적으로 완료되어야하고, job3는 job1과 job2가 모두 완료될 떄까지 기다린다.
jobs:
setup:
runs-on: ubuntu-latest
steps:
- run: ./setup.sh
build:
needs: setup
runs-on: ubuntu-latest
steps:
- run: ./build.sh
test:
needs: build
runs-on: ubuntu-latest
steps:
- run: ./test.sh
stepup실행, 성공하면 build가 실행되고 성공하면 test가 실행된다.
▷ 여러 버전으로 실행하기
다양한 OS, 플랫폼, 언어의 여러 조합에서 테스트를 실행하려는 경우 빌드 매트릭스를 활용하면 된다.
빌드 옵션을 배열로 받는 strategy 키워드를 사용하면 된다.
jobs:
node-build:
runs-on: ubuntu-latest
strategy:
matrix:
# 다양한 버전의 Node.js를 이용하여 작업을 여러번 실행
node: [6, 8, 10]
steps:
- uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node }}
▷ 캐시 사용하기
GitHub의 runner는 각 작업에서 새로운 환경으로 실행되므로 작업들이 종속성을 재사용하는 경우 파일들을 캐싱하여 성능을 높일 수 있다.
캐시를 생성하면 해당 저장소의 모든 workflow에서 사용할 수 있다.
jobs:
example-job:
steps:
- name: Cache node modules
uses: actions/cache@v2
env:
cache-name: cache-node-modules
with:
# `~/.npm` 디렉토리를 캐시해 성능을 높임
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
▷ Artifact 저장하기
artifact를 사용하면 job끼리 데이터를 공유하거나 workflow가 끝나고 데이터를 저장할 수 있다.
workflow에서 생성된 파일을 upload하고, 다른 job에서 사용할 경우 업로드된 파일을 download해서 사용하는 방식이다.
name: Share data between jobs
on: [push]
jobs:
job_1:
name: Add 3 and 7
runs-on: ubuntu-latest
steps:
- shell: bash
run: |
expr 3 + 7 > math-homework.txt
- name: Upload math result for job 1
uses: actions/upload-artifact@v1
with:
name: homework
path: math-homework.txt
job_2:
name: Multiply by 9
needs: job_1
runs-on: windows-latest
steps:
- name: Download math result for job 1
uses: actions/download-artifact@v1
with:
name: homework
- shell: bash
run: |
value=`cat homework/math-homework.txt`
expr $value \* 9 > homework/math-homework.txt
- name: Upload math result for job 2
uses: actions/upload-artifact@v1
with:
name: homework
path: homework/math-homework.txt
job_3:
name: Display results
needs: job_2
runs-on: macOS-latest
steps:
- name: Download math result for job 2
uses: actions/download-artifact@v1
with:
name: homework
- name: Print the final result
shell: bash
run: |
value=`cat homework/math-homework.txt`
echo The result is $value
job_1에서 math-homework.txt 파일을 생성하고 업로드한다.
다음 job_2는 job_1에서 업로드한 파일을 다운로드 하고 연산한 후 다시 업로드 한다.
job_3는 job_2에서 업로드한 파일을 다운받아 출력하고 끝나는 예시이다.
▣Reference.
https://brownbears.tistory.com/597
https://zzsza.github.io/development/2020/06/06/github-action/
'배우기📖 > Git & GitHub' 카테고리의 다른 글
[Git&GitHub] ! [rejected] main -> main (non-fast-forward) 해결 방법 (2) | 2024.03.26 |
---|---|
[Git&GitHub] 브랜치 전략(GitHub flow, Git flow, Fork와 Pull Request)을 알아보자 (0) | 2024.03.04 |
[GitHub]원격의 브랜치 다루기 (0) | 2024.02.25 |
[GitHub]push, pull, pull 할 것이 있을 때 push를 하면? (1) | 2024.02.25 |
[GitHub]GitHub 원격 저장소 사용하기 (0) | 2024.02.20 |