-
Notifications
You must be signed in to change notification settings - Fork 84
144 lines (144 loc) · 6.4 KB
/
ci.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
name: CI build
on:
workflow_dispatch:
pull_request:
push:
permissions:
contents: read
concurrency:
group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}'
cancel-in-progress: true
jobs:
# Keep in mind:
# 60 seconds on Ubuntu = 1 minute charged to account
# 60 seconds on Windows = 2 minutes charged to account
# 60 seconds on macOS = 10 minutes charged to account
semver:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
cache: 'npm'
node-version-file: '.nvmrc'
- run: npm ci
- name: Make local 'remote' for semantic-release
run: |
# semantic-release tracks channels with notes, so we need to grab those from the real remote
# semantic-release also wants to inspect every branch listed in its "branches" setting
git fetch -uf origin main:main develop:develop 'refs/notes/*:refs/notes/*'
git clone . --bare --mirror semantic-release-remote # mirror copies notes
git remote set-url origin "file://$(realpath semantic-release-remote)" # semantic-release needs a proper URL
- name: Stage semantic-release version commit
run: npx --no -- semantic-release
- name: Create artifact for semantic-release 'remote'
run: tar czvf semantic-release-remote.tgz semantic-release-remote
- uses: actions/upload-artifact@v3
with:
name: semantic-release-remote
path: semantic-release-remote.tgz
retention-days: 1 # relevant if a failure prevents the delete step below
build:
needs: semver
strategy:
fail-fast: false
matrix:
os: [macos-latest] # [windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Setup upterm session
uses: lhotari/action-upterm@v1
with:
limit-access-to-users: cwillisf
- uses: actions/checkout@v3
- uses: actions/download-artifact@v3
with:
name: semantic-release-remote
path: .
- name: Restore semantic-release 'remote'
shell: bash
run: |
# this `tar` command replaces the usual "checkout" step
tar xzvf semantic-release-remote.tgz
rm semantic-release-remote.tgz
- name: Pull semantic-release changes from local 'remote'
shell: bash
run: |
git remote add semantic-release semantic-release-remote
git pull --tags semantic-release ${{ github.ref_name }}
git fetch semantic-release 'refs/notes/*:refs/notes/*' # semantic-release tracks channels with notes
- name: Build Safari helper
if: runner.os == 'macOS'
env:
AC_USERNAME: ${{ secrets.AC_USERNAME }}
AC_PASSWORD: ${{ secrets.AC_USERNAME }}
run: xcodebuild -project "Scratch Link Safari Helper/Scratch Link Safari Helper.xcodeproj" -scheme "Scratch Link Safari Helper" clean build
- env:
CONFIG: Debug
ARTIFACT_TAG: Debug
name: "Build for Mac: ${{ env.CONFIG }}"
if: runner.os == 'macOS'
run: |
msbuild -m -t:Restore -p:Configuration=${CONFIG}_Mac scratch-link.sln
"/Applications/Visual Studio.app/Contents/MacOS/vstool" build -t:Build -c:${CONFIG}_Mac "${PWD}/scratch-link.sln"
# "for" is just a convenient way to resolve the glob to a variable so we can DRY the filename for "if" and "mv"
for PKGPATH in scratch-link-mac/bin/${CONFIG}/"Scratch Link"*.pkg; do
if [ -r "$PKGPATH" ]; then
PKGFILE="${PKGPATH##*/}"
if [ -n "${ARTIFACT_TAG}" ]; then
PKGFILE="${PKGFILE/Scratch Link/Scratch Link-${ARTIFACT_TAG}}"
fi
mkdir -p Artifacts
fi
# this is outside the "if" to force an error if the file doesn't exist
mv -v "$PKGPATH" "Artifacts/${PKGFILE}"
done
- name: Add msbuild to PATH
if: runner.os == 'Windows'
uses: microsoft/[email protected]
- env:
CONFIG: Debug
ARTIFACT_TAG: Debug
name: "Build for Windows: ${{ env.CONFIG }}"
if: runner.os == 'Windows'
run: |
# Build the MSIX project instead of the Solution because msbuild gets grumpy about the Mac project.
# That means SolutionDir needs to be set artificially, though.
# The `UapAppxPackageBuildMode=StoreAndSideload` means it'll build both MSIXUpload and MSIXBundle.
# The StoreUpload mode does that too, but that might be a bug, and semantically "StoreAndSideload" is what we want.
msbuild scratch-link-win-msix/scratch-link-win-msix.wapproj -maxCpuCount -restore -t:Build -p:SolutionDir="$PWD\" -p:Configuration="${env:CONFIG}_Win" -p:AppxBundlePlatforms="x86|x64|ARM64" -p:AppxBundle=Always -p:UapAppxPackageBuildMode=StoreAndSideload
- env:
CONFIG: Debug
ARTIFACT_TAG: Debug
name: "Move Windows artifacts into place: ${{ env.CONFIG }}"
if: runner.os == 'Windows'
shell: bash
run: |
mkdir -p Artifacts
# The store package is fine as is: no user will see this filename.
mv -v scratch-link-win-msix/AppPackages/scratch-link-win-msix_*_${CONFIG}_Win.msixupload Artifacts/
# Transform the bundle for a more user-friendly filename
for PKGPATH in scratch-link-win-msix/AppPackages/scratch-link-win-msix_*_${CONFIG}_Win_Test/scratch-link-win-msix_*_${CONFIG}_Win.msixbundle; do
if [ -r "$PKGPATH" ]; then
PKGFILE="${PKGPATH##*/}"
[[ $PKGFILE =~ scratch-link-win-msix_([.0-9]+)_(.*)_${CONFIG}_Win.msixbundle$ ]]
PKGVERSION=${BASH_REMATCH[1]}
PKGPLATFORMS=${BASH_REMATCH[2]}
fi
# do the move outside the "if" above to force an error if the file doesn't exist
if [ -z "${ARTIFACT_TAG}" ]; then
mv -v "$PKGPATH" "Artifacts/Scratch Link ${PKGVERSION}.msixbundle"
else
mv -v "$PKGPATH" "Artifacts/Scratch Link ${PKGVERSION} ${ARTIFACT_TAG}.msixbundle"
fi
done
- uses: actions/upload-artifact@v3
with:
path: Artifacts/
finish:
runs-on: ubuntu-latest
needs: build
steps:
- uses: geekyeggo/delete-artifact@v2
with:
name: semantic-release-remote