참고
Github Action
NOTE
깃허브에서 제공하는 CI/CD 플랫폼으로, 빌드 테스트, 배포를 자동화시키는 파이프라인을 작성할 수 있다!
기본적인 작업흐름
GitHub Action의 모든 코드는 ./github/workflows에 작성된다.
기본 구성요소
NOTE
Workflow → Job → Step의 단계로 구성된다.
name: PART3 - CH1 - Basic Sample # 워크 플로우 이름
on: workflow_dispatch # 이벤트 트리거(workflow_dispatch => 사용자가 클릭을 통해 수동으로 실행)
jobs:
build: # job1
runs-on: ubuntu-latest # 우분투 환경에서 실행
# 3개의 step이 차례대로 실행된다.
steps:
- name: Checkout
# uses는 이미 만들어진 액션을 사용할때 사용
# {user}/{repo}@{ref}
uses: actions/checkout@v2
- name: Build project
run: |
echo "Build Project"
- name: Run tests
run: |
echo "Run Test"
deploy: # job 2
needs: build
runs-on: ubuntu-latest
steps:
- name: Deploy to production
run: |
echo "Deploying to production server"
YAML
복사
간단한 예시코드 (작업, 작업기(Runner), 스텝 단계로 구성된다.)
변수 사용방법
NOTE
name: PART3 - CH1 - Variables 1
on: workflow_dispatch
env:
fruit: Apple
jobs:
build_1:
runs-on: ubuntu-latest
env:
fruit: Orange
steps:
# build_1 전역 변수 사용
- name: Step 1
run: |
echo "Run Step 1, Make $fruit Juice!"
# Run Step 1, Make Orange Juice!
# 지역변수 사용
- name: Step 2
run: |
echo "Run Step 2, Make $fruit Juice!"
# Run Step 2, Make Strawberry Juice!
env:
fruit: Strawberry
build_2:
runs-on: ubuntu-latest
steps:
# workflow의 전역변수 사용
- name: Step 1
run: |
echo "Run Step 1, Make $fruit Juice!"
# Run Step 1, Make Apple Juice!
YAML
복사
기본적인 변수의 스코프는 일반적인 프로그래밍과 동일하다.
•
변수명에 대한 규칙
◦
이름에 영문, 숫자, 언더바(_)만 사용 가능
◦
공백 허용 X
◦
GITHUB_로 시작하지 않을 것
◦
숫자로 시작 불가, 대소문자 구분하지 않음
name: PART3 - CH1 - Variables 2
on: workflow_dispatch
env:
GITHUB_ACTOR: "RyanSong"
jobs:
build_1:
runs-on: ubuntu-latest
steps:
# GitHub Action에서 제공하는 기본 변수는 GITHUB로 시작한다.
# 만약 본인이 작성한 변수가 GITHUB로 시작한다면, env.으로 접근해야한다.
- name: Step 1
run: |
echo "Run Step 1, Say Hello to ${{ env.GITHUB_ACTOR }}"
echo "Hello to $GITHUB_ACTOR"
echo "Event : $GITHUB_EVENT_NAME"
- name: Step 2
run: |
echo "Job: $GITHUB_JOB"
echo "Run ID : $GITHUB_RUN_ID"
YAML
복사
깃허브에서 제공하는 기본변수 사용
Variable Name | Description |
GITHUB_ACTION | 현재 실행중인 Action ID |
GITHUB_ACTION_PATH | 현재 실행중인 Action 의 경로 (e.g., /home/runner/work/_actions/repo-owner/name-of-action-repo/v1) |
GITHUB_ACTOR | 워크플로우를 시작한 사람 또는 앱 이름 |
GITHUB_ACTOR_ID | 워크플로우를 시작한 사람 또는 앱 의 ID (e.g., 1234567) |
GITHUB_ENV | 러너 내 변수 설정 파일 경로 (e.g., /home/runner/work/_temp/_runner_file_commands/set_env_87406d6e-4979-4d42-98e1-3dab1f48b13a) |
GITHUB_EVENT_NAME | 워크플로우를 트리거한 이벤트 이름 (e.g., workflow_dispatch) |
GITHUB_JOB | 현재 실행중인 작업(Job) ID |
GITHUB_REPOSITORY | 레포지토리 소유자와 이름 |
GITHUB_WORKFLOW | 워크플로우 이름 |
RUNNER_ARCH | 실행기(Runner) 의 architecture (e.g., X86, X64, ARM, ARM64) |
RUNNER_NAME | 실행기(Runner) 이름 |
RUNNER_OS | 실행기(Runner) 의 운영체제 (e.g., Linux, Windows, macOS) |
name: PART3 - CH1 - Variables 3
on: workflow_dispatch
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Build project
run: |
echo "Build Project ${{ vars.PROJECT_NAME }}"
- name: Run tests
run: |
echo "Run Test ${{ vars.TEST_ENVIRONMENT }}"
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Deploy to production
run: |
echo "Deploying to production server ${{ vars.PRODUCTION_SERVER }}"
YAML
복사
vars.xxx ⇒ 깃허브 내에 설정한 변수를 불러온다.
Setting → Secrets and variables → Action에 설정된 변수를 불러온다.
•
개별 변수값은 조직 변수의 경우 1000개, 개인 레포지토리의 경우 500개이다.
작업(Job) 데이터 활용
NOTE
만약, 이전 단계의 결과를 다음 단계에서 사용하고 싶다면 어떻게 해야하는가?
Step 1의 결과를 Step 2로 받고싶다면?
name: PART3 - CH1 - Step Output 1
on: workflow_dispatch
jobs:
test-job:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- id: generate-random-id
name: Generate random string
run: echo "random_id=$RANDOM" >> "$GITHUB_OUTPUT"
# $RANDOM으로 생성된 임의의 숫자를 random_id라는 이름의 변수와 연결하고 추가
- id: build-project
name: Build project
run: |
echo "Random ID: ${{ steps.generate-random-id.outputs.random_id }}"
- id: run-tests
name: Run tests
run: |
echo "Random ID: ${{ steps.generate-random-id.outputs.random_id }}"
YAML
복사
$GITHUB_OUTPUT 파일에 변수를 추가하고 사용! → steps.[step_id].outputs.random_id 형식으로 참조
Step이 아닌 Job 단계의 데이터 전달도 가능한가?
•
실행기(Runner)가 다르기 때문에 기본적으로는 전달이 불가능하다.
•
Artifact와 같은 기능이나, 외부 스토리지를 사용해야 한다.
조건 및 연산자 활용
NOTE
name: PART3 - CH1 - Condition 1
on: workflow_dispatch
jobs:
build:
if: github.repository == 'scofe97/github-action-course'
runs-on: ubuntu-latest
steps:
- name: Step 1
run: |
echo "Run Step 1, Say Hello"
- name: Step 2
if: github.event_name == 'xxxxxxxx'
run: |
echo "Run Step 2, Say Hello"
YAML
복사
if문을 통한 일반적인 워크플로우 실행
Step2의 event_name은 workflow_dispatch이므로 스킵되어 실행
name: PART3 - CH1 - Function 1
on:
issues:
# 이슈 생성, 수정, 라벨에 관련된 이벤트가 발생했을 때
types: [opened, edited, labeled, unlabeled]
jobs:
auto-assignee:
runs-on: ubuntu-latest
permissions:
issues: write
# 만약 깃허브 이슈라벨의 이름에 bug가 존재한다면
if: ${{ contains(github.event.issue.labels.*.name, 'bug') }}
steps:
- name: Auto assign issue
uses: pozil/auto-assign-issue@v1
with:
assignees: ${{ vars.BUG_HUNTERS }}
YAML
복사
이슈 라벨에 따른 자동 이벤트
•
위에서 사용한 contains()함수 이외에도 다양한 함수가 존재한다.
함수명 | 설명 |
startsWith(searchString, searchValue) | searchString이 searchValue로 시작하는지 여부를 확인합니다. 시작한다면 true를 반환합니다. |
endsWith(searchString, searchValue) | searchString이 searchValue로 끝나는지 여부를 확인합니다. 끝난다면 true를 반환합니다. |
format(string, replaceValue0, replaceValue1, …) | 주어진 string 내에서 {0}, {1} 등의 형식으로 지정된 부분을 replaceValue0, replaceValue1 등으로 대체합니다. |
join(array, optionalSeparator) | array 내의 모든 요소를 optionalSeparator로 지정된 구분자를 사용하여 연결합니다. 구분자가 제공되지 않으면 기본적으로 쉼표(,)를 사용합니다. |
jobs:
build:
runs-on: ubuntu-latest.
steps:
# ...
- name: Job is succeeded
if: ${{ success() }} # 성공했을 때
if: ${{ failure() }} # 실패했을 때
if: ${{ canceled() }} # 취소했을 때
if: ${{ always() }} # 항상
YAML
복사
상태확인 함수