Skip to content

Commit 2536ae5

Browse files
committed
Fix collision between macOS workflow artifacts in release workflows
GitHub Workflows are used to automatically generate and publish production and nightly releases of the project. This is done for a range of host architectures, including macOS. The macOS builds are then put through a notarization process in a dedicated workflow job. GitHub Actions workflow artifacts are used to transfer the generated files between sequential jobs in the workflow. The "actions/upload-artifact" and "actions/download-artifact" actions are used for this purpose. The workflow artifact handling had to be reworked recently in order to handle a breaking change in the 4.0.0 release of the "actions/upload-artifact". Previously, a single artifact was used for the transfer of the builds for all hosts. However, support for uploading multiple times to a single artifact was dropped in version 4.0.0 of the "actions/upload-artifact" action. So it is now necessary to use a dedicated artifact for each of the builds. These are downloaded in aggregate in a subsequent job by using the artifact name globbing and merging features which were introduced in version 4.1.0 of the "actions/download-artifact" action. A regression was introduced at that time. The chosen approach was to use a separate set of artifacts for the non-notarized and notarized files. An overview of the sequence (the prefixes are the workflow job names): 1. create-release-artifacts/create-nightly-artifacts: Generate builds. 2. create-release-artifacts/create-nightly-artifacts: Upload builds to workflow artifacts 3. notarize-macos: Download workflow artifacts. 4. notarize-macos: Notarize macOS build from downloaded artifact. 5. notarize-macos: Upload notarized build to workflow artifact with a different name than the source artifact. 6. create-release/publish-nightly: Download workflow artifacts. 7. create-release/publish-nightly: Publish builds. The problem with this is that the artifacts for the non-notarized (uploaded by the create-release-artifacts/create-nightly-artifacts job) and notarized (created by the notarize-macos job) files are then downloaded and merged by the create-release/publish-nightly job. Since each artifact contains a file with the same path in the merged output, the contents of the last downloaded artifact overwrite the contents of the first. It happens that the non-notarized artifact is downloaded after the notarized artifact, so this file path collision results in non-notarized macOS builds being published instead of the notarized builds as intended, and as done by the workflow prior to the regression. For example: ``` % wget https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-latest_macOS_ARM64.tar.gz [...] % tar -xf arduino-cli_nightly-latest_macOS_ARM64.tar.gz % spctl -a -vvv -t install arduino-cli arduino-cli: rejected ``` ``` % wget https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_macOS_ARM64.tar.gz [..] % tar -xf arduino-cli_latest_macOS_ARM64.tar.gz % spctl -a -vvv -t install arduino-cli arduino-cli: rejected ``` The chosen solution is to delete the non-notarized artifacts after downloading each in the notarize-macos jobs. An overview of the new sequence (the prefixes are the workflow job names): 1. create-release-artifacts/create-nightly-artifacts: Generate builds. 2. create-release-artifacts/create-nightly-artifacts: Upload builds to workflow artifacts 3. notarize-macos: Download macOS x86 or Apple Silicon workflow artifact. 4. notarize-macos: Delete macOS x86 or Apple Silicon workflow artifact. 5. notarize-macos: Notarize macOS build from downloaded artifact. 6. notarize-macos: Upload notarized build to workflow artifact. 7. create-release/publish-nightly: Download workflow artifacts. 8. create-release/publish-nightly: Publish builds. The result is that there is no file path collision when the create-release/publish-nightly job downloads and merges the artifacts.
1 parent 4973a41 commit 2536ae5

File tree

2 files changed

+14
-8
lines changed

2 files changed

+14
-8
lines changed

Diff for: .github/workflows/publish-go-nightly-task.yml

+7-4
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,11 @@ jobs:
8181
strategy:
8282
matrix:
8383
build:
84-
- folder-suffix: darwin_amd64
84+
- artifact-suffix: macOS_64bit
85+
folder-suffix: darwin_amd64
8586
package-suffix: "macOS_64bit.tar.gz"
86-
- folder-suffix: darwin_arm64
87+
- artifact-suffix: macOS_ARM64
88+
folder-suffix: darwin_arm64
8789
package-suffix: "macOS_ARM64.tar.gz"
8890

8991
steps:
@@ -172,11 +174,12 @@ jobs:
172174
-C ../../ LICENSE.txt
173175
echo "PACKAGE_FILENAME=$PACKAGE_FILENAME" >> $GITHUB_ENV
174176
175-
- name: Upload artifact
177+
- name: Replace artifact with notarized build
176178
uses: actions/upload-artifact@v4
177179
with:
178180
if-no-files-found: error
179-
name: ${{ env.ARTIFACT_PREFIX }}notarized-${{ matrix.build.folder-suffix }}
181+
name: ${{ env.ARTIFACT_PREFIX }}${{ matrix.build.artifact-suffix }}
182+
overwrite: true
180183
path: ${{ env.DIST_DIR }}/${{ env.PACKAGE_FILENAME }}
181184

182185
publish-nightly:

Diff for: .github/workflows/release-go-task.yml

+7-4
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,11 @@ jobs:
8888
strategy:
8989
matrix:
9090
build:
91-
- folder-suffix: darwin_amd64
91+
- artifact-suffix: macOS_64bit
92+
folder-suffix: darwin_amd64
9293
package-suffix: "macOS_64bit.tar.gz"
93-
- folder-suffix: darwin_arm64
94+
- artifact-suffix: macOS_ARM64
95+
folder-suffix: darwin_arm64
9496
package-suffix: "macOS_ARM64.tar.gz"
9597

9698
steps:
@@ -178,11 +180,12 @@ jobs:
178180
-C "${{ env.BUILD_FOLDER }}/" "${{ env.PROJECT_NAME }}" \
179181
-C ../../ LICENSE.txt
180182
181-
- name: Upload artifact
183+
- name: Replace artifact with notarized build
182184
uses: actions/upload-artifact@v4
183185
with:
184186
if-no-files-found: error
185-
name: ${{ env.ARTIFACT_PREFIX }}notarized-${{ matrix.build.folder-suffix }}
187+
name: ${{ env.ARTIFACT_PREFIX }}${{ matrix.build.artifact-suffix }}
188+
overwrite: true
186189
path: ${{ env.DIST_DIR }}/${{ env.PACKAGE_FILENAME }}
187190

188191
create-release:

0 commit comments

Comments
 (0)