본문 바로가기
C.W.K.
Stream
Lesson 03 of 08 · published

GitHub Actions — workflow, job, step

~12 min · yaml, github-actions, ci

Level 0평문
0 XP0/64 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

CI 가 되는 YAML

GitHub Actions workflow 는 .github/workflows/<name>.yaml 에 살아. 언제 (event), 어디서 (runner), 무엇을 (step) 돌릴지를 선언하는 파일이야. 층은 세 개로 겹쳐. workflow 안에 jobs, jobs 안에 steps.

골격

  • on: — 무엇이 이걸 깨우는지 정해. push, pull_request, workflow_dispatch (손으로 실행), schedule (cron), workflow_call (다른 workflow 가 불러 씀).
  • jobs: — 이름 붙은 job 들이고 기본으로 동시에 돌아. job 마다 runs-on: 으로 runner 를 고르고.
  • steps: — job 안에서 순서대로 도는 목록이야. step 하나는 uses: (공개된 액션) 아니면 run: (shell 명령) 이야.

Secret 과 권한

Secret 은 리포 단위나 org 단위로 두고 ${{ secrets.NAME }} 로 불러 써. 기본 GITHUB_TOKEN 은 2023 년부터 contents 권한이 읽기 전용이야. tag 를 push 하거나 release 를 만드는 것처럼 쓰기가 필요하면 job 에 permissions: contents: write 를 명시해야 해.

'액션을 SHA 로 pin' 규칙: uses: actions/checkout@v4 는 v4 라는 움직이는 tag 를 따라가. 계정이 털린 maintainer 가 v4 아래에 악성 코드를 올리면 그게 그대로 CI 에서 돌아. 공급망을 지키려면 SHA 로 못 박아. uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 이렇게. 갱신은 Dependabot 이 알아서 해줘.

Code

최소 CI workflow·yaml
name: ci
on:
  push:
    branches: [main]
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.12'
      - run: pip install -e '.[dev]'
      - run: pytest -q
Matrix 빌드 (다른 param 으로 같은 job N 번)·yaml
jobs:
  test:
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest]
        python: ['3.10', '3.11', '3.12']
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python }}
      - run: pip install -e .
      - run: pytest
다른 job 에 의존 + artifact 업로드·yaml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npm run build
      - uses: actions/upload-artifact@v4
        with:
          name: dist
          path: dist/

  deploy:
    needs: build           # build 기다림
    runs-on: ubuntu-latest
    steps:
      - uses: actions/download-artifact@v4
        with:
          name: dist
          path: dist/
      - run: echo deploying...
        env:
          API_TOKEN: ${{ secrets.API_TOKEN }}

External links

Exercise

리포의 workflow 를 하나 골라 로컬에서 actionlint 를 돌려. 나오는 에러를 전부 고치고. 그 다음 uses: vendor/action@v3 중 적어도 하나를 SHA pin 으로 바꿔 (갱신은 Dependabot 이 맡아줘). 전후를 diff 해보면 공급망에 노출된 면이 그만큼 줄어든 게 보일 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.