-
-
Notifications
You must be signed in to change notification settings - Fork 143
178 lines (154 loc) · 6.25 KB
/
build.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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
name: Build Pulsar Binaries
on:
push:
branches:
- 'master'
pull_request:
workflow_dispatch:
env:
# Variables needed for build information
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PYTHON_VERSION: '3.10'
NODE_VERSION: 16
ROLLING_UPLOAD_TOKEN: ${{ secrets.ROLLING_RELEASE_UPLOAD_TOKEN }}
# Below variables allow us to quickly control visual tests for each platform
RUN_WINDOWS_VT: false
RUN_LINUX_VT: true
RUN_MACOS_VT: true
jobs:
build:
strategy:
matrix:
os: [ ubuntu-latest, windows-latest, macos-latest ]
fail-fast: false
runs-on: ${{ matrix.os }}
steps:
- name: Checkout the latest code
uses: actions/checkout@v3
- name: Setup Node
if: ${{ runner.os != 'macOS' }}
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
- name: Setup Node (macOS)
if: ${{ runner.os == 'macOS' }}
run: |
npx -y [email protected] --version # populate the npx cache as a non-root user, otherwise root-owned cache files break any future npx runs
sudo npx [email protected] install ${{ env.NODE_VERSION }}
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: Setup Git Submodule
run: |
git submodule init
git submodule update
- name: Check Pulsar Version
if: ${{ runner.os != 'Windows' }}
run: sed -i -e "s/[0-9]*-dev/`date -u +%Y%m%d%H`/g" package.json
- name: Check Pulsar Version - Windows
if: ${{ runner.os == 'Windows' }}
run: (Get-Content package.json) -replace '[0-9]*-dev', (date -u +%Y%m%d%H) | Set-Content -Path package.json
- name: Reinstall Current Node-GYP NodeJS Headers
# Overwrite bad headers that get downloaded.
# NodeJS versions above 16 should come with `[email protected]` that has a fix
# for this issue. At that point this additional step can be removed.
run: npx node-gyp install ${{ env.NODE_VERSION }}
- name: Install Pulsar Dependencies
uses: nick-fields/retry@943e742917ac94714d2f408a0e8320f2d1fcafcd
with:
timeout_minutes: 30
max_attempts: 3
retry_on: error
command: yarn install --ignore-engines
on_retry_command: rm -R node_modules
- name: Build Pulsar
uses: nick-fields/retry@943e742917ac94714d2f408a0e8320f2d1fcafcd
with:
timeout_minutes: 30
max_attempts: 3
retry_on: error
command: |
yarn build
yarn run build:apm
# macOS Signing Stuff
- name: Build Pulsar Binaries (macOS)
if: ${{ runner.os == 'macOS' }}
# PRs generated from forks cannot access GitHub Secrets
# So if the PR is a fork, we will still build, but will not sign.
env:
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
APPLEID: ${{ secrets.APPLEID }}
APPLEID_PASSWORD: ${{ secrets.APPLEID_PASSWORD }}
TEAM_ID: ${{ secrets.TEAM_ID }}
uses: nick-fields/retry@943e742917ac94714d2f408a0e8320f2d1fcafcd
with:
timeout_minutes: 30
max_attempts: 3
retry_on: error
command: |
for var in CSC_LINK CSC_KEY_PASSWORD APPLEID APPLEID_PASSWORD TEAM_ID; do
# Fully unset these env vars if have been set as empty (such as when not decrypted for PRs),
# since otherwise they will make electron-builder try to sign and fail if they are set empty.
if [[ -z ${!var} ]]; then unset ${var}; fi
done
yarn dist
- name: Build Pulsar Binaries
if: ${{ runner.os != 'macOS' }}
uses: nick-fields/retry@943e742917ac94714d2f408a0e8320f2d1fcafcd
with:
timeout_minutes: 30
max_attempts: 3
retry_on: error
command: yarn dist
- name: Rename Pulsar Binaries for Regular release (Linux)
if: ${{ runner.os == 'Linux' }}
run: node ./script/rename.js "Linux"
- name: Rename Pulsar Binaries for Regular release (macOS)
if: ${{ runner.os == 'macOS' }}
run: node ./script/rename.js "Intel.Mac"
- name: Rename Pulsar Binaries for Regular release (Windows)
if: ${{ runner.os == 'Windows' }}
run: node ./script/rename.js "Windows"
- name: Upload Binary Artifacts
uses: actions/upload-artifact@v3
with:
name: ${{ matrix.os }} Binaries
path: ./binaries/*
- name: Test Binary - Linux
if: ${{ (runner.os == 'Linux') && env.RUN_LINUX_VT }}
run: |
rm -R node_modules/electron; yarn install --check-files
./binaries/*AppImage --appimage-extract
export BINARY_NAME='squashfs-root/pulsar'
mkdir -p ./tests/videos
Xvfb -screen 0 1024x768x24+32 :99 & nohup ffmpeg -video_size 1024x768 -f x11grab -i :99.0 ./tests/videos/out.mpg & DISPLAY=:99 PLAYWRIGHT_JUNIT_OUTPUT_NAME=report.xml npx playwright test --reporter=junit,list
- name: Test Binary - Windows
if: runner.os == 'Windows' && env.RUN_WINDOWS_VT == true
# TODO: Convert script to PowerShell
run: |
mkdir extracted; tar -xf binaries/*zip -C ./extracted/
export BINARY_NAME=./extracted/Pulsar.exe
PLAYWRIGHT_JUNIT_OUTPUT_NAME=report.xml npx playwright test --reporter=junit,list || echo "Yeah, tests failed, Windows is like this"
- name: Test Binary - macOS
if: runner.os == 'macOS' && env.RUN_MACOS_VT == true
run: |
export PATH="/usr/local/opt/node@16/bin:/usr/local/bin:$PATH"
rm -R node_modules/electron; yarn install --check-files
hdiutil mount binaries/*Pulsar*dmg
export BINARY_NAME=`ls /Volumes/Pulsar*/Pulsar.app/Contents/MacOS/Pulsar`
PLAYWRIGHT_JUNIT_OUTPUT_NAME=report.xml arch -x86_64 npx playwright test --reporter=junit,list
- name: Add binaries to Rolling Release Repo
if: ${{ github.event_name == 'push' }}
# We only want to upload rolling binaries if they are a commit to master
# Otherwise we want to not upload if it's a PR or manually triggered build
run: |
cd ./script/rolling-release-scripts
npm install
node ./rolling-release-binary-upload.js
- name: Upload Video Artifacts
uses: actions/upload-artifact@v3
with:
name: ${{ matrix.os }} Videos
path: ./tests/videos/**