Automation Actions
GitHub에서는 코드 변경, 풀 리퀘스트, 이슈 생성 등 다양한 이벤트에 반응하여 자동으로 작업을 수행할 수 있는 GitHub Actions 기능을 제공합니다. 이를 통해 CI/CD 파이프라인 구축, 코드 빌드/테스트/배포 자동화, 워크플로우 관리 등을 손쉽게 구현할 수 있습니다.
Workflow
GitHub Actions 워크플로우는 YAML 형식으로 정의되며, 저장소의 .github/workflows 디렉터리에 위치합니다. 워크플로우는 특정 이벤트에 반응하여 실행되며, 하나 이상의 작업으로 구성됩니다. 각 작업은 여러 단계로 이루어져 있습니다.
### on
`on` 옵션은 워크플로우를 트리거하는 이벤트를 지정합니다.
```yaml
on:
push:
branches:
- master # master 브랜치에 푸시될 때 실행
pull_request:
branches:
- master # master 브랜치로의 PR 생성/업데이트 시 실행
schedule:
- cron: "0 0 * * *" # 매일 자정에 실행
push: 특정 브랜치에 푸시될 때 실행pull_request: 풀 리퀘스트 생성/업데이트 시 실행schedule: 정기적으로 실행 (cron 형식)
jobs
jobs 옵션은 워크플로우 내에서 실행할 작업(Job)들을 정의하는 블록입니다. 각 Job은 독립적으로 실행되며, 병렬 또는 순차적으로 구성할 수 있습니다.
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3 # 코드 체크아웃
- name: Set up Node.js
uses: actions/setup-node@v3 # Node.js 설정
with:
node-version: "14"
- name: Install dependencies
run: npm install # 의존성 설치
- name: Run tests
run: npm test # 테스트 실행
runs-on
runs-on 옵션은 해당 Job이 실행될 러너 환경을 지정합니다. GitHub에서 제공하는 호스팅 러너를 사용할 수 있으며, 자체 호스팅 러너도 설정할 수 있습니다.
ubuntu-latest: 최신 우분투 환경windows-latest: 최신 윈도우 환경macos-latest: 최신 macOS 환경self-hosted: 자체 호스팅 러너 사용
steps
steps 옵션은 Job 내에서 실행할 개별 명령이나 액션 목록을 정의합니다. 각 Step은 순차적으로 실행되며, 외부 액션을 불러오거나 셸 명령어를 직접 실행할 수 있습니다.
steps:
- name: Checkout code
uses: actions/checkout@v3 # 외부 액션 사용
- name: Run a script
run: echo "Hello, World!" # 명령어 실행
uses: 외부 액션(공식/서드파티)을 불러와 실행run: 명령어 직접 실행
Options
GitHub Actions는 다양한 추가 옵션을 제공하여 세부 동작을 제어할 수 있습니다. 이로 인해 복잡한 워크플로우도 유연하게 구성할 수 있습니다.
name: Example Additional Options
on:
push:
branches: [ master ]
env:
GLOBAL_ENV: production # 전체 워크플로우에 적용되는 환경 변수
jobs:
test:
runs-on: ubuntu-latest
env:
JOB_ENV: testing # 해당 작업에만 적용되는 환경 변수
strategy:
matrix:
python-version: [3.8, 3.9, 3.10] # 여러 Python 버전에서 테스트
os: [ubuntu-latest, windows-latest] # 여러 OS 환경에서 테스트
timeout-minutes: 20 # 최대 실행 시간 20분
continue-on-error: true # 실패해도 계속 실행
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }} # matrix에서 지정한 Python 버전 사용
- name: Install dependencies
run: pip install -r requirements.txt
- name: Run tests (only on master branch)
if: github.ref == 'refs/heads/master' # master 브랜치에서만 실행
run: pytest
- name: Use environment variables # 환경 변수 사용
run: |
echo "Global Env: ${{ env.GLOBAL_ENV }}"
echo "Job Env: ${{ env.JOB_ENV }}"
- name: Use secret value
run: echo "Secret: ${{ secrets.MY_SECRET }}" # 시크릿 값 사용
deploy:
runs-on: ubuntu-latest
needs: test # test 작업 완료 후 실행
steps:
- name: Deploy
run: echo "Deploying..."
env: 환경 변수 지정secrets: 저장소에 등록된 시크릿 값 사용if: 조건부 실행timeout-minutes: 작업의 최대 실행 시간 제한continue-on-error: 실패해도 다음 작업 계속 실행needs: Job 간 실행 순서/의존성 지정strategy: 여러 환경/버전 반복 실행 (matrix활용)with: 액션에 인자/옵션 전달