GitHub/Workflow
< GitHub
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
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:
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+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"
repository_dispatch - Events that trigger workflows - GitHub Docs https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#repository_dispatch
---
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