GitHub/Workflow: Difference between revisions
< GitHub
(2 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
== Starter Workflows == | |||
Quickstart for GitHub Actions - GitHub Docs | |||
https://docs.github.com/en/actions/quickstart | |||
actions/starter-workflows: Accelerating new GitHub Actions workflows | |||
https://github.com/actions/starter-workflows | |||
GitHub Marketplace - Actions | |||
https://github.com/marketplace?category=&query=&type=actions&verification= | |||
== Manual Run == | == Manual Run == | ||
Line 128: | Line 139: | ||
== Dynamic Jobs == | == Dynamic Jobs == | ||
<pre> | |||
{ "include": [ | |||
{"runson": ["CI", "MORE"], | |||
"task": "joe"}, | |||
{"runson": ["CI", "LESS"], | |||
"task": "bob"} | |||
] | |||
} | |||
</pre> | |||
<pre> | <pre> |
Revision as of 20:50, 12 April 2024
Starter Workflows
Quickstart for GitHub Actions - GitHub Docs https://docs.github.com/en/actions/quickstart
actions/starter-workflows: Accelerating new GitHub Actions workflows https://github.com/actions/starter-workflows
GitHub Marketplace - Actions https://github.com/marketplace?category=&query=&type=actions&verification=
Manual Run
manual.yaml:
name: Manual Run run-name: Test on: workflow_dispatch: inputs: LABEL: required: true type: string description: label jobs: run: runs-on: ${{ inputs.LABEL }} steps: - run: hostname
Basic Workflow
name: GitHub Actions Demo run-name: ${{ github.actor }} is testing out GitHub Actions 🚀 on: [push] jobs: Explore-GitHub-Actions: runs-on: ubuntu-latest steps: - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." - name: Check out repository code uses: actions/checkout@v3 - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." - run: echo "🖥️ The workflow is now ready to test your code on the runner." - name: List files in the repository run: | ls ${{ github.workspace }} - run: echo "🍏 This job's status is ${{ job.status }}."
ref: https://docs.github.com/en/actions/quickstart
Using Job Output
jobs: job1: runs-on: ubuntu-latest # Map a step output to a job output outputs: output1: ${{ steps.step1.outputs.test }} output2: ${{ steps.step2.outputs.test }} steps: - id: step1 run: echo "test=hello" >> "$GITHUB_OUTPUT" - id: step2 run: echo "test=world" >> "$GITHUB_OUTPUT" job2: runs-on: ubuntu-latest needs: job1 steps: - env: OUTPUT1: ${{needs.job1.outputs.output1}} OUTPUT2: ${{needs.job1.outputs.output2}} run: echo "$OUTPUT1 $OUTPUT2"
ref: Defining outputs for jobs - GitHub Enterprise Cloud Docs - https://docs.github.com/en/enterprise-cloud@latest/actions/using-jobs/defining-outputs-for-jobs
Dynamic Runs-on
Dynamic from Input:
name: Dynamic Labels run-name: Dynamic Labels on: workflow_dispatch: inputs: LABELS: required: false type: string jobs: run: # runs-on: ${{ fromJSON( '["CI"]' ) }} # This works # runs-on: ${{ fromJSON( '["CI", "MORE"]' ) }} # This works runs-on: ${{ fromJSON( inputs.LABELS ) }} # This works if formatted like: ["CI", "MORE"] # runs-on: ${{ inputs.LABELS }} # this works for single label # runs-on: [ CI, MORE ] # this works steps: - run: hostname
Dynamic from script:
name: Dynamic Script run-name: Test on: workflow_dispatch: inputs: Go: required: false type: string jobs: job1: runs-on: ubuntu-latest outputs: RUNS: ${{ steps.set-RUNS.outputs.RUNS }} steps: - id: set-RUNS run: echo "RUNS=[\"CI\",\"MORE\"]" >> $GITHUB_OUTPUT job2: needs: job1 runs-on: ${{fromJSON(needs.job1.outputs.RUNS)}} steps: - run: hostname
ref:
- How to Dynamically assign the runs-on value in the github actions - Stack Overflow - https://stackoverflow.com/questions/73241812/how-to-dynamically-assign-the-runs-on-value-in-the-github-actions
- Github Actions: How use strategy/matrix with script - Stack Overflow - https://stackoverflow.com/questions/59977364/github-actions-how-use-strategy-matrix-with-script
Dynamic Jobs
{ "include": [ {"runson": ["CI", "MORE"], "task": "joe"}, {"runson": ["CI", "LESS"], "task": "bob"} ] }
name: Dynamic Jobs run-name: Test on: workflow_dispatch: inputs: Go: required: false type: string jobs: generate: runs-on: ubuntu-latest outputs: MATRIX: ${{ steps.set-MATRIX.outputs.MATRIX }} steps: - id: set-MATRIX run: echo "MATRIX={\"include\":[{\"runson\":[\"CI\",\"MORE\"],\"task\":\"joe\"},{\"runson\":[\"CI\",\"LESS\"],\"task\":\"bob\"}]}" >> $GITHUB_OUTPUT jober: needs: generate runs-on: ${{ matrix.runson }} strategy: matrix: ${{fromJson(needs.generate.outputs.matrix)}} steps: - run: hostname - run: echo ${{ matrix.runson }} - run: echo ${{ matrix.task }}
Remotely Trigger Workflow - repository_dispatch
on: repository_dispatch:
---
on: repository_dispatch: types: [some_event_type]
curl -X POST https://api.github.com/repos/OWNER/REPO/dispatches -H "Authorization: Bearer ${GH_TOKEN}" -d '{"event_type":"some_event_type"}'
---
curl -X POST https://api.github.com/repos/ORG/REPO/dispatches -d '{"event_type":"some_event_type"}' # -d or --data, -X or --request # -H "Accept: application/vnd.github.v3+json" # -H "Accept: application/vnd.github+json" # You will most likely need to also pass along auth: (unless you are silly and on a publicly executable workflow?) # -H "Authorization: Bearer $GITHUB_TOKEN"
curl -L \ -X POST \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer <YOUR-TOKEN>" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/OWNER/REPO/dispatches \ -d '{"event_type":"on-demand-test","client_payload":{"unit":false,"integration":true}}'
---
if you want to trigger from some other branch: {...,'ref':'other_branch_or_ref'},...}
---
repository_dispatch - Events that trigger workflows - GitHub Docs https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#repository_dispatch
repository_dispatch - Repositories - GitHub Docs https://docs.github.com/rest/repos/repos#create-a-repository-dispatch-event
---
If you pass this payload through, you can limit the workflow, and access it in the workflow:
{ "event_type": "test_result", "client_payload": { "passed": false, "message": "Error: timeout" } }
workflow:
on: repository_dispatch: types: [test_result] jobs: run_if_failure: if: ${{ !github.event.client_payload.passed }} runs-on: ubuntu-latest steps: - env: MESSAGE: ${{ github.event.client_payload.message }} run: echo $MESSAGE