Skip to content

Commit 0d660a6

Browse files
committed
Added gh-action workflows and build tasks
1 parent 68ebb5d commit 0d660a6

File tree

3 files changed

+701
-0
lines changed

3 files changed

+701
-0
lines changed

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

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/release-go-task.md
2+
name: Release
3+
4+
env:
5+
# As defined by the Taskfile's PROJECT_NAME variable
6+
PROJECT_NAME: arduino-language-server
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: /arduino-language-server/
11+
ARTIFACT_NAME: dist
12+
13+
on:
14+
push:
15+
tags:
16+
- "[0-9]+.[0-9]+.[0-9]+*"
17+
18+
jobs:
19+
create-release-artifacts:
20+
runs-on: ubuntu-latest
21+
22+
steps:
23+
- name: Checkout repository
24+
uses: actions/checkout@v2
25+
with:
26+
fetch-depth: 0
27+
28+
- name: Create changelog
29+
uses: arduino/create-changelog@v1
30+
with:
31+
tag-regex: '^[0-9]+\.[0-9]+\.[0-9]+.*$'
32+
filter-regex: '^\[(skip|changelog)[ ,-](skip|changelog)\].*'
33+
case-insensitive-regex: true
34+
changelog-file-path: "${{ env.DIST_DIR }}/CHANGELOG.md"
35+
36+
- name: Install Task
37+
uses: arduino/setup-task@v1
38+
with:
39+
repo-token: ${{ secrets.GITHUB_TOKEN }}
40+
version: 3.x
41+
42+
- name: Build
43+
run: task dist:all
44+
45+
- name: Upload artifacts
46+
uses: actions/upload-artifact@v2
47+
with:
48+
if-no-files-found: error
49+
name: ${{ env.ARTIFACT_NAME }}
50+
path: ${{ env.DIST_DIR }}
51+
52+
create-release:
53+
runs-on: ubuntu-latest
54+
55+
steps:
56+
- name: Download artifact
57+
uses: actions/download-artifact@v2
58+
with:
59+
name: ${{ env.ARTIFACT_NAME }}
60+
path: ${{ env.DIST_DIR }}
61+
62+
- name: Identify Prerelease
63+
# This is a workaround while waiting for create-release action
64+
# to implement auto pre-release based on tag
65+
id: prerelease
66+
run: |
67+
wget -q -P /tmp https://github.com/fsaintjacques/semver-tool/archive/3.0.0.zip
68+
unzip -p /tmp/3.0.0.zip semver-tool-3.0.0/src/semver >/tmp/semver && chmod +x /tmp/semver
69+
if [[ "$(/tmp/semver get prerel "${GITHUB_REF/refs\/tags\//}")" ]]; then echo "::set-output name=IS_PRE::true"; fi
70+
71+
- name: Create Github Release and upload artifacts
72+
uses: ncipollo/release-action@v1
73+
with:
74+
token: ${{ secrets.GITHUB_TOKEN }}
75+
bodyFile: ${{ env.DIST_DIR }}/CHANGELOG.md
76+
draft: false
77+
prerelease: ${{ steps.prerelease.outputs.IS_PRE }}
78+
# NOTE: "Artifact is a directory" warnings are expected and don't indicate a problem
79+
# (all the files we need are in the DIST_DIR root)
80+
artifacts: ${{ env.DIST_DIR }}/*
81+
82+
- name: Upload release files on Arduino downloads servers
83+
uses: docker://plugins/s3
84+
env:
85+
PLUGIN_SOURCE: "${{ env.DIST_DIR }}/*"
86+
PLUGIN_TARGET: ${{ env.AWS_PLUGIN_TARGET }}
87+
PLUGIN_STRIP_PREFIX: "${{ env.DIST_DIR }}/"
88+
PLUGIN_BUCKET: ${{ secrets.DOWNLOADS_BUCKET }}
89+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
90+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

Diff for: DistTasks.yml

+253
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
1+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/release-go-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+
# The project MUST contain a LICENSE.txt file in the root folder or packaging will fail.
19+
20+
vars:
21+
CONTAINER: "docker.elastic.co/beats-dev/golang-crossbuild"
22+
GO_VERSION: "1.16.4"
23+
CHECKSUM_FILE: "{{.VERSION}}-checksums.txt"
24+
25+
tasks:
26+
all:
27+
desc: Build for distribution for all platforms
28+
cmds:
29+
- task: Windows_32bit
30+
- task: Windows_64bit
31+
- task: Linux_32bit
32+
- task: Linux_64bit
33+
- task: Linux_ARMv6
34+
- task: Linux_ARMv7
35+
- task: Linux_ARM64
36+
- task: macOS_64bit
37+
38+
Windows_32bit:
39+
desc: Builds Windows 32 bit binaries
40+
dir: "{{.DIST_DIR}}"
41+
cmds:
42+
- |
43+
docker run -v `pwd`/..:/home/build -w /home/build \
44+
-e CGO_ENABLED=1 \
45+
{{.CONTAINER}}:{{.CONTAINER_TAG}} \
46+
--build-cmd "{{.BUILD_COMMAND}}" \
47+
-p "{{.BUILD_PLATFORM}}"
48+
49+
zip {{.PACKAGE_NAME}} {{.PLATFORM_DIR}}/{{.PROJECT_NAME}}.exe ../LICENSE.txt -j
50+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
51+
52+
vars:
53+
PLATFORM_DIR: "{{.PROJECT_NAME}}_windows_386"
54+
BUILD_COMMAND: "go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}}.exe {{.LDFLAGS}}"
55+
BUILD_PLATFORM: "windows/386"
56+
CONTAINER_TAG: "{{.GO_VERSION}}-main"
57+
PACKAGE_PLATFORM: "Windows_32bit"
58+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.zip"
59+
60+
Windows_64bit:
61+
desc: Builds Windows 64 bit binaries
62+
dir: "{{.DIST_DIR}}"
63+
cmds:
64+
- |
65+
docker run -v `pwd`/..:/home/build -w /home/build \
66+
-e CGO_ENABLED=1 \
67+
{{.CONTAINER}}:{{.CONTAINER_TAG}} \
68+
--build-cmd "{{.BUILD_COMMAND}}" \
69+
-p "{{.BUILD_PLATFORM}}"
70+
71+
zip {{.PACKAGE_NAME}} {{.PLATFORM_DIR}}/{{.PROJECT_NAME}}.exe ../LICENSE.txt -j
72+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
73+
74+
vars:
75+
PLATFORM_DIR: "{{.PROJECT_NAME}}_windows_amd64"
76+
BUILD_COMMAND: "go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}}.exe {{.LDFLAGS}}"
77+
BUILD_PLATFORM: "windows/amd64"
78+
CONTAINER_TAG: "{{.GO_VERSION}}-main"
79+
PACKAGE_PLATFORM: "Windows_64bit"
80+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.zip"
81+
82+
Linux_32bit:
83+
desc: Builds Linux 32 bit binaries
84+
dir: "{{.DIST_DIR}}"
85+
cmds:
86+
- |
87+
docker run -v `pwd`/..:/home/build -w /home/build \
88+
-e CGO_ENABLED=1 \
89+
{{.CONTAINER}}:{{.CONTAINER_TAG}} \
90+
--build-cmd "{{.BUILD_COMMAND}}" \
91+
-p "{{.BUILD_PLATFORM}}"
92+
93+
tar cz -C {{.PLATFORM_DIR}} {{.PROJECT_NAME}} -C ../.. LICENSE.txt -f {{.PACKAGE_NAME}}
94+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
95+
96+
vars:
97+
PLATFORM_DIR: "{{.PROJECT_NAME}}_linux_amd32"
98+
BUILD_COMMAND: "go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}} {{.LDFLAGS}}"
99+
BUILD_PLATFORM: "linux/386"
100+
CONTAINER_TAG: "{{.GO_VERSION}}-main"
101+
PACKAGE_PLATFORM: "Linux_32bit"
102+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.tar.gz"
103+
104+
Linux_64bit:
105+
desc: Builds Linux 64 bit binaries
106+
dir: "{{.DIST_DIR}}"
107+
cmds:
108+
- |
109+
docker run -v `pwd`/..:/home/build -w /home/build \
110+
-e CGO_ENABLED=1 \
111+
{{.CONTAINER}}:{{.CONTAINER_TAG}} \
112+
--build-cmd "{{.BUILD_COMMAND}}" \
113+
-p "{{.BUILD_PLATFORM}}"
114+
115+
tar cz -C {{.PLATFORM_DIR}} {{.PROJECT_NAME}} -C ../.. LICENSE.txt -f {{.PACKAGE_NAME}}
116+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
117+
118+
vars:
119+
PLATFORM_DIR: "{{.PROJECT_NAME}}_linux_amd64"
120+
BUILD_COMMAND: "go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}} {{.LDFLAGS}}"
121+
BUILD_PLATFORM: "linux/amd64"
122+
CONTAINER_TAG: "{{.GO_VERSION}}-main"
123+
PACKAGE_PLATFORM: "Linux_64bit"
124+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.tar.gz"
125+
126+
Linux_ARMv7:
127+
desc: Builds Linux ARMv7 binaries
128+
dir: "{{.DIST_DIR}}"
129+
cmds:
130+
- |
131+
docker run -v `pwd`/..:/home/build -w /home/build \
132+
-e CGO_ENABLED=1 \
133+
{{.CONTAINER}}:{{.CONTAINER_TAG}} \
134+
--build-cmd "{{.BUILD_COMMAND}}" \
135+
-p "{{.BUILD_PLATFORM}}"
136+
137+
tar cz -C {{.PLATFORM_DIR}} {{.PROJECT_NAME}} -C ../.. LICENSE.txt -f {{.PACKAGE_NAME}}
138+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
139+
140+
vars:
141+
PLATFORM_DIR: "{{.PROJECT_NAME}}_linux_arm_7"
142+
BUILD_COMMAND: "go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}} {{.LDFLAGS}}"
143+
BUILD_PLATFORM: "linux/armv7"
144+
CONTAINER_TAG: "{{.GO_VERSION}}-armhf"
145+
PACKAGE_PLATFORM: "Linux_ARMv7"
146+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.tar.gz"
147+
148+
Linux_ARMv6:
149+
desc: Builds Linux ARMv6 binaries
150+
dir: "{{.DIST_DIR}}"
151+
cmds:
152+
- |
153+
docker run -v `pwd`/..:/home/build -w /home/build \
154+
-e CGO_ENABLED=1 \
155+
{{.CONTAINER}}:{{.CONTAINER_TAG}} \
156+
--build-cmd "{{.BUILD_COMMAND}}" \
157+
-p "{{.BUILD_PLATFORM}}"
158+
159+
tar cz -C {{.PLATFORM_DIR}} {{.PROJECT_NAME}} -C ../.. LICENSE.txt -f {{.PACKAGE_NAME}}
160+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
161+
162+
vars:
163+
PLATFORM_DIR: "{{.PROJECT_NAME}}_linux_arm_6"
164+
BUILD_COMMAND: "go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}} {{.LDFLAGS}}"
165+
BUILD_PLATFORM: "linux/armv6"
166+
# We are experiencing the following error with ARMv6 build:
167+
#
168+
# # github.com/arduino/arduino-cli
169+
# net(.text): unexpected relocation type 296 (R_ARM_V4BX)
170+
# panic: runtime error: invalid memory address or nil pointer dereference
171+
# [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x51ae53]
172+
#
173+
# goroutine 1 [running]:
174+
# cmd/link/internal/loader.(*Loader).SymName(0xc000095c00, 0x0, 0xc0000958d8, 0x5a0ac)
175+
# /usr/local/go/src/cmd/link/internal/loader/loader.go:684 +0x53
176+
# cmd/link/internal/ld.dynrelocsym2(0xc000095880, 0x5a0ac)
177+
# /usr/local/go/src/cmd/link/internal/ld/data.go:777 +0x295
178+
# cmd/link/internal/ld.(*dodataState).dynreloc2(0xc007df9800, 0xc000095880)
179+
# /usr/local/go/src/cmd/link/internal/ld/data.go:794 +0x89
180+
# cmd/link/internal/ld.(*Link).dodata2(0xc000095880, 0xc007d00000, 0x60518, 0x60518)
181+
# /usr/local/go/src/cmd/link/internal/ld/data.go:1434 +0x4d4
182+
# cmd/link/internal/ld.Main(0x8729a0, 0x4, 0x8, 0x1, 0xd, 0xe, 0x0, 0x0, 0x6d7737, 0x12, ...)
183+
# /usr/local/go/src/cmd/link/internal/ld/main.go:302 +0x123a
184+
# main.main()
185+
# /usr/local/go/src/cmd/link/main.go:68 +0x1dc
186+
# Error: failed building for linux/armv6: exit status 2
187+
#
188+
# This seems to be a problem in the go builder 1.16.x that removed support for the R_ARM_V4BX instruction:
189+
# https://github.com/golang/go/pull/44998
190+
# https://groups.google.com/g/golang-codereviews/c/yzN80xxwu2E
191+
#
192+
# Until there is a fix released we must use a recent gcc for Linux_ARMv6 build, so for this
193+
# build we select the debian10 based container.
194+
CONTAINER_TAG: "{{.GO_VERSION}}-armel-debian10"
195+
PACKAGE_PLATFORM: "Linux_ARMv6"
196+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.tar.gz"
197+
198+
Linux_ARM64:
199+
desc: Builds Linux ARM64 binaries
200+
dir: "{{.DIST_DIR}}"
201+
cmds:
202+
- |
203+
docker run -v `pwd`/..:/home/build -w /home/build \
204+
-e CGO_ENABLED=1 \
205+
{{.CONTAINER}}:{{.CONTAINER_TAG}} \
206+
--build-cmd "{{.BUILD_COMMAND}}" \
207+
-p "{{.BUILD_PLATFORM}}"
208+
209+
tar cz -C {{.PLATFORM_DIR}} {{.PROJECT_NAME}} -C ../.. LICENSE.txt -f {{.PACKAGE_NAME}}
210+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
211+
212+
vars:
213+
PLATFORM_DIR: "{{.PROJECT_NAME}}_linux_arm_6"
214+
BUILD_COMMAND: "go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}} {{.LDFLAGS}}"
215+
BUILD_PLATFORM: "linux/arm64"
216+
CONTAINER_TAG: "{{.GO_VERSION}}-arm"
217+
PACKAGE_PLATFORM: "Linux_ARM64"
218+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.tar.gz"
219+
220+
macOS_64bit:
221+
desc: Builds Mac OS X 64 bit binaries
222+
dir: "{{.DIST_DIR}}"
223+
cmds:
224+
- |
225+
docker run -v `pwd`/..:/home/build -w /home/build \
226+
-e CGO_ENABLED=1 \
227+
{{.CONTAINER}}:{{.CONTAINER_TAG}} \
228+
--build-cmd "{{.BUILD_COMMAND}}" \
229+
-p "{{.BUILD_PLATFORM}}"
230+
231+
tar cz -C {{.PLATFORM_DIR}} {{.PROJECT_NAME}} -C ../.. LICENSE.txt -f {{.PACKAGE_NAME}}
232+
sha256sum {{.PACKAGE_NAME}} >> {{.CHECKSUM_FILE}}
233+
234+
vars:
235+
PLATFORM_DIR: "{{.PROJECT_NAME}}_osx_darwin_amd64"
236+
BUILD_COMMAND: "go build -o {{.DIST_DIR}}/{{.PLATFORM_DIR}}/{{.PROJECT_NAME}} {{.LDFLAGS}}"
237+
BUILD_PLATFORM: "darwin/amd64"
238+
# We are experiencing the following error with macOS_64bit build:
239+
#
240+
# Undefined symbols for architecture x86_64:
241+
# "_clock_gettime", referenced from:
242+
# _runtime.walltime_trampoline in go.o
243+
# ld: symbol(s) not found for architecture x86_64
244+
# clang: error: linker command failed with exit code 1 (use -v to see invocation)
245+
#
246+
# The reason seems that go 1.16.x use a macos API which is available since 10.12
247+
# https://github.com/techknowlogick/xgo/issues/100#issuecomment-780894190
248+
#
249+
# To compile it we need an SDK >=10.12 so we use the debian10 based container that
250+
# has the SDK 10.14 installed.
251+
CONTAINER_TAG: "{{.GO_VERSION}}-darwin-debian10"
252+
PACKAGE_PLATFORM: "macOS_64bit"
253+
PACKAGE_NAME: "{{.PROJECT_NAME}}_{{.VERSION}}_{{.PACKAGE_PLATFORM}}.tar.gz"

0 commit comments

Comments
 (0)