Skip to content

Commit 26b0b55

Browse files
authored
Fix collision between macOS workflow artifacts in release workflows (#2732)
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: ``` % 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 a527c7c commit 26b0b55

File tree

2 files changed

+24
-12
lines changed

2 files changed

+24
-12
lines changed

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

+12-6
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,11 @@ jobs:
8282
strategy:
8383
matrix:
8484
artifact:
85-
- name: darwin_amd64
85+
- artifact-suffix: macOS_64bit
86+
name: darwin_amd64
8687
path: "macOS_64bit.tar.gz"
87-
- name: darwin_arm64
88+
- artifact-suffix: macOS_ARM64
89+
name: darwin_arm64
8890
path: "macOS_ARM64.tar.gz"
8991

9092
steps:
@@ -94,10 +96,14 @@ jobs:
9496
- name: Download artifacts
9597
uses: actions/download-artifact@v4
9698
with:
97-
pattern: ${{ env.ARTIFACT_NAME }}-*
98-
merge-multiple: true
99+
name: ${{ env.ARTIFACT_NAME }}-${{ matrix.artifact.artifact-suffix }}
99100
path: ${{ env.DIST_DIR }}
100101

102+
- name: Remove non-notarized artifact
103+
uses: geekyeggo/delete-artifact@v5
104+
with:
105+
name: ${{ env.ARTIFACT_NAME }}-${{ matrix.artifact.artifact-suffix }}
106+
101107
- name: Import Code-Signing Certificates
102108
env:
103109
KEYCHAIN: "sign.keychain"
@@ -167,11 +173,11 @@ jobs:
167173
-C ../../ LICENSE.txt
168174
echo "PACKAGE_FILENAME=$PACKAGE_FILENAME" >> $GITHUB_ENV
169175
170-
- name: Upload artifact
176+
- name: Upload notarized artifact
171177
uses: actions/upload-artifact@v4
172178
with:
173179
if-no-files-found: error
174-
name: ${{ env.ARTIFACT_NAME }}-notarized-${{ matrix.artifact.name }}
180+
name: ${{ env.ARTIFACT_NAME }}-${{ matrix.artifact.artifact-suffix }}
175181
path: ${{ env.DIST_DIR }}/${{ env.PACKAGE_FILENAME }}
176182

177183
create-windows-installer:

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

+12-6
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,11 @@ jobs:
8282
strategy:
8383
matrix:
8484
artifact:
85-
- name: darwin_amd64
85+
- artifact-suffix: macOS_64bit
86+
name: darwin_amd64
8687
path: "macOS_64bit.tar.gz"
87-
- name: darwin_arm64
88+
- artifact-suffix: macOS_ARM64
89+
name: darwin_arm64
8890
path: "macOS_ARM64.tar.gz"
8991

9092
steps:
@@ -94,10 +96,14 @@ jobs:
9496
- name: Download artifacts
9597
uses: actions/download-artifact@v4
9698
with:
97-
pattern: ${{ env.ARTIFACT_NAME }}-*
98-
merge-multiple: true
99+
name: ${{ env.ARTIFACT_NAME }}-${{ matrix.artifact.artifact-suffix }}
99100
path: ${{ env.DIST_DIR }}
100101

102+
- name: Remove non-notarized artifact
103+
uses: geekyeggo/delete-artifact@v5
104+
with:
105+
name: ${{ env.ARTIFACT_NAME }}-${{ matrix.artifact.artifact-suffix }}
106+
101107
- name: Import Code-Signing Certificates
102108
env:
103109
KEYCHAIN: "sign.keychain"
@@ -167,11 +173,11 @@ jobs:
167173
-C ../../ LICENSE.txt
168174
echo "PACKAGE_FILENAME=$PACKAGE_FILENAME" >> $GITHUB_ENV
169175
170-
- name: Upload artifact
176+
- name: Upload notarized artifact
171177
uses: actions/upload-artifact@v4
172178
with:
173179
if-no-files-found: error
174-
name: ${{ env.ARTIFACT_NAME }}-notarized-${{ matrix.artifact.name }}
180+
name: ${{ env.ARTIFACT_NAME }}-${{ matrix.artifact.artifact-suffix }}
175181
path: ${{ env.DIST_DIR }}/${{ env.PACKAGE_FILENAME }}
176182

177183
create-windows-installer:

0 commit comments

Comments
 (0)