Skip to content

Update actions/setup-java digest to c5195ef #78

Update actions/setup-java digest to c5195ef

Update actions/setup-java digest to c5195ef #78

name: Integration tests
on:
push:
branches: [ "**" ]
concurrency:
group: integration-test-${{ github.ref }}
cancel-in-progress: true
env:
split-total: 4
jobs:
checkout-junit-reports-test:
name: Checkout JUnit reports
runs-on: ubuntu-latest
steps:
- name: Checkout split-tests-java-action
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Create JUnit reports branch
run: |
BRANCH=junit-reports-it-${{ github.sha }}-download
echo "Creating branch $BRANCH"
git switch --orphan $BRANCH
git config user.name "${{ github.actor }}"
git config user.email "${{ github.actor }}@users.noreply.github.com"
touch first.xml
git add *.xml
git commit -m "Initial commit for JUnit reports branch"
SHA=$(git rev-parse HEAD)
git push origin --set-upstream $BRANCH
git switch ${{ github.ref_name }}
echo "Saving expexted JUnit reports SHA $SHA"
echo "expected-junit-reports-sha=${SHA}" >> "$GITHUB_ENV"
- name: Checkout JUnit reports (split-index 1)
uses: ./checkout-junit-reports
with:
split-index: 1
git-branch: junit-reports-it-${{ github.sha }}-download
path: junit-reports-first-index-1
- name: Checkout JUnit reports (split-index 0a)
uses: ./checkout-junit-reports
with:
split-index: 0
git-branch: junit-reports-it-${{ github.sha }}-download
path: junit-reports-first-index-0
- name: Checkout JUnit reports (split-index 2)
uses: ./checkout-junit-reports
with:
split-index: 2
git-branch: junit-reports-it-${{ github.sha }}-download
path: junit-reports-first-index-2
- name: Checkout JUnit reports (split-index 0b)
uses: ./checkout-junit-reports
with:
split-index: 0
git-branch: junit-reports-it-${{ github.sha }}-download
path: junit-reports-first-index-3
- name: Checkout JUnit reports (split-index 0c)
uses: ./checkout-junit-reports
with:
split-index: 0
git-branch: junit-reports-it-${{ github.sha }}-download
path: junit-reports-first-index-4
upload-artifact: false
- name: Assert JUnit reports
run: |
for SPLIT_INDEX in {0..3}; do
echo "Checking JUnit reports for split-index $SPLIT_INDEX"
cd junit-reports-first-index-$SPLIT_INDEX
REPORT_FILE="first.xml"
if [[ ! -f "$REPORT_FILE" ]]; then
echo "Error: JUnit report $REPORT_FILE not found!"
ls -l
exit 1
fi
FILE_COUNT=$(ls -1 | wc -l)
if [[ "$FILE_COUNT" -ne 1 ]]; then
echo "Error: Expected 1 JUnit reports, but found $FILE_COUNT files!"
ls -l
exit 1
fi
cd ..
done
- name: Update JUnit reports
working-directory: junit-reports-first-index-0
run: |
touch second.xml
git add *.xml
git config user.name "${{ github.actor }}"
git config user.email "${{ github.actor }}@users.noreply.github.com"
git commit -m "Second commit for JUnit reports branch"
git push origin HEAD:junit-reports-it-${{ github.sha }}-download
- name: Download JUnit reports
uses: ./checkout-junit-reports
with:
split-index: 0
git-branch: junit-reports-it-${{ github.sha }}-download
path: junit-reports-second
- name: Assert JUnit reports
working-directory: junit-reports-second
run: |
REPORT_FILE="first.xml"
if [[ ! -f "$REPORT_FILE" ]]; then
echo "Error: JUnit report $REPORT_FILE not found!"
ls -l
exit 1
fi
FILE_COUNT=$(ls -1 | wc -l)
if [[ "$FILE_COUNT" -ne 1 ]]; then
echo "Error: Expected 1 JUnit reports, but found $FILE_COUNT files!"
ls -l
exit 1
fi
- name: Download JUnit reports SHA artifact
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
with:
name: junit-xml-reports-sha
path: junit-xml-reports-sha-artifact-assertion
- name: Assert JUnit reports SHA artifact
working-directory: junit-xml-reports-sha-artifact-assertion
run: |
SHA_FILE="junit-reports-sha.txt"
if [[ ! -f "$SHA_FILE" ]]; then
echo "Error: JUnit reports SHA file $SHA_FILE not found!"
ls -l
exit 1
fi
FILE_COUNT=$(ls -1 | wc -l)
if [[ "$FILE_COUNT" -ne 1 ]]; then
echo "Error: Expected 1 JUnit reports SHA file, but found $FILE_COUNT files!"
ls -l
exit 1
fi
ARTIFACT_SHA=$(cat $SHA_FILE)
if [ "$ARTIFACT_SHA" != "${{ env.expected-junit-reports-sha }}" ]; then
echo "Error: JUnit reports SHA $ARTIFACT_SHA in artifact does not match expected SHA ${{ env.expected-junit-reports-sha }}"
exit 1
fi
- name: Clean up JUnit reports branch
if: always()
run: |
git push origin --delete junit-reports-it-${{ github.sha }}-download || true
- name: Clean up JUnit reports artifact
uses: geekyeggo/delete-artifact@f275313e70c08f6120db482d7a6b98377786765b #v5
with:
name: junit-xml-reports-sha
failOnError: false
generate-split-index-json:
name: Generate split indexes
runs-on: ubuntu-latest
needs:
checkout-junit-reports-test
outputs:
json: ${{ steps.generate.outputs.split-index-json }}
steps:
- name: Checkout split-tests-java-action
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Generate split index list
id: generate
uses: ./generate-split-index-json
with:
split-total: ${{ env.split-total }}
integration-test:
name: "Test #${{ matrix.split-index }}"
runs-on: ubuntu-latest
needs:
- generate-split-index-json
permissions:
contents: read
checks: write
strategy:
fail-fast: false
matrix:
split-index: ${{ fromjson(needs.generate-split-index-json.outputs.json) }}
env:
DOWNLOAD_JAR: false
JAR_PATH: split-tests-java/build/libs/split-tests-java.jar
steps:
- name: Checkout split-tests-java-action
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Checkout split-tests-java
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
repository: Donnerbart/split-tests-java
path: split-tests-java
- name: Set up JDK 21
uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4
with:
distribution: temurin
java-version: 21
- name: Set up Gradle
uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4
- name: Compile split-tests-java
working-directory: split-tests-java
run: ./gradlew shadowJar
- name: Split tests
id: split-tests
uses: ./
with:
split-index: ${{ matrix.split-index }}
split-total: ${{ env.split-total }}
glob: '**/integration-test/tests/*Test.java'
exclude-glob: '**/NoClassNameTest.java'
junit-glob: '**/integration-test/reports/*.xml'
format: 'list'
new-test-time: 'average'
calculate-optimal-total-split: true
debug: true
- name: Assert split tests
env:
SPLIT_INDEX: ${{ matrix.split-index }}
ACTUAL: ${{ steps.split-tests.outputs.test-suite }}
run: |
case "$SPLIT_INDEX" in
"0")
EXPECTED="de.donnerbart.example.SlowestTest"
;;
"1")
EXPECTED="NoPackageTest de.donnerbart.example.ThirdPartyLibraryTest"
;;
"2")
EXPECTED="de.donnerbart.example.NoTimingOneTest de.donnerbart.example.WhitespaceClassDefinitionTest"
;;
"3")
EXPECTED="de.donnerbart.example.NoTimingTwoTest de.donnerbart.example.SlowTest de.donnerbart.example.FastTest"
;;
*)
echo "Unexpected split index"
exit 1
;;
esac
echo "Expected: $EXPECTED"
echo "Actual: $ACTUAL"
if [ "$ACTUAL" != "$EXPECTED" ]; then
echo "The split tests are not matching"
exit 1
fi
- name: Create simulated JUnit report
run: |
mkdir -p build/reports/test-results
CLASS="de.donnerbart.example.ActionSplit${{ matrix.split-index }}Test"
FILE="build/reports/test-results/TEST-$CLASS.xml"
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > $FILE
echo "<testsuite name=\"$CLASS\" tests=\"1\" skipped=\"0\" failures=\"0\" errors=\"0\" timestamp=\"1970-01-01T00:00:00\" hostname=\"foobar\" time=\"23.42\">" >> $FILE
echo " <properties/>" >> $FILE
echo " <testcase name=\"testMethod()\" classname=\"$CLASS\" time=\"23.42\">" >> $FILE
echo " <system-out><![CDATA[00:00:00.000 [Test] INFO Test log for split ${{ matrix.split-index }}" >> $FILE
echo "00:00:00.001 [Test] INFO Done" >> $FILE
echo "]]></system-out>" >> $FILE
echo " <system-err><![CDATA[]]></system-err>" >> $FILE
echo " </testcase>" >> $FILE
echo "</testsuite>" >> $FILE
- name: Upload JUnit report artifact
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: junit-xml-reports-${{ matrix.split-index }}
path: build/reports/test-results/*.xml
merge-junit-reports-with-existing-branch:
name: Merge JUnit reports with existing branch
runs-on: ubuntu-latest
needs:
- integration-test
permissions:
contents: write
steps:
- name: Checkout split-tests-java-action
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Create JUnit reports branch
run: |
BRANCH=junit-reports-it-${{ github.sha }}-existing
echo "Creating branch $BRANCH"
git switch --orphan $BRANCH
git config user.name "${{ github.actor }}"
git config user.email "${{ github.actor }}@users.noreply.github.com"
git commit --allow-empty -m "Initial commit for JUnit reports branch"
git push origin --set-upstream $BRANCH
git switch ${{ github.ref_name }}
- name: Merge JUnit reports
uses: ./merge-junit-reports
with:
git-branch: junit-reports-it-${{ github.sha }}-existing
artifact-name: junit-xml-report-existing
split-artifact-pattern: junit-xml-reports-*
split-artifact-delete-merged: false
- name: Checkout JUnit reports
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
path: junit-reports-assertion
ref: junit-reports-it-${{ github.sha }}-existing
- name: Assert JUnit reports
working-directory: junit-reports-assertion
run: |
for SPLIT_INDEX in {0..3}; do
REPORT_FILE="TEST-de.donnerbart.example.ActionSplit${SPLIT_INDEX}Test.xml"
SEARCH_STRING='name="de.donnerbart.example.ActionSplit'${SPLIT_INDEX}'Test"'
if [[ ! -f "$REPORT_FILE" ]]; then
echo "Error: JUnit report $REPORT_FILE not found!"
ls -l
exit 1
fi
if ! grep -q "$SEARCH_STRING" "$REPORT_FILE"; then
echo "Error: JUnit report $REPORT_FILE does not contain the required string '$SEARCH_STRING'!"
cat $REPORT_FILE
exit 1
fi
echo "JUnit report $REPORT_FILE is valid"
done
FILE_COUNT=$(ls -1 | wc -l)
if [[ "$FILE_COUNT" -ne 4 ]]; then
echo "Error: Expected 4 JUnit reports, but found $FILE_COUNT files!"
ls -l
exit 1
fi
- name: Clean up JUnit reports branch
if: always()
run: |
git push origin --delete junit-reports-it-${{ github.sha }}-existing || true
merge-junit-reports-with-new-branch:
name: Merge JUnit reports with new branch
runs-on: ubuntu-latest
needs:
- merge-junit-reports-with-existing-branch
permissions:
contents: write
steps:
- name: Checkout split-tests-java-action
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Merge JUnit reports
uses: ./merge-junit-reports
with:
git-branch: junit-reports-it-${{ github.sha }}-new
artifact-name: junit-xml-report-new
split-artifact-pattern: junit-xml-reports-*
- name: Checkout JUnit reports
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
path: junit-reports-assertion
ref: junit-reports-it-${{ github.sha }}-new
- name: Assert JUnit reports
working-directory: junit-reports-assertion
run: |
for SPLIT_INDEX in {0..3}; do
REPORT_FILE="TEST-de.donnerbart.example.ActionSplit${SPLIT_INDEX}Test.xml"
SEARCH_STRING='name="de.donnerbart.example.ActionSplit'${SPLIT_INDEX}'Test"'
if [[ ! -f "$REPORT_FILE" ]]; then
echo "Error: JUnit report $REPORT_FILE not found!"
ls -l
exit 1
fi
if ! grep -q "$SEARCH_STRING" "$REPORT_FILE"; then
echo "Error: JUnit report $REPORT_FILE does not contain the required string '$SEARCH_STRING'!"
cat $REPORT_FILE
exit 1
fi
echo "JUnit report $REPORT_FILE is valid"
done
FILE_COUNT=$(ls -1 | wc -l)
if [[ "$FILE_COUNT" -ne 4 ]]; then
echo "Error: Expected 4 JUnit reports, but found $FILE_COUNT files!"
ls -l
exit 1
fi
- name: Download JUnit reports artifact
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
with:
name: junit-xml-report-new
path: junit-reports-artifact-assertion
- name: Assert JUnit reports artifact
working-directory: junit-reports-artifact-assertion
run: |
for SPLIT_INDEX in {0..3}; do
REPORT_FILE="TEST-de.donnerbart.example.ActionSplit${SPLIT_INDEX}Test.xml"
SEARCH_STRING='name="de.donnerbart.example.ActionSplit'${SPLIT_INDEX}'Test"'
if [[ ! -f "$REPORT_FILE" ]]; then
echo "Error: JUnit report $REPORT_FILE not found!"
ls -l
exit 1
fi
if ! grep -q "$SEARCH_STRING" "$REPORT_FILE"; then
echo "Error: JUnit report $REPORT_FILE does not contain the required string '$SEARCH_STRING'!"
cat $REPORT_FILE
exit 1
fi
echo "JUnit report $REPORT_FILE is valid"
done
FILE_COUNT=$(ls -1 | wc -l)
if [[ "$FILE_COUNT" -ne 4 ]]; then
echo "Error: Expected 4 JUnit reports, but found $FILE_COUNT files!"
ls -l
exit 1
fi
- name: Clean up JUnit reports branch
if: always()
run: |
git push origin --delete junit-reports-it-${{ github.sha }}-new || true