Initial action implemention #97
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
name: Integration Tests | |
on: | |
pull_request: | |
paths: | |
- "action.yaml" | |
- ".github/workflows/integration-tests.yaml" | |
jobs: | |
setup-simple: | |
name: Setup Simple | |
runs-on: ubuntu-latest | |
permissions: | |
actions: read | |
contents: read | |
strategy: | |
fail-fast: false | |
matrix: | |
index: | |
- 1 | |
- 2 | |
outputs: | |
results-json: ${{ steps.matrix-output.outputs.json }} | |
steps: | |
- uses: actions/checkout@v4 | |
# Slow down on job to ensure that this is the last run | |
- if: ${{ strategy.job-index == 0 }} | |
run: sleep 5 | |
# Keep `id` the same between `setup-simple` and `setup-complex` | |
# to ensure we can separate output per job. | |
- uses: ./ | |
id: matrix-output | |
with: | |
yaml: | | |
index: ${{ matrix.index }} | |
test-simple: | |
name: Test Simple | |
needs: setup-simple | |
runs-on: ubuntu-latest | |
steps: | |
- name: Output JSON | |
run: | | |
if [[ "${output_json}" != "${expected_json}" ]]; then | |
cat <<<"${output_json}" >"output" | |
cat <<<"${expected_json}" >"expected" | |
diff output expected | cat -te | |
exit 1 | |
fi | |
env: | |
output_json: ${{ needs.setup-simple.outputs.results-json }} | |
expected_json: |- | |
[ | |
{ | |
"index": 1 | |
}, | |
{ | |
"index": 2 | |
} | |
] | |
setup-complex: | |
name: Setup Complex | |
runs-on: ubuntu-latest | |
permissions: | |
actions: read | |
contents: read | |
strategy: | |
fail-fast: false | |
matrix: | |
build: | |
- name: App One | |
repo: user/app1 | |
- name: App Two | |
repo: user/app2 | |
version: | |
- "1.0" | |
- "2.0" | |
outputs: | |
results-json: ${{ steps.matrix-output.outputs.json }} | |
steps: | |
- uses: actions/checkout@v4 | |
- if: ${{ matrix.build.name == 'App Two' && matrix.build.repo == 'user/app2' && matrix.version == '2.0' }} | |
run: exit 1 | |
# Keep `id` the same between `setup-simple` and `setup-complex` | |
# to ensure we can separate output per job. | |
- uses: ./ | |
id: matrix-output | |
with: | |
yaml: | | |
name: ${{ matrix.build.name }} | |
repo: ${{ matrix.build.repo }} | |
version_string: "${{ matrix.version }}" | |
version_number: ${{ matrix.version }} | |
test-complex: | |
name: Test Complex | |
needs: setup-complex | |
runs-on: ubuntu-latest | |
steps: | |
- name: Output JSON | |
run: | | |
if [[ "${output_json}" != "${expected_json}" ]]; then | |
cat <<<"${output_json}" >"output" | |
cat <<<"${expected_json}" >"expected" | |
diff output expected | cat -te | |
exit 1 | |
fi | |
env: | |
output_json: ${{ needs.setup-complex.outputs.results-json }} | |
expected_json: |- | |
[ | |
{ | |
"name": "App One", | |
"repo": "user/app1", | |
"version_string": "1.0", | |
"version_number": 1 | |
}, | |
{ | |
"name": "App One", | |
"repo": "user/app1", | |
"version_string": "2.0", | |
"version_number": 2 | |
}, | |
{ | |
"name": "App Two", | |
"repo": "user/app2", | |
"version_string": "1.0", | |
"version_number": 1 | |
}, | |
{ | |
"name": "App Two", | |
"repo": "user/app2", | |
"version_string": "2.0", | |
"version_number": 2 | |
} | |
] | |
test-empty: | |
name: Test Empty | |
runs-on: ubuntu-latest | |
permissions: | |
actions: read | |
contents: read | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./ | |
id: matrix-output | |
continue-on-error: true | |
with: | |
yaml: "" | |
- name: Action failed | |
if: ${{ steps.matrix-output.outcome != 'failure' }} | |
run: exit 1 | |
test-duplicate: | |
name: Test Duplicate | |
runs-on: ubuntu-latest | |
permissions: | |
actions: read | |
contents: read | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./ | |
id: matrix-output1 | |
continue-on-error: true | |
with: | |
yaml: | | |
demo: 1 | |
- uses: ./ | |
id: matrix-output2 | |
continue-on-error: true | |
with: | |
yaml: | | |
demo: 2 | |
- name: Action failed | |
if: ${{ steps.matrix-output1.outcome != 'success' || steps.matrix-output2.outcome != 'failure' }} | |
run: exit 1 | |
setup-race-condition: | |
name: Setup Race Condition | |
runs-on: ubuntu-latest | |
permissions: | |
actions: read | |
contents: read | |
strategy: | |
fail-fast: false | |
matrix: | |
index: | |
- 1 | |
- 2 | |
outputs: | |
results-json: ${{ steps.matrix-output.outputs.json }} | |
steps: | |
- uses: actions/checkout@v4 | |
- if: ${{ strategy.job-index == 0 }} | |
run: sleep 5 | |
- uses: ./ | |
id: matrix-output | |
with: | |
yaml: | | |
index: ${{ matrix.index }} | |
- if: ${{ strategy.job-index == 1 }} | |
run: sleep 30 | |
test-race-condition: | |
name: Test Race Condition | |
needs: setup-race-condition | |
runs-on: ubuntu-latest | |
steps: | |
- name: Output JSON | |
run: | | |
if [[ "${output_json}" != "${expected_json}" ]]; then | |
cat <<<"${output_json}" >"output" | |
cat <<<"${expected_json}" >"expected" | |
diff output expected | cat -te | |
exit 1 | |
fi | |
env: | |
output_json: ${{ needs.setup-race-condition.outputs.results-json }} | |
expected_json: |- | |
[ | |
{ | |
"index": 1 | |
}, | |
{ | |
"index": 2 | |
} | |
] | |
test-job-name: | |
name: Job Name | |
runs-on: ubuntu-latest | |
permissions: | |
actions: read | |
contents: read | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./job-context/ | |
id: job-context | |
- name: Matches expected name | |
run: '[[ "${output}" == "${expected}" ]] || exit 1' | |
env: | |
output: ${{ steps.job-context.outputs.job-name }} | |
expected: "Job Name" | |
test-job-name-matrix: | |
name: Job Name | |
runs-on: ubuntu-latest | |
permissions: | |
actions: read | |
contents: read | |
strategy: | |
fail-fast: false | |
matrix: | |
build: | |
- name: App One | |
repo: user/app1 | |
- name: App Two | |
repo: user/app2 | |
version: | |
- "1.0" | |
- "2.0" | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./job-context/ | |
id: job-context | |
- name: Matches expected name | |
run: '[[ "${output}" == "${expected}" ]] || exit 1' | |
env: | |
output: ${{ steps.job-context.outputs.job-name }} | |
expected: "Job Name (${{ matrix.build.name }}, ${{ matrix.build.repo }}, ${{ matrix.version }})" | |
- name: Matches GitHub API name | |
run: | | |
jobs="$(gh api -X GET "/repos/{owner}/{repo}/actions/runs/${run_id:?}/attempts/${run_attempt:?}/jobs")" | |
if [[ $(jq --arg name "$job_name" '.jobs | map(select(.name == $name)) | length' <<<"${jobs}") -ne 1 ]]; then | |
jq '.jobs[].name' <<<"${jobs}" | |
exit 1 | |
fi | |
env: | |
GH_TOKEN: ${{ github.token }} | |
run_id: ${{ github.run_id }} | |
run_attempt: ${{ github.run_attempt }} | |
job_name: ${{ steps.job-context.outputs.job-name }} | |
test-job-name-matrix-expr: | |
# TODO: Using `github.job` with any expressions results in it being empty | |
name: ${{ github.event_name }} - ${{ matrix.dne }} - ${{ matrix.index }} - ${{ strategy.job-index }} | |
runs-on: ubuntu-latest | |
permissions: | |
actions: read | |
contents: read | |
strategy: | |
fail-fast: false | |
matrix: | |
index: | |
- 1 | |
- 2 | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./job-context/ | |
id: job-context | |
- name: Matches expected name | |
run: '[[ "${output}" == "${expected}" ]] || exit 1' | |
env: | |
output: ${{ steps.job-context.outputs.job-name }} | |
expected: ${{ github.event_name }} - - ${{ matrix.index }} - ${{ strategy.job-index }} | |
- name: Matches GitHub API name | |
run: | | |
jobs="$(gh api -X GET "/repos/{owner}/{repo}/actions/runs/${run_id:?}/attempts/${run_attempt:?}/jobs")" | |
if [[ $(jq --arg name "$job_name" '.jobs | map(select(.name == $name)) | length' <<<"${jobs}") -ne 1 ]]; then | |
jq '.jobs[].name' <<<"${jobs}" | |
exit 1 | |
fi | |
env: | |
GH_TOKEN: ${{ github.token }} | |
run_id: ${{ github.run_id }} | |
run_attempt: ${{ github.run_attempt }} | |
job_name: ${{ steps.job-context.outputs.job-name }} | |
test-job-name-ambiguous: | |
name: ${{ github.job }} | |
runs-on: ubuntu-latest | |
permissions: | |
actions: read | |
contents: read | |
strategy: | |
fail-fast: false | |
matrix: | |
index: | |
- 1 | |
- 2 | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./job-context/ | |
id: job-context | |
- name: Matches expected name | |
run: '[[ "${output}" == "${expected}" ]] || exit 1' | |
env: | |
output: ${{ steps.job-context.outputs.job-name }} | |
expected: ${{ github.job }} | |
- name: Matches multiple jobs | |
run: | | |
[[ $(jq length <<<"${job_ids}") -eq 2 ]] || exit 1 | |
[[ -z "${job_id}" ]] || exit 1 | |
env: | |
job_ids: ${{ steps.job-context.outputs.job-ids }} | |
job_id: ${{ steps.job-context.outputs.job-id }} |