Skip to content

Commit 02afe46

Browse files
authored
Add CI workflow to publish releases (#4)
* Add CI workflow to publish releases On every push of a tag named with a version format: - Build the project for all supported platforms. - Sign and notarize the macOS build. - Create a GitHub release. - Builds and checksums are attached as release assets - A changelog generated from the commit history is added to the release description - If the tag has a pre-release version suffix, the GitHub release will be marked as a pre-release. * rename stuff according to arduino/tooling-project-assets#198 * Remove license after #3 * use Go version 1.17 to build * change fine extension to be compliant with assets repo
1 parent 7d4cb5b commit 02afe46

File tree

6 files changed

+405
-1
lines changed

6 files changed

+405
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/release-go-crosscompile-task.md
2+
name: Release
3+
4+
env:
5+
# As defined by the Taskfile's PROJECT_NAME variable
6+
PROJECT_NAME: arduino-cslt
7+
# As defined by the Taskfile's DIST_DIR variable
8+
DIST_DIR: dist
9+
# The project's folder on Arduino's download server for uploading builds
10+
# AWS_PLUGIN_TARGET: TODO
11+
ARTIFACT_NAME: dist
12+
# See: https://github.com/actions/setup-go/tree/v2#readme
13+
GO_VERSION: 1.17
14+
15+
on:
16+
push:
17+
tags:
18+
- "[0-9]+.[0-9]+.[0-9]+*"
19+
20+
jobs:
21+
create-release-artifacts:
22+
runs-on: ubuntu-latest
23+
24+
steps:
25+
- name: Checkout repository
26+
uses: actions/checkout@v2
27+
with:
28+
fetch-depth: 0
29+
30+
- name: Create changelog
31+
uses: arduino/create-changelog@v1
32+
with:
33+
tag-regex: '^[0-9]+\.[0-9]+\.[0-9]+.*$'
34+
filter-regex: '^\[(skip|changelog)[ ,-](skip|changelog)\].*'
35+
case-insensitive-regex: true
36+
changelog-file-path: "${{ env.DIST_DIR }}/CHANGELOG.md"
37+
38+
- name: Install Go
39+
uses: actions/setup-go@v2
40+
with:
41+
go-version: ${{ env.GO_VERSION }}
42+
43+
- name: Install Task
44+
uses: arduino/setup-task@v1
45+
with:
46+
repo-token: ${{ secrets.GITHUB_TOKEN }}
47+
version: 3.x
48+
49+
- name: Build
50+
run: task dist:all
51+
52+
- name: Upload artifacts
53+
uses: actions/upload-artifact@v2
54+
with:
55+
if-no-files-found: error
56+
name: ${{ env.ARTIFACT_NAME }}
57+
path: ${{ env.DIST_DIR }}
58+
59+
notarize-macos:
60+
runs-on: macos-latest
61+
needs: create-release-artifacts
62+
63+
steps:
64+
- name: Checkout repository
65+
uses: actions/checkout@v2
66+
67+
- name: Download artifacts
68+
uses: actions/download-artifact@v2
69+
with:
70+
name: ${{ env.ARTIFACT_NAME }}
71+
path: ${{ env.DIST_DIR }}
72+
73+
- name: Import Code-Signing Certificates
74+
env:
75+
KEYCHAIN: "sign.keychain"
76+
INSTALLER_CERT_MAC_PATH: "/tmp/ArduinoCerts2020.p12"
77+
KEYCHAIN_PASSWORD: keychainpassword # Arbitrary password for a keychain that exists only for the duration of the job, so not secret
78+
run: |
79+
echo "${{ secrets.INSTALLER_CERT_MAC_P12 }}" | base64 --decode > "${{ env.INSTALLER_CERT_MAC_PATH }}"
80+
security create-keychain -p "${{ env.KEYCHAIN_PASSWORD }}" "${{ env.KEYCHAIN }}"
81+
security default-keychain -s "${{ env.KEYCHAIN }}"
82+
security unlock-keychain -p "${{ env.KEYCHAIN_PASSWORD }}" "${{ env.KEYCHAIN }}"
83+
security import \
84+
"${{ env.INSTALLER_CERT_MAC_PATH }}" \
85+
-k "${{ env.KEYCHAIN }}" \
86+
-f pkcs12 \
87+
-A \
88+
-T "/usr/bin/codesign" \
89+
-P "${{ secrets.INSTALLER_CERT_MAC_PASSWORD }}"
90+
security set-key-partition-list \
91+
-S apple-tool:,apple: \
92+
-s \
93+
-k "${{ env.KEYCHAIN_PASSWORD }}" \
94+
"${{ env.KEYCHAIN }}"
95+
96+
- name: Install gon for code signing and app notarization
97+
run: |
98+
wget -q https://github.com/mitchellh/gon/releases/download/v0.2.3/gon_macos.zip
99+
unzip gon_macos.zip -d /usr/local/bin
100+
101+
- name: Sign and notarize binary
102+
env:
103+
AC_USERNAME: ${{ secrets.AC_USERNAME }}
104+
AC_PASSWORD: ${{ secrets.AC_PASSWORD }}
105+
run: |
106+
gon gon.config.hcl
107+
108+
- name: Re-package binary and update checksum
109+
# This step performs the following:
110+
# 1. Repackage the signed binary replaced in place by Gon (ignoring the output zip file)
111+
# 2. Recalculate package checksum and replace it in the nnnnnn-checksums.txt file
112+
run: |
113+
# GitHub's upload/download-artifact@v2 actions don't preserve file permissions,
114+
# so we need to add execution permission back until the action is made to do this.
115+
chmod +x ${{ env.DIST_DIR }}/${{ env.PROJECT_NAME }}_osx_darwin_amd64/${{ env.PROJECT_NAME }}
116+
TAG="${GITHUB_REF/refs\/tags\//}"
117+
tar -czvf "${{ env.DIST_DIR }}/${{ env.PROJECT_NAME }}_${TAG}_macOS_64bit.tar.gz" \
118+
-C ${{ env.DIST_DIR }}/${{ env.PROJECT_NAME }}_osx_darwin_amd64/ ${{ env.PROJECT_NAME }}
119+
CHECKSUM="$(shasum -a 256 ${{ env.DIST_DIR }}/${{ env.PROJECT_NAME }}_${TAG}_macOS_64bit.tar.gz | cut -d " " -f 1)"
120+
perl \
121+
-pi \
122+
-w \
123+
-e "s/.*${{ env.PROJECT_NAME }}_${TAG}_macOS_64bit.tar.gz/${CHECKSUM} ${{ env.PROJECT_NAME }}_${TAG}_macOS_64bit.tar.gz/g;" \
124+
${{ env.DIST_DIR }}/*-checksums.txt
125+
126+
- name: Upload artifacts
127+
uses: actions/upload-artifact@v2
128+
with:
129+
if-no-files-found: error
130+
name: ${{ env.ARTIFACT_NAME }}
131+
path: ${{ env.DIST_DIR }}
132+
133+
create-release:
134+
runs-on: ubuntu-latest
135+
needs: notarize-macos
136+
137+
steps:
138+
- name: Download artifact
139+
uses: actions/download-artifact@v2
140+
with:
141+
name: ${{ env.ARTIFACT_NAME }}
142+
path: ${{ env.DIST_DIR }}
143+
144+
- name: Identify Prerelease
145+
# This is a workaround while waiting for create-release action
146+
# to implement auto pre-release based on tag
147+
id: prerelease
148+
run: |
149+
wget -q -P /tmp https://github.com/fsaintjacques/semver-tool/archive/3.0.0.zip
150+
unzip -p /tmp/3.0.0.zip semver-tool-3.0.0/src/semver >/tmp/semver && chmod +x /tmp/semver
151+
if [[ "$(/tmp/semver get prerel "${GITHUB_REF/refs\/tags\//}")" ]]; then echo "::set-output name=IS_PRE::true"; fi
152+
153+
- name: Create Github Release and upload artifacts
154+
uses: ncipollo/release-action@v1
155+
with:
156+
token: ${{ secrets.GITHUB_TOKEN }}
157+
bodyFile: ${{ env.DIST_DIR }}/CHANGELOG.md
158+
draft: false
159+
prerelease: ${{ steps.prerelease.outputs.IS_PRE }}
160+
# NOTE: "Artifact is a directory" warnings are expected and don't indicate a problem
161+
# (all the files we need are in the DIST_DIR root)
162+
artifacts: ${{ env.DIST_DIR }}/*
163+
164+
# - name: Upload release files on Arduino downloads servers
165+
# uses: docker://plugins/s3
166+
# env:
167+
# PLUGIN_SOURCE: "${{ env.DIST_DIR }}/*"
168+
# PLUGIN_TARGET: ${{ env.AWS_PLUGIN_TARGET }}
169+
# PLUGIN_STRIP_PREFIX: "${{ env.DIST_DIR }}/"
170+
# PLUGIN_BUCKET: ${{ secrets.DOWNLOADS_BUCKET }}
171+
# AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
172+
# AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
arduino-cslt
22
.vscode
3-
lib*
3+
lib*
4+
dist

DistTasks.yml

+165
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/release-go-crosscompile-task/DistTasks.yml
2+
version: "3"
3+
4+
# This taskfile is ideally meant to be project agnostic and could be dropped in
5+
# on other Go projects with minimal or no changes.
6+
#
7+
# To use it simply add the following lines to your main taskfile:
8+
# includes:
9+
# dist: ./DistTasks.yml
10+
#
11+
# The following variables must be declared in the including taskfile for the
12+
# build process to work correctly:
13+
# * DIST_DIR: the folder that will contain the final binaries and packages
14+
# * PROJECT_NAME: the name of the project, used in package name
15+
# * VERSION: the version of the project, used in package name and checksum file
16+
# * LD_FLAGS: flags used at build time
17+
#
18+
19+
vars:
20+
CHECKSUM_FILE: "{{.VERSION}}-checksums.txt"
21+
22+
tasks:
23+
all:
24+
desc: Build for distribution for all platforms
25+
cmds:
26+
- task: Windows_32bit
27+
- task: Windows_64bit
28+
- task: Linux_32bit
29+
- task: Linux_64bit
30+
- task: Linux_ARMv6
31+
- task: Linux_ARMv7
32+
- task: Linux_ARM64
33+
- task: macOS_64bit
34+
35+
Windows_32bit:
36+
desc: Builds Windows 32 bit binaries
37+
env:
38+
GOOS: "windows"
39+
GOARCH: "386"
40+
GO386: "softfloat"
41+
cmds:
42+
- |
43+
go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}}.exe {{.LDFLAGS}}
44+
cd {{.DIST_DIR}}
45+
zip {{.PACKAGE_NAME}} {{.PLATFORM_DIR}}/{{.PROJECT_NAME}}.exe -j
46+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
47+
vars:
48+
PLATFORM_DIR: "{{.PROJECT_NAME}}_windows_386"
49+
PACKAGE_PLATFORM: "Windows_32bit"
50+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.zip"
51+
52+
Windows_64bit:
53+
desc: Builds Windows 64 bit binaries
54+
env:
55+
GOOS: "windows"
56+
GOARCH: "amd64"
57+
cmds:
58+
- |
59+
go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}}.exe {{.LDFLAGS}}
60+
cd {{.DIST_DIR}}
61+
zip {{.PACKAGE_NAME}} {{.PLATFORM_DIR}}/{{.PROJECT_NAME}}.exe -j
62+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
63+
vars:
64+
PLATFORM_DIR: "{{.PROJECT_NAME}}_windows_amd64"
65+
PACKAGE_PLATFORM: "Windows_64bit"
66+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.zip"
67+
68+
Linux_32bit:
69+
desc: Builds Linux 32 bit binaries
70+
env:
71+
GOOS: "linux"
72+
GOARCH: "386"
73+
GO386: "softfloat"
74+
cmds:
75+
- |
76+
go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}} {{.LDFLAGS}}
77+
cd {{.DIST_DIR}}
78+
tar cz -C {{.PLATFORM_DIR}} {{.PROJECT_NAME}} -f {{.PACKAGE_NAME}}
79+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
80+
vars:
81+
PLATFORM_DIR: "{{.PROJECT_NAME}}_linux_amd32"
82+
PACKAGE_PLATFORM: "Linux_32bit"
83+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.tar.gz"
84+
85+
Linux_64bit:
86+
desc: Builds Linux 64 bit binaries
87+
env:
88+
GOOS: "linux"
89+
GOARCH: "amd64"
90+
cmds:
91+
- |
92+
go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}} {{.LDFLAGS}}
93+
cd {{.DIST_DIR}}
94+
tar cz -C {{.PLATFORM_DIR}} {{.PROJECT_NAME}} -f {{.PACKAGE_NAME}}
95+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
96+
vars:
97+
PLATFORM_DIR: "{{.PROJECT_NAME}}_linux_amd64"
98+
PACKAGE_PLATFORM: "Linux_64bit"
99+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.tar.gz"
100+
101+
Linux_ARMv7:
102+
desc: Builds Linux ARMv7 binaries
103+
env:
104+
GOOS: "linux"
105+
GOARCH: "arm"
106+
GOARM: 7
107+
cmds:
108+
- |
109+
go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}} {{.LDFLAGS}}
110+
cd {{.DIST_DIR}}
111+
tar cz -C {{.PLATFORM_DIR}} {{.PROJECT_NAME}} -f {{.PACKAGE_NAME}}
112+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
113+
vars:
114+
PLATFORM_DIR: "{{.PROJECT_NAME}}_linux_arm_7"
115+
PACKAGE_PLATFORM: "Linux_ARMv7"
116+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.tar.gz"
117+
118+
Linux_ARMv6:
119+
desc: Builds Linux ARMv6 binaries
120+
env:
121+
GOOS: "linux"
122+
GOARCH: "arm"
123+
GOARM: 6
124+
cmds:
125+
- |
126+
go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}} {{.LDFLAGS}}
127+
cd {{.DIST_DIR}}
128+
tar cz -C {{.PLATFORM_DIR}} {{.PROJECT_NAME}} -f {{.PACKAGE_NAME}}
129+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
130+
vars:
131+
PLATFORM_DIR: "{{.PROJECT_NAME}}_linux_arm_6"
132+
PACKAGE_PLATFORM: "Linux_ARMv6"
133+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.tar.gz"
134+
135+
Linux_ARM64:
136+
desc: Builds Linux ARM64 binaries
137+
env:
138+
GOOS: "linux"
139+
GOARCH: "arm64"
140+
cmds:
141+
- |
142+
go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}} {{.LDFLAGS}}
143+
cd {{.DIST_DIR}}
144+
tar cz -C {{.PLATFORM_DIR}} {{.PROJECT_NAME}} -f {{.PACKAGE_NAME}}
145+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
146+
vars:
147+
PLATFORM_DIR: "{{.PROJECT_NAME}}_linux_arm_64"
148+
PACKAGE_PLATFORM: "Linux_ARM64"
149+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.tar.gz"
150+
151+
macOS_64bit:
152+
desc: Builds Mac OS X 64 bit binaries
153+
env:
154+
GOOS: "darwin"
155+
GOARCH: "amd64"
156+
cmds:
157+
- |
158+
go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}} {{.LDFLAGS}}
159+
cd {{.DIST_DIR}}
160+
tar cz -C {{.PLATFORM_DIR}} {{.PROJECT_NAME}} -f {{.PACKAGE_NAME}}
161+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
162+
vars:
163+
PLATFORM_DIR: "{{.PROJECT_NAME}}_osx_darwin_amd64"
164+
PACKAGE_PLATFORM: "macOS_64bit"
165+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.tar.gz"

Taskfile.yml

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# See: https://taskfile.dev/#/usage
2+
version: "3"
3+
4+
includes:
5+
dist: ./DistTasks.yml
6+
7+
vars:
8+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/release-go-task/Taskfile.yml
9+
PROJECT_NAME: arduino-cslt
10+
DIST_DIR: "dist"
11+
# build vars
12+
COMMIT:
13+
sh: echo "$(git log --no-show-signature -n 1 --format=%h)"
14+
TIMESTAMP:
15+
sh: echo "$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
16+
TIMESTAMP_SHORT:
17+
sh: echo "{{now | date "20060102"}}"
18+
TAG:
19+
sh: echo "$(git tag --points-at=HEAD 2> /dev/null | head -n1)"
20+
VERSION: "{{if .NIGHTLY}}nightly-{{.TIMESTAMP_SHORT}}{{else if .TAG}}{{.TAG}}{{else}}{{.PACKAGE_NAME_PREFIX}}git-snapshot{{end}}"
21+
CONFIGURATION_PACKAGE: github.com/arduino/arduino-cslt/version
22+
# Path of the project's primary Go module:
23+
DEFAULT_GO_MODULE_PATH: ./
24+
DEFAULT_GO_PACKAGES:
25+
sh: |
26+
echo $(cd {{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}} && go list ./... | tr '\n' ' ' || echo '"ERROR: Unable to discover Go packages"')
27+
# `-ldflags` flag to use for `go build` command
28+
LDFLAGS: >-
29+
-ldflags
30+
'
31+
-X {{.CONFIGURATION_PACKAGE}}.Version={{.VERSION}}
32+
-X {{.CONFIGURATION_PACKAGE}}.Commit={{.COMMIT}}
33+
-X {{.CONFIGURATION_PACKAGE}}.Timestamp={{.TIMESTAMP}}
34+
'
35+
tasks:
36+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/go-task/Taskfile.yml
37+
go:build:
38+
desc: Build the Go code
39+
dir: "{{.DEFAULT_GO_MODULE_PATH}}"
40+
cmds:
41+
- go build -v {{.LDFLAGS}}

0 commit comments

Comments
 (0)