Skip to content

Commit 0de6c37

Browse files
authored
Add support for macos arm64 build (#1770)
* add support for macos arm64 build in the taskfile * update workflows to handle darwin_arm64 notarization - the gon config is now hardcoded in the workflow (it allows customization) - the notarization step is run in parallel now - the updated checksum is passed to the `create-release` job - the `create-release` job handles the checksum update in `checksum.txt` file * use working-directory, this should simplify a bit the workflow * we cannot upload all the artifacts since the job is being parallelized * Apply suggestions from code review Co-authored-by: per1234 <[email protected]> * add macos arm 64 download links in `installation.md`
1 parent c1b10f5 commit 0de6c37

File tree

6 files changed

+151
-37
lines changed

6 files changed

+151
-37
lines changed

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

+59-10
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,23 @@ jobs:
4545
path: ${{ env.DIST_DIR }}
4646

4747
notarize-macos:
48+
name: Notarize ${{ matrix.artifact.name }}
4849
runs-on: macos-latest
4950
needs: create-nightly-artifacts
51+
outputs:
52+
checksum-darwin_amd64: ${{ steps.re-package.outputs.checksum-darwin_amd64 }}
53+
checksum-darwin_arm64: ${{ steps.re-package.outputs.checksum-darwin_arm64 }}
54+
55+
env:
56+
GON_CONFIG_PATH: gon.config.hcl
57+
58+
strategy:
59+
matrix:
60+
artifact:
61+
- name: darwin_amd64
62+
path: "macOS_64bit.tar.gz"
63+
- name: darwin_arm64
64+
path: "macOS_ARM64.tar.gz"
5065

5166
steps:
5267
- name: Checkout repository
@@ -86,34 +101,58 @@ jobs:
86101
wget -q https://github.com/mitchellh/gon/releases/download/v0.2.3/gon_macos.zip
87102
unzip gon_macos.zip -d /usr/local/bin
88103
104+
- name: Write gon config to file
105+
# gon does not allow env variables in config file (https://github.com/mitchellh/gon/issues/20)
106+
run: |
107+
cat > "${{ env.GON_CONFIG_PATH }}" <<EOF
108+
# See: https://github.com/mitchellh/gon#configuration-file
109+
source = ["dist/arduino-cli_osx_${{ matrix.artifact.name }}/arduino-cli"]
110+
bundle_id = "cc.arduino.arduino-cli"
111+
112+
sign {
113+
application_identity = "Developer ID Application: ARDUINO SA (7KT7ZWMCJT)"
114+
}
115+
116+
# Ask Gon for zip output to force notarization process to take place.
117+
# The CI will ignore the zip output, using the signed binary only.
118+
zip {
119+
output_path = "unused.zip"
120+
}
121+
EOF
122+
89123
- name: Sign and notarize binary
90124
env:
91125
AC_USERNAME: ${{ secrets.AC_USERNAME }}
92126
AC_PASSWORD: ${{ secrets.AC_PASSWORD }}
93127
run: |
94-
gon gon.config.hcl
128+
gon "${{ env.GON_CONFIG_PATH }}"
95129
96-
- name: Re-package binary and update checksum
130+
- name: Re-package binary and output checksum
131+
id: re-package
132+
working-directory: ${{ env.DIST_DIR }}
97133
# This step performs the following:
98134
# 1. Repackage the signed binary replaced in place by Gon (ignoring the output zip file)
99-
# 2. Recalculate package checksum and replace it in the nnnnnn-checksums.txt file
135+
# 2. Recalculate package checksum
136+
# 3. Output the new checksum to include in the nnnnnn-checksums.txt file
137+
# (it cannot be done there because of workflow job parallelization)
100138
run: |
101139
# GitHub's upload/download-artifact@v2 actions don't preserve file permissions,
102140
# so we need to add execution permission back until the action is made to do this.
103-
chmod +x "${{ env.DIST_DIR }}/${{ env.PROJECT_NAME }}_osx_darwin_amd64/${{ env.PROJECT_NAME }}"
104-
PACKAGE_FILENAME="$(basename ${{ env.DIST_DIR }}/${{ env.PROJECT_NAME }}_nightly-*_macOS_64bit.tar.gz)"
105-
tar -czvf "${{ env.DIST_DIR }}/$PACKAGE_FILENAME" \
106-
-C "${{ env.DIST_DIR }}/${{ env.PROJECT_NAME }}_osx_darwin_amd64/" "${{ env.PROJECT_NAME }}" \
141+
chmod +x "${{ env.PROJECT_NAME }}_osx_${{ matrix.artifact.name }}/${{ env.PROJECT_NAME }}"
142+
PACKAGE_FILENAME="${{ env.PROJECT_NAME }}_nightly-*${{ matrix.artifact.path }}"
143+
tar -czvf "$PACKAGE_FILENAME" \
144+
-C "${{ env.PROJECT_NAME }}_osx_${{ matrix.artifact.name }}/" "${{ env.PROJECT_NAME }}" \
107145
-C ../../ LICENSE.txt
108-
CHECKSUM="$(shasum -a 256 ${{ env.DIST_DIR }}/$PACKAGE_FILENAME | cut -d " " -f 1)"
109-
perl -pi -w -e "s/.*${PACKAGE_FILENAME}/${CHECKSUM} ${PACKAGE_FILENAME}/g;" ${{ env.DIST_DIR }}/*-checksums.txt
146+
CHECKSUM_LINE="$(shasum -a 256 $PACKAGE_FILENAME)"
147+
echo "PACKAGE_FILENAME=$PACKAGE_FILENAME" >> $GITHUB_ENV
148+
echo "::set-output name=checksum-${{ matrix.artifact.name }}::$CHECKSUM_LINE"
110149
111150
- name: Upload artifacts
112151
uses: actions/upload-artifact@v3
113152
with:
114153
if-no-files-found: error
115154
name: ${{ env.ARTIFACT_NAME }}
116-
path: ${{ env.DIST_DIR }}
155+
path: ${{ env.DIST_DIR }}/${{ env.PACKAGE_FILENAME }}
117156

118157
publish-nightly:
119158
runs-on: ubuntu-latest
@@ -126,6 +165,16 @@ jobs:
126165
name: ${{ env.ARTIFACT_NAME }}
127166
path: ${{ env.DIST_DIR }}
128167

168+
- name: Update checksum
169+
run: |
170+
declare -a checksum_lines=("${{ needs.notarize-macos.outputs.checksum-darwin_amd64 }}" "${{ needs.notarize-macos.outputs.checksum-darwin_arm64 }}")
171+
for checksum_line in "${checksum_lines[@]}"
172+
do
173+
CHECKSUM=$(echo ${checksum_line} | cut -d " " -f 1)
174+
PACKAGE_FILENAME=$(echo ${checksum_line} | cut -d " " -f 2)
175+
perl -pi -w -e "s/.*${PACKAGE_FILENAME}/${CHECKSUM} ${PACKAGE_FILENAME}/g;" ${{ env.DIST_DIR }}/*-checksums.txt
176+
done
177+
129178
- name: Upload release files on Arduino downloads servers
130179
uses: docker://plugins/s3
131180
env:

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

+2
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ jobs:
108108
name: Linux_ARMv7
109109
- path: "*macOS_64bit.tar.gz"
110110
name: macOS_64
111+
- path: "*macOS_ARM64.tar.gz"
112+
name: macOS_ARM64
111113
- path: "*Windows_32bit.zip"
112114
name: Windows_X86-32
113115
- path: "*Windows_64bit.zip"

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

+59-9
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,23 @@ jobs:
5050
path: ${{ env.DIST_DIR }}
5151

5252
notarize-macos:
53+
name: Notarize ${{ matrix.artifact.name }}
5354
runs-on: macos-latest
5455
needs: create-release-artifacts
56+
outputs:
57+
checksum-darwin_amd64: ${{ steps.re-package.outputs.checksum-darwin_amd64 }}
58+
checksum-darwin_arm64: ${{ steps.re-package.outputs.checksum-darwin_arm64 }}
59+
60+
env:
61+
GON_CONFIG_PATH: gon.config.hcl
62+
63+
strategy:
64+
matrix:
65+
artifact:
66+
- name: darwin_amd64
67+
path: "macOS_64bit.tar.gz"
68+
- name: darwin_arm64
69+
path: "macOS_ARM64.tar.gz"
5570

5671
steps:
5772
- name: Checkout repository
@@ -91,34 +106,59 @@ jobs:
91106
wget -q https://github.com/mitchellh/gon/releases/download/v0.2.3/gon_macos.zip
92107
unzip gon_macos.zip -d /usr/local/bin
93108
109+
- name: Write gon config to file
110+
# gon does not allow env variables in config file (https://github.com/mitchellh/gon/issues/20)
111+
run: |
112+
cat > "${{ env.GON_CONFIG_PATH }}" <<EOF
113+
# See: https://github.com/mitchellh/gon#configuration-file
114+
source = ["dist/arduino-cli_osx_${{ matrix.artifact.name }}/arduino-cli"]
115+
bundle_id = "cc.arduino.arduino-cli"
116+
117+
sign {
118+
application_identity = "Developer ID Application: ARDUINO SA (7KT7ZWMCJT)"
119+
}
120+
121+
# Ask Gon for zip output to force notarization process to take place.
122+
# The CI will ignore the zip output, using the signed binary only.
123+
zip {
124+
output_path = "unused.zip"
125+
}
126+
EOF
127+
94128
- name: Sign and notarize binary
95129
env:
96130
AC_USERNAME: ${{ secrets.AC_USERNAME }}
97131
AC_PASSWORD: ${{ secrets.AC_PASSWORD }}
98132
run: |
99-
gon gon.config.hcl
133+
gon "${{ env.GON_CONFIG_PATH }}"
100134
101-
- name: Re-package binary and update checksum
135+
- name: Re-package binary and output checksum
136+
id: re-package
137+
working-directory: ${{ env.DIST_DIR }}
102138
# This step performs the following:
103139
# 1. Repackage the signed binary replaced in place by Gon (ignoring the output zip file)
104-
# 2. Recalculate package checksum and replace it in the nnnnnn-checksums.txt file
140+
# 2. Recalculate package checksum
141+
# 3. Output the new checksum to include in the nnnnnn-checksums.txt file
142+
# (it cannot be done there because of workflow job parallelization)
105143
run: |
106144
# GitHub's upload/download-artifact@v2 actions don't preserve file permissions,
107145
# so we need to add execution permission back until the action is made to do this.
108-
chmod +x ${{ env.DIST_DIR }}/${{ env.PROJECT_NAME }}_osx_darwin_amd64/${{ env.PROJECT_NAME }}
146+
chmod +x "${{ env.PROJECT_NAME }}_osx_${{ matrix.artifact.name }}/${{ env.PROJECT_NAME }}"
109147
TAG="${GITHUB_REF/refs\/tags\//}"
110-
tar -czvf "${{ env.DIST_DIR }}/${{ env.PROJECT_NAME }}_${TAG}_macOS_64bit.tar.gz" \
111-
-C ${{ env.DIST_DIR }}/${{ env.PROJECT_NAME }}_osx_darwin_amd64/ ${{ env.PROJECT_NAME }} \
148+
PACKAGE_FILENAME="${{ env.PROJECT_NAME }}_${TAG}_${{ matrix.artifact.path }}"
149+
tar -czvf "$PACKAGE_FILENAME" \
150+
-C "${{ env.PROJECT_NAME }}_osx_${{ matrix.artifact.name }}/" "${{ env.PROJECT_NAME }}" \
112151
-C ../../ LICENSE.txt
113-
CHECKSUM="$(shasum -a 256 ${{ env.DIST_DIR }}/${{ env.PROJECT_NAME }}_${TAG}_macOS_64bit.tar.gz | cut -d " " -f 1)"
114-
perl -pi -w -e "s/.*${{ env.PROJECT_NAME }}_${TAG}_macOS_64bit.tar.gz/${CHECKSUM} ${{ env.PROJECT_NAME }}_${TAG}_macOS_64bit.tar.gz/g;" ${{ env.DIST_DIR }}/*-checksums.txt
152+
CHECKSUM_LINE="$(shasum -a 256 $PACKAGE_FILENAME)"
153+
echo "PACKAGE_FILENAME=$PACKAGE_FILENAME" >> $GITHUB_ENV
154+
echo "::set-output name=checksum-${{ matrix.artifact.name }}::$CHECKSUM_LINE"
115155
116156
- name: Upload artifacts
117157
uses: actions/upload-artifact@v3
118158
with:
119159
if-no-files-found: error
120160
name: ${{ env.ARTIFACT_NAME }}
121-
path: ${{ env.DIST_DIR }}
161+
path: ${{ env.DIST_DIR }}/${{ env.PACKAGE_FILENAME }}
122162

123163
create-release:
124164
runs-on: ubuntu-latest
@@ -131,6 +171,16 @@ jobs:
131171
name: ${{ env.ARTIFACT_NAME }}
132172
path: ${{ env.DIST_DIR }}
133173

174+
- name: Update checksum
175+
run: |
176+
declare -a checksum_lines=("${{ needs.notarize-macos.outputs.checksum-darwin_amd64 }}" "${{ needs.notarize-macos.outputs.checksum-darwin_arm64 }}")
177+
for checksum_line in "${checksum_lines[@]}"
178+
do
179+
CHECKSUM=$(echo ${checksum_line} | cut -d " " -f 1)
180+
PACKAGE_FILENAME=$(echo ${checksum_line} | cut -d " " -f 2)
181+
perl -pi -w -e "s/.*${PACKAGE_FILENAME}/${CHECKSUM} ${PACKAGE_FILENAME}/g;" ${{ env.DIST_DIR }}/*-checksums.txt
182+
done
183+
134184
- name: Identify Prerelease
135185
# This is a workaround while waiting for create-release action
136186
# to implement auto pre-release based on tag

Diff for: DistTasks.yml

+23
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ tasks:
3434
- task: Linux_ARMv7
3535
- task: Linux_ARM64
3636
- task: macOS_64bit
37+
- task: macOS_ARM64
3738

3839
Windows_32bit:
3940
desc: Builds Windows 32 bit binaries
@@ -251,3 +252,25 @@ tasks:
251252
CONTAINER_TAG: "{{.GO_VERSION}}-darwin-debian10"
252253
PACKAGE_PLATFORM: "macOS_64bit"
253254
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.tar.gz"
255+
256+
macOS_ARM64:
257+
desc: Builds Mac OS X ARM64 binaries
258+
dir: "{{.DIST_DIR}}"
259+
cmds:
260+
- |
261+
docker run -v `pwd`/..:/home/build -w /home/build \
262+
-e CGO_ENABLED=1 \
263+
{{.CONTAINER}}:{{.CONTAINER_TAG}} \
264+
--build-cmd "{{.BUILD_COMMAND}}" \
265+
-p "{{.BUILD_PLATFORM}}"
266+
267+
tar cz -C {{.PLATFORM_DIR}} {{.PROJECT_NAME}} -C ../.. LICENSE.txt -f {{.PACKAGE_NAME}}
268+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
269+
270+
vars:
271+
PLATFORM_DIR: "{{.PROJECT_NAME}}_osx_darwin_arm64"
272+
BUILD_COMMAND: "go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}} {{.LDFLAGS}}"
273+
BUILD_PLATFORM: "darwin/arm64"
274+
CONTAINER_TAG: "{{.GO_VERSION}}-darwin-arm64-debian10"
275+
PACKAGE_PLATFORM: "macOS_ARM64"
276+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.tar.gz"

Diff for: docs/installation.md

+8-4
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,17 @@ in your [`PATH`](https://en.wikipedia.org/wiki/PATH%5F%28variable%29) or add the
6363
| Linux | [32 bit][linux32] | [64 bit][linux64] |
6464
| Linux ARM | [32 bit][linuxarm32] | [64 bit][linuxarm64] |
6565
| Windows | [32 bit][windows32] | [64 bit][windows64] |
66-
| macOS | | [64 bit][macos] |
66+
| macOS | | [64 bit][macos64] |
67+
| macOS ARM | | [64 bit][macosarm64] |
6768

6869
[linux64]: https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Linux_64bit.tar.gz
6970
[linux32]: https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Linux_32bit.tar.gz
7071
[linuxarm64]: https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Linux_ARM64.tar.gz
7172
[linuxarm32]: https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Linux_ARMv7.tar.gz
7273
[windows64]: https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Windows_64bit.zip
7374
[windows32]: https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Windows_32bit.zip
74-
[macos]: https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_macOS_64bit.tar.gz
75+
[macos64]: https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_macOS_64bit.tar.gz
76+
[macosarm64]: https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_macOS_ARM64.tar.gz
7577

7678
> **Deprecation notice**: links in the form
7779
> `http://downloads.arduino.cc/arduino-cli/arduino-cli-latest-<platform>.tar.bz2` won’t be further updated. That URL
@@ -91,15 +93,17 @@ to get the latest nightly build available for the supported platform, use the fo
9193
| Linux | [32 bit][linux32-nightly] | [64 bit][linux64-nightly] |
9294
| Linux ARM | [32 bit][linuxarm32-nightly] | [64 bit][linuxarm64-nightly] |
9395
| Windows | [32 bit][windows32-nightly] | [64 bit][windows64-nightly] |
94-
| macOS | | [64 bit][macos-nightly] |
96+
| macOS | | [64 bit][macos64-nightly] |
97+
| macOS ARM | | [64 bit][macosarm64-nightly] |
9598

9699
[linux64-nightly]: https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-latest_Linux_64bit.tar.gz
97100
[linux32-nightly]: https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-latest_Linux_32bit.tar.gz
98101
[linuxarm64-nightly]: https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-latest_Linux_ARM64.tar.gz
99102
[linuxarm32-nightly]: https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-latest_Linux_ARMv7.tar.gz
100103
[windows64-nightly]: https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-latest_Windows_64bit.zip
101104
[windows32-nightly]: https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-latest_Windows_32bit.zip
102-
[macos-nightly]: https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-latest_macOS_64bit.tar.gz
105+
[macos64-nightly]: https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-latest_macOS_64bit.tar.gz
106+
[macosarm64-nightly]: https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-latest_macOS_ARM64.tar.gz
103107

104108
> These links return a `302: Found` response, redirecting to latest generated builds by replacing `latest` with the
105109
> latest available build date, using the format YYYYMMDD (i.e for 2019-08-06 `latest` is replaced with `20190806` )

Diff for: gon.config.hcl

-14
This file was deleted.

0 commit comments

Comments
 (0)