Skip to content

Commit e679ddb

Browse files
committed
Move prebuilds to GitHub Actions
1 parent 2e9ea73 commit e679ddb

File tree

13 files changed

+518
-1
lines changed

13 files changed

+518
-1
lines changed

.github/workflows/prebuild.yaml

+234
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
name: Make Prebuilds
2+
on:
3+
push:
4+
branches:
5+
- 'master'
6+
paths:
7+
- '.github/workflows/prebuild.yaml'
8+
9+
# When a new Node.js version is released or for any other reason that a build
10+
# needs to be triggered, amend this file and force-push.
11+
12+
env:
13+
# These should generally be the same:
14+
CANVAS_VERSION_TO_BUILD: "2.6.1" # no "v" prefix. TODO switch to $GITHUB_REF if we switch to `on: release`
15+
CANVAS_PREBUILT_VERSION: "2.6.1"
16+
17+
jobs:
18+
Linux:
19+
strategy:
20+
matrix:
21+
# Make sure to set this for the other builds also!
22+
node: [8, 9, 10, 11, 12, 13, 14]
23+
name: Node.js ${{ matrix.node }} on Linux
24+
runs-on: ubuntu-latest
25+
container:
26+
image: chearon/canvas-prebuilt:7
27+
steps:
28+
- uses: actions/checkout@v2
29+
30+
- uses: actions/setup-node@v1
31+
with:
32+
node-version: ${{ matrix.node }}
33+
34+
- name: Build
35+
env:
36+
OS: ${{ runner.os }}
37+
run: |
38+
npm install -g node-gyp
39+
npm install --ignore-scripts
40+
. prebuild/$OS/preinstall.sh
41+
cp prebuild/$OS/binding.gyp binding.gyp
42+
node-gyp rebuild -j 2
43+
. prebuild/$OS/bundle.sh
44+
45+
- name: Test binary
46+
run: node -e "require('.')"
47+
48+
- name: Make bundle
49+
id: make_bundle
50+
run: . prebuild/tarball.sh
51+
52+
- name: Upload
53+
uses: actions/[email protected]
54+
with:
55+
script: |
56+
const fs = require("fs");
57+
const assetName = "${{ steps.make_bundle.outputs.asset_name }}";
58+
const tagName = `v${process.env.CANVAS_PREBUILT_VERSION}`;
59+
60+
const releases = await github.repos.listReleases({
61+
owner: process.env.GITHUB_REPOSITORY.split("/")[0],
62+
repo: process.env.GITHUB_REPOSITORY.split("/")[1]
63+
});
64+
const release = releases.data.find(r => r.tag_name === tagName);
65+
66+
for (const asset of release.assets) {
67+
if (asset.name === assetName) {
68+
await github.repos.deleteReleaseAsset({
69+
owner: process.env.GITHUB_REPOSITORY.split("/")[0],
70+
repo: process.env.GITHUB_REPOSITORY.split("/")[1],
71+
asset_id: asset.id
72+
});
73+
break;
74+
}
75+
}
76+
77+
// (This is equivalent to actions/upload-release-asset. We're
78+
// already in a script, so might as well do it here.)
79+
const r = await github.repos.uploadReleaseAsset({
80+
url: release.upload_url,
81+
headers: {
82+
"content-type": "application/x-gzip",
83+
"content-length": `${fs.statSync(assetName).size}`
84+
},
85+
name: assetName,
86+
data: fs.readFileSync(assetName)
87+
});
88+
89+
macOS:
90+
strategy:
91+
matrix:
92+
node: [8, 9, 10, 11, 12, 13, 14]
93+
name: Node.js ${{ matrix.node }} on macOS
94+
runs-on: macos-latest
95+
steps:
96+
- uses: actions/checkout@v2
97+
98+
- uses: actions/setup-node@v1
99+
with:
100+
node-version: ${{ matrix.node }}
101+
102+
- name: Build
103+
env:
104+
OS: ${{ runner.os }}
105+
run: |
106+
npm install -g node-gyp
107+
npm install --ignore-scripts
108+
. prebuild/$OS/preinstall.sh
109+
cp prebuild/$OS/binding.gyp binding.gyp
110+
node-gyp rebuild -j 2
111+
. prebuild/$OS/bundle.sh
112+
113+
- name: Test binary
114+
run: node -e "require('.')"
115+
116+
- name: Make bundle
117+
id: make_bundle
118+
run: . prebuild/tarball.sh
119+
120+
- name: Upload
121+
uses: actions/[email protected]
122+
with:
123+
script: |
124+
const fs = require("fs");
125+
const assetName = "${{ steps.make_bundle.outputs.asset_name }}";
126+
const tagName = `v${process.env.CANVAS_PREBUILT_VERSION}`;
127+
128+
const releases = await github.repos.listReleases({
129+
owner: process.env.GITHUB_REPOSITORY.split("/")[0],
130+
repo: process.env.GITHUB_REPOSITORY.split("/")[1]
131+
});
132+
const release = releases.data.find(r => r.tag_name === tagName);
133+
134+
for (const asset of release.assets) {
135+
if (asset.name === assetName) {
136+
await github.repos.deleteReleaseAsset({
137+
owner: process.env.GITHUB_REPOSITORY.split("/")[0],
138+
repo: process.env.GITHUB_REPOSITORY.split("/")[1],
139+
asset_id: asset.id
140+
});
141+
break;
142+
}
143+
}
144+
145+
// (This is equivalent to actions/upload-release-asset. We're
146+
// already in a script, so might as well do it here.)
147+
const r = await github.repos.uploadReleaseAsset({
148+
url: release.upload_url,
149+
headers: {
150+
"content-type": "application/x-gzip",
151+
"content-length": `${fs.statSync(assetName).size}`
152+
},
153+
name: assetName,
154+
data: fs.readFileSync(assetName)
155+
});
156+
157+
Win:
158+
strategy:
159+
matrix:
160+
node: [8, 9, 10, 11, 12, 13, 14]
161+
name: Node.js ${{ matrix.node }} on Windows
162+
runs-on: windows-latest
163+
steps:
164+
# TODO drop when https://github.com/actions/virtual-environments/pull/632 lands
165+
- uses: numworks/setup-msys2@v1
166+
with:
167+
update: true
168+
path-type: inherit
169+
170+
- uses: actions/setup-node@v1
171+
with:
172+
node-version: ${{ matrix.node }}
173+
174+
- uses: actions/checkout@v2
175+
176+
- name: Setup
177+
run: |
178+
msys2do npm install -g node-gyp
179+
msys2do npm install --ignore-scripts
180+
msys2do . prebuild/Windows/preinstall.sh
181+
182+
- name: Build
183+
run: |
184+
msys2do cp prebuild/Windows/binding.gyp binding.gyp
185+
msys2do node-gyp configure
186+
msys2do node-gyp rebuild -j 2
187+
188+
- name: Bundle
189+
run: msys2do . prebuild/Windows/bundle.sh
190+
191+
- name: Test binary
192+
run: node -e "require('.')"
193+
194+
- name: Make asset
195+
id: make_bundle
196+
# I can't figure out why this isn't an env var already. It shows up with `env`.
197+
run: msys2do CANVAS_PREBUILT_VERSION=${{ env.CANVAS_PREBUILT_VERSION }} . prebuild/tarball.sh
198+
199+
- name: Upload
200+
uses: actions/[email protected]
201+
with:
202+
script: |
203+
const fs = require("fs");
204+
const assetName = "${{ steps.make_bundle.outputs.asset_name }}";
205+
const tagName = `v${process.env.CANVAS_PREBUILT_VERSION}`;
206+
207+
const releases = await github.repos.listReleases({
208+
owner: process.env.GITHUB_REPOSITORY.split("/")[0],
209+
repo: process.env.GITHUB_REPOSITORY.split("/")[1]
210+
});
211+
const release = releases.data.find(r => r.tag_name === tagName);
212+
213+
for (const asset of release.assets) {
214+
if (asset.name === assetName) {
215+
await github.repos.deleteReleaseAsset({
216+
owner: process.env.GITHUB_REPOSITORY.split("/")[0],
217+
repo: process.env.GITHUB_REPOSITORY.split("/")[1],
218+
asset_id: asset.id
219+
});
220+
break;
221+
}
222+
}
223+
224+
// (This is equivalent to actions/upload-release-asset. We're
225+
// already in a script, so might as well do it here.)
226+
const r = await github.repos.uploadReleaseAsset({
227+
url: release.upload_url,
228+
headers: {
229+
"content-type": "application/x-gzip",
230+
"content-length": `${fs.statSync(assetName).size}`
231+
},
232+
name: assetName,
233+
data: fs.readFileSync(assetName)
234+
});

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"binary": {
3636
"module_name": "canvas",
3737
"module_path": "build/Release",
38-
"host": "https://github.com/node-gfx/node-canvas-prebuilt/releases/download/",
38+
"host": "https://github.com/Automattic/node-canvas/releases/download/",
3939
"remote_path": "v{version}",
4040
"package_name": "{module_name}-v{version}-{node_abi}-{platform}-{libc}-{arch}.tar.gz"
4141
},

prebuild/Linux/binding.gyp

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{
2+
'targets': [
3+
{
4+
'target_name': 'canvas',
5+
'sources': [
6+
'src/backend/Backend.cc',
7+
'src/backend/ImageBackend.cc',
8+
'src/backend/PdfBackend.cc',
9+
'src/backend/SvgBackend.cc',
10+
'src/bmp/BMPParser.cc',
11+
'src/Backends.cc',
12+
'src/Canvas.cc',
13+
'src/CanvasGradient.cc',
14+
'src/CanvasPattern.cc',
15+
'src/CanvasRenderingContext2d.cc',
16+
'src/closure.cc',
17+
'src/color.cc',
18+
'src/Image.cc',
19+
'src/ImageData.cc',
20+
'src/init.cc',
21+
'src/register_font.cc'
22+
],
23+
'defines': [
24+
'HAVE_GIF',
25+
'HAVE_JPEG',
26+
'HAVE_RSVG'
27+
],
28+
'libraries': [
29+
'<!@(pkg-config pixman-1 --libs)',
30+
'<!@(pkg-config cairo --libs)',
31+
'<!@(pkg-config libpng --libs)',
32+
'<!@(pkg-config pangocairo --libs)',
33+
'<!@(pkg-config freetype2 --libs)',
34+
'<!@(pkg-config librsvg-2.0 --libs)',
35+
'-ljpeg',
36+
'-lgif'
37+
],
38+
'include_dirs': [
39+
'<!(node -e "require(\'nan\')")',
40+
'<!@(pkg-config cairo --cflags-only-I | sed s/-I//g)',
41+
'<!@(pkg-config libpng --cflags-only-I | sed s/-I//g)',
42+
'<!@(pkg-config pangocairo --cflags-only-I | sed s/-I//g)',
43+
'<!@(pkg-config freetype2 --cflags-only-I | sed s/-I//g)',
44+
'<!@(pkg-config librsvg-2.0 --cflags-only-I | sed s/-I//g)'
45+
],
46+
'ldflags': [
47+
'-Wl,-rpath \'-Wl,$$ORIGIN\''
48+
],
49+
'cflags!': ['-fno-exceptions'],
50+
'cflags_cc!': ['-fno-exceptions']
51+
}
52+
]
53+
}

prebuild/Linux/bundle.sh

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
copies=$(lddtree.sh -l node-canvas/build/Release/canvas.node | sed -r -e '/^\/lib/d' -e '/canvas.node$/d');
2+
3+
for so in $copies; do
4+
cp $so node-canvas/build/Release
5+
done;

prebuild/Linux/preinstall.sh

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# apt-get-style dependencies aren't done here since the
2+
# linux build is done on a docker image that has them
3+
4+
git clone git://anongit.gentoo.org/proj/pax-utils.git
5+
cd pax-utils
6+
PATH=$PATH:$PWD
7+
make
8+
cd ..

prebuild/Windows/binding.gyp

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
{
2+
'targets': [
3+
{
4+
'target_name': 'canvas',
5+
'sources': [
6+
'src/backend/Backend.cc',
7+
'src/backend/ImageBackend.cc',
8+
'src/backend/PdfBackend.cc',
9+
'src/backend/SvgBackend.cc',
10+
'src/bmp/BMPParser.cc',
11+
'src/Backends.cc',
12+
'src/Canvas.cc',
13+
'src/CanvasGradient.cc',
14+
'src/CanvasPattern.cc',
15+
'src/CanvasRenderingContext2d.cc',
16+
'src/closure.cc',
17+
'src/color.cc',
18+
'src/Image.cc',
19+
'src/ImageData.cc',
20+
'src/init.cc',
21+
'src/register_font.cc'
22+
],
23+
'defines': [
24+
'HAVE_GIF',
25+
'HAVE_JPEG',
26+
'HAVE_RSVG',
27+
'HAVE_BOOLEAN', # or jmorecfg.h tries to define it
28+
'_USE_MATH_DEFINES' # for M_PI
29+
],
30+
'libraries': [
31+
'D:/a/_temp/msys/msys64/mingw64/lib/libcairo-2.lib',
32+
'D:/a/_temp/msys/msys64/mingw64/lib/libpng16-16.lib',
33+
'D:/a/_temp/msys/msys64/mingw64/lib/libjpeg-8.lib',
34+
'D:/a/_temp/msys/msys64/mingw64/lib/libpango-1.0-0.lib',
35+
'D:/a/_temp/msys/msys64/mingw64/lib/libpangocairo-1.0-0.lib',
36+
'D:/a/_temp/msys/msys64/mingw64/lib/libgobject-2.0-0.lib',
37+
'D:/a/_temp/msys/msys64/mingw64/lib/libglib-2.0-0.lib',
38+
'D:/a/_temp/msys/msys64/mingw64/lib/libturbojpeg.lib',
39+
'D:/a/_temp/msys/msys64/mingw64/lib/libgif-7.lib',
40+
'D:/a/_temp/msys/msys64/mingw64/lib/libfreetype-6.lib',
41+
'D:/a/_temp/msys/msys64/mingw64/lib/librsvg-2-2.lib'
42+
],
43+
'include_dirs': [
44+
'<!(node -e "require(\'nan\')")',
45+
'D:/a/_temp/msys/msys64/mingw64/include',
46+
'D:/a/_temp/msys/msys64/mingw64/include/pango-1.0',
47+
'D:/a/_temp/msys/msys64/mingw64/include/cairo',
48+
'D:/a/_temp/msys/msys64/mingw64/include/libpng16',
49+
'D:/a/_temp/msys/msys64/mingw64/include/glib-2.0',
50+
'D:/a/_temp/msys/msys64/mingw64/lib/glib-2.0/include',
51+
'D:/a/_temp/msys/msys64/mingw64/include/pixman-1',
52+
'D:/a/_temp/msys/msys64/mingw64/include/freetype2',
53+
'D:/a/_temp/msys/msys64/mingw64/include/fontconfig',
54+
'D:/a/_temp/msys/msys64/mingw64/include/librsvg-2.0',
55+
'D:/a/_temp/msys/msys64/mingw64/include/gdk-pixbuf-2.0'
56+
],
57+
'configurations': {
58+
'Debug': {
59+
'msvs_settings': {
60+
'VCCLCompilerTool': {
61+
'WarningLevel': 4,
62+
'ExceptionHandling': 1,
63+
'DisableSpecificWarnings': [4100, 4127, 4201, 4244, 4267, 4506, 4611, 4714, 4512]
64+
}
65+
}
66+
},
67+
'Release': {
68+
'msvs_settings': {
69+
'VCCLCompilerTool': {
70+
'WarningLevel': 4,
71+
'ExceptionHandling': 1,
72+
'DisableSpecificWarnings': [4100, 4127, 4201, 4244, 4267, 4506, 4611, 4714, 4512]
73+
}
74+
}
75+
}
76+
}
77+
}
78+
]
79+
}

0 commit comments

Comments
 (0)