Skip to content

Commit 596f634

Browse files
committed
Add support for checking out non-existent branches in JUnit reports workflow
1 parent a4f7794 commit 596f634

File tree

2 files changed

+94
-19
lines changed

2 files changed

+94
-19
lines changed

.github/workflows/integration-test.yml

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,37 @@ jobs:
7171
path: junit-reports-first-index-4
7272
upload-artifact: false
7373

74+
- name: Checkout JUnit reports (non-existent branch)
75+
uses: ./checkout-junit-reports
76+
with:
77+
split-index: 0
78+
git-branch: junit-reports-it-${{ github.sha }}-nonexistent
79+
path: junit-reports-nonexistent-branch
80+
upload-artifact: false
81+
82+
- name: Assert non-existent branch checkout
83+
run: |
84+
echo "Verifying that checkout with non-existent branch succeeded"
85+
if [ ! -d "junit-reports-nonexistent-branch" ]; then
86+
echo "Error: Directory junit-reports-nonexistent-branch was not created!"
87+
exit 1
88+
fi
89+
cd junit-reports-nonexistent-branch
90+
# Should be on the default branch, verify we have the action files
91+
if [ ! -f "action.yml" ]; then
92+
echo "Error: action.yml not found - checkout didn't work properly!"
93+
ls -la
94+
exit 1
95+
fi
96+
# Verify we're not on the non-existent branch
97+
CURRENT_BRANCH=$(git branch --show-current)
98+
if [ "$CURRENT_BRANCH" == "junit-reports-it-${{ github.sha }}-nonexistent" ]; then
99+
echo "Error: Should not be on the non-existent branch!"
100+
exit 1
101+
fi
102+
echo "Successfully verified checkout with non-existent branch stays on default branch"
103+
cd ..
104+
74105
- name: Assert JUnit reports
75106
run: |
76107
for SPLIT_INDEX in {0..3}; do
@@ -99,7 +130,10 @@ jobs:
99130
git config user.name "${{ github.actor }}"
100131
git config user.email "${{ github.actor }}@users.noreply.github.com"
101132
git commit -m "Second commit for JUnit reports branch"
133+
UPDATED_SHA=$(git rev-parse HEAD)
102134
git push origin HEAD:junit-reports-it-${{ github.sha }}-download
135+
echo "Saving updated JUnit reports SHA $UPDATED_SHA"
136+
echo "updated-junit-reports-sha=${UPDATED_SHA}" >> "$GITHUB_ENV"
103137
104138
- name: Download JUnit reports
105139
uses: ./checkout-junit-reports
@@ -108,7 +142,7 @@ jobs:
108142
git-branch: junit-reports-it-${{ github.sha }}-download
109143
path: junit-reports-second
110144

111-
- name: Assert JUnit reports
145+
- name: Assert JUnit reports (updated branch)
112146
working-directory: junit-reports-second
113147
run: |
114148
REPORT_FILE="first.xml"
@@ -117,12 +151,19 @@ jobs:
117151
ls -l
118152
exit 1
119153
fi
154+
SECOND_REPORT_FILE="second.xml"
155+
if [[ ! -f "$SECOND_REPORT_FILE" ]]; then
156+
echo "Error: JUnit report $SECOND_REPORT_FILE not found!"
157+
ls -l
158+
exit 1
159+
fi
120160
FILE_COUNT=$(ls -1 | wc -l)
121-
if [[ "$FILE_COUNT" -ne 1 ]]; then
122-
echo "Error: Expected 1 JUnit reports, but found $FILE_COUNT files!"
161+
if [[ "$FILE_COUNT" -ne 2 ]]; then
162+
echo "Error: Expected 2 JUnit reports, but found $FILE_COUNT files!"
123163
ls -l
124164
exit 1
125165
fi
166+
echo "Successfully verified updated JUnit reports branch contains both files"
126167
127168
- name: Download JUnit reports SHA artifact
128169
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
@@ -146,10 +187,17 @@ jobs:
146187
exit 1
147188
fi
148189
ARTIFACT_SHA=$(cat $SHA_FILE)
149-
if [ "$ARTIFACT_SHA" != "${{ env.expected-junit-reports-sha }}" ]; then
150-
echo "Error: JUnit reports SHA $ARTIFACT_SHA in artifact does not match expected SHA ${{ env.expected-junit-reports-sha }}"
190+
# After the branch update, we should have the updated SHA
191+
EXPECTED_SHA="${{ env.updated-junit-reports-sha }}"
192+
if [ -z "$EXPECTED_SHA" ]; then
193+
# Fallback to original SHA if update didn't happen
194+
EXPECTED_SHA="${{ env.expected-junit-reports-sha }}"
195+
fi
196+
if [ "$ARTIFACT_SHA" != "$EXPECTED_SHA" ]; then
197+
echo "Error: JUnit reports SHA $ARTIFACT_SHA in artifact does not match expected SHA $EXPECTED_SHA"
151198
exit 1
152199
fi
200+
echo "Successfully verified JUnit reports SHA artifact contains expected SHA $EXPECTED_SHA"
153201
154202
- name: Clean up JUnit reports branch
155203
if: always()

checkout-junit-reports/action.yml

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,40 +49,67 @@ runs:
4949
name: ${{ inputs.artifact-name }}
5050
path: ${{ inputs.artifact-path }}
5151

52+
- name: Checkout repository
53+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
54+
with:
55+
path: ${{ inputs.path }}
56+
5257
- name: Check JUnit reports SHA
5358
id: junit-reports-sha
5459
shell: bash
5560
run: |
5661
echo "Checking JUnit reports SHA"
5762
UPLOAD_SHA_ARTIFACT=${{ inputs.upload-artifact }}
5863
CHECKOUT_REF=${{ inputs.git-branch }}
59-
if [ -d ${{ inputs.artifact-path }} ]; then
60-
cd ${{ inputs.artifact-path }}
61-
if [ -f junit-reports-sha.txt ]; then
64+
# Check if we have a SHA artifact AND it's for the same branch we're requesting
65+
if [ -d ${{ inputs.artifact-path }} ] && [ -f ${{ inputs.artifact-path }}/junit-reports-sha.txt ]; then
66+
# We have a SHA artifact, but only use it if we're requesting the same branch
67+
# For non-existent branches, we should not use the cached SHA
68+
SAVED_SHA=$(cat ${{ inputs.artifact-path }}/junit-reports-sha.txt)
69+
cd ${{ inputs.path }}
70+
# Check if the requested branch exists
71+
if git ls-remote --exit-code --heads origin $CHECKOUT_REF; then
72+
echo "Branch $CHECKOUT_REF exists, checking if saved SHA is current"
73+
git fetch --quiet
74+
git switch $CHECKOUT_REF
75+
CURRENT_SHA=$(git rev-parse HEAD)
76+
if [ "$CURRENT_SHA" == "$SAVED_SHA" ]; then
77+
echo "Using saved SHA $SAVED_SHA for branch $CHECKOUT_REF (no changes)"
78+
UPLOAD_SHA_ARTIFACT=false
79+
else
80+
# Branch has been updated, we should update the SHA artifact if we're split-index 0
81+
echo "Branch has been updated from $SAVED_SHA to $CURRENT_SHA, will update SHA artifact"
82+
fi
83+
else
84+
echo "Branch $CHECKOUT_REF does not exist, ignoring saved SHA and staying on default branch"
6285
UPLOAD_SHA_ARTIFACT=false
63-
CHECKOUT_REF=$(cat junit-reports-sha.txt)
6486
fi
6587
else
66-
mkdir ${{ inputs.artifact-path }} || true
88+
# No SHA artifact, handle branch checkout normally
89+
if [ ! -d ${{ inputs.artifact-path }} ]; then
90+
mkdir ${{ inputs.artifact-path }} || true
91+
fi
92+
cd ${{ inputs.path }}
93+
if git ls-remote --exit-code --heads origin $CHECKOUT_REF; then
94+
echo "Switching to existing branch: $CHECKOUT_REF"
95+
git fetch --quiet
96+
git switch $CHECKOUT_REF
97+
else
98+
echo "Branch $CHECKOUT_REF does not exist, staying on default branch"
99+
UPLOAD_SHA_ARTIFACT=false
100+
fi
67101
fi
68102
if [ "$UPLOAD_SHA_ARTIFACT" == "true" ]; then
69-
echo "Checking out JUnit reports from branch $CHECKOUT_REF"
103+
echo "Will upload JUnit reports SHA for branch $CHECKOUT_REF"
70104
else
71-
echo "Checking out JUnit reports from previously used SHA $CHECKOUT_REF"
105+
echo "Will not upload JUnit reports SHA"
72106
fi
73107
# we can only upload the artifact once, so only do this on the first split
74108
if [ "${{ inputs.split-index }}" != "0" ]; then
75109
echo "Skipping upload of JUnit reports SHA on this index"
76110
UPLOAD_SHA_ARTIFACT=false
77111
fi
78112
echo "upload-artifact=${UPLOAD_SHA_ARTIFACT}" >> "$GITHUB_OUTPUT"
79-
echo "ref=${CHECKOUT_REF}" >> "$GITHUB_OUTPUT"
80-
81-
- name: Checkout repository
82-
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
83-
with:
84-
path: ${{ inputs.path }}
85-
ref: ${{ steps.junit-reports-sha.outputs.ref }}
86113
87114
- name: Save JUnit reports SHA
88115
if: ${{ steps.junit-reports-sha.outputs.upload-artifact == 'true' }}

0 commit comments

Comments
 (0)