workflow_call Composite action environments repository_dispatch Metrics ㅇㅇ GitHub Actions에는 수많은 기능이 있지만 이번 발표에서는 워크플로우를 연결하는 기능을 모아봤습니다. 이름도 비슷하고 기능도 비슷하면서 약간의 차이도 있어서 어떤 상황에서 어떤 기능을 써야할지 정리해보는 시간이면 좋겠습니다.
build: if: ${{ github.event.workflow_run.conclusion >= ‘success’ }} workflow_ run ㅇㅇ completed는 완료를 의미하고로 성공이든, 실패든 Report 워크플로우는 실행됩니다. 보통 성공이냐 실패냐 따라 다르게 동작하고 싶을 것인데 이는 job에서 if 조건으로 검사해야 합니다. 그래서 워크플로우는 무조건 실행되고 실행된 이후 조건이 안맞으면 job 실행을 건너뛰는
생략 call-lint: uses: ./.github/workflows/lint.yaml@main workflow_ call Reusable Caller Workflow ㅇㅇ 재사용가능한 워크플로우는 사용하는 워크플로우(Caller 워크플로우)에서는 job에서 uses를 써서 다른 워크플로우 파일을 지정할 수 있습니다.
secrets: token: jobs: lint: steps: - run: | echo ${{ inputs.name }} echo ${{ secrets.token }} workflow_ call Reusable Reusable Workflow 입력값과 시크릿 전달 ㅇㅇ 하드코딩된 워크플로우를 사용만 하는게 아니라 다양하게 사용하려면 Caller에서 제어가 가능해야 하므로 받을 inputs와 secret을 지정할 수 있습니다. 이렇게 넘겨받은 값은 jobs에서 사용할 수 있습니다.
생략 call-lint: uses: ./.github/w…s/lint.yaml@main with: name: outsider secrets: token: ${{ secrets.TOKEN }} workflow_ call Reusable Caller Workflow ㅇㅇ 시크릿의 경우 항상 Caller쪽에서 넘겨야 합니다. 다른 저장소의 Reusable 워크플로우를 쓰는 경우 두 저장소에 모두 시크릿을 설정할 수 있는데 아마도 보안을 위해서 정책상 Reusable 워크플로우가 있는 저장소의 시크릿을 사용할 수 있는 기능은 존재하지 않습니다.
runs: using: “composite” steps: - run: echo Hello ${{ inputs.name }} shell: bash - id: export run: echo “result=true” >> $GITHUB_OUTPUT shell: bash Composite action Reusable Reusable Workflow /action.yml /action.yaml ㅇㅇ workflow_call이 사용하고 있는 워크플로우를 다른 곳에서도 사용하게 하는 기능이라면 Composite action을 재사용되는 것만을 목적으로 한 액션입니다. 그래서 문법 자체가 다릅니다. 일단 저장소가 별도로 있어야 하고 루트에 action.yml 파일이 있어야 합니다.
gh api \ - /repos/outsideris/demo/dispatches \ -f event_type=’trigger’ env: GITHUB_TOKEN: ${{ secrets.PAT }} ㅇㅇ 여기서는 gh CLI를 사용했는데 GitHub에 API로 dispatches 요청을 보낸 것입니다. 이벤트 타입을 trigger로 지정했으므로 해당 저장소의 워크플로우가 실행되고 권한이 필요하므로 토큰을 사용했습니다. 당연히 외부 시스템에서 웹훅을 보내도 똑같이 동작합니다.
run: | echo \ ${{ github.event.client_payload.message }} repository_ dispatch ㅇㅇ HTTP 웹훅이므로 이벤트 타입뿐 아니라 요청시 다양한 페이로드를 보낼 수 있고 워크플로우에서는 이 값에 따라 원하는 동작을 할 수 있습니다.