Skip to content

Initial action implemention #97

Initial action implemention

Initial action implemention #97

---
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 }}