본문 바로가기
C.W.K.
Stream
Lesson 09 of 14 · published

작업 출력값

~9 min · outputs, jobs, communication

Level 0견습생
0 XP0/101 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

러너 경계를 넘는 출력값

단계 출력값은 작업 안에서만 흘러. 작업 사이(별도 러너)로 값을 전달하려면 작업 출력값을 선언해야 해. 패턴은 이렇게:

  1. 생산자 작업 안의 단계가 $GITHUB_OUTPUT에 값을 써.
  2. 생산자 작업의 outputs: 맵이 단계 출력값을 작업 출력값으로 노출해.
  3. 소비자 작업이 생산자를 needs:로 선언해.
  4. 소비자가 needs.<producer>.outputs.<name>로 값을 읽어.

흔한 형태

뭘 돌릴지 결정하는 setup 작업이 있고, 그다음 그 결정에 따라 분기하는 작업들이 있어. 예를 들어 '이건 릴리스냐 정상 CI냐?', '어느 플랫폼에 배포할까?' 같은 거지.

제약

  • 작업 출력값은 문자열만 돼. 구조화된 값이 필요하면 JSON을 쓰고 fromJSON으로 읽으면 돼.
  • 작업 출력값 하나당 최대 1 MB까지 쓸 수 있어.

Code

셋업 작업이 결정하고, 다운스트림 작업이 읽어·yaml
jobs:
  setup:
    runs-on: ubuntu-latest
    outputs:
      kind: ${{ steps.classify.outputs.kind }}
      python_versions: ${{ steps.classify.outputs.python_versions }}
    steps:
      - uses: actions/checkout@v4
      - id: classify
        run: |
          if [[ $GITHUB_REF == refs/tags/v* ]]; then
            echo 'kind=release' >> $GITHUB_OUTPUT
            echo 'python_versions=["3.11","3.12"]' >> $GITHUB_OUTPUT
          else
            echo 'kind=ci' >> $GITHUB_OUTPUT
            echo 'python_versions=["3.12"]' >> $GITHUB_OUTPUT
          fi

  test:
    needs: setup
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python: ${{ fromJSON(needs.setup.outputs.python_versions) }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with: { python-version: '${{ matrix.python }}' }
      - run: pytest -q

  release:
    needs: [setup, test]
    if: needs.setup.outputs.kind == 'release'
    runs-on: ubuntu-latest
    steps:
      - run: ./release.sh

External links

Exercise

워크플로에서 실행을 분류(CI / 릴리스 / 나이틀리)하고 그걸 작업 출력값으로 노출하는 셋업 작업을 추가해. 다운스트림 배포 작업 게이트에 사용해 봐. 다른 이벤트가 다른 경로를 만드는지도 확인해.

Progress

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

댓글 0

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

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