Make Prebuilds #12
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Make Prebuilds | |
on: workflow_dispatch | |
jobs: | |
Linux: | |
strategy: | |
matrix: | |
node: [18.12.0, 20.9.0] | |
canvas_tag: ["v2.11.2"] # Specify the canvas tag to build | |
name: ${{ matrix.canvas_tag }}, Node.js ${{ matrix.node }}, Linux | |
runs-on: ubuntu-latest | |
container: | |
image: node:${{ matrix.node }}-slim | |
env: | |
CANVAS_VERSION_TO_BUILD: ${{ matrix.canvas_tag }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
ref: ${{ matrix.canvas_tag }} | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ matrix.node }} | |
- name: Install dependencies | |
run: | | |
apt-get update && apt-get install -y \ | |
build-essential \ | |
git \ | |
make \ | |
libcairo2-dev \ | |
libpango1.0-dev \ | |
libjpeg-dev \ | |
libgif-dev \ | |
librsvg2-dev \ | |
pkg-config \ | |
python3 | |
npm install -g node-gyp | |
npm install --ignore-scripts | |
npm install nan | |
- name: Build | |
run: | | |
cp prebuild/Linux/binding.gyp binding.gyp | |
node-gyp rebuild -j 2 | |
. prebuild/Linux/bundle.sh | |
- name: Test binary | |
run: npm test | |
- name: Make bundle | |
id: make_bundle | |
run: . prebuild/tarball.sh | |
- name: Upload | |
uses: actions/github-script@0.9.0 | |
with: | |
script: | | |
const fs = require("fs"); | |
const assetName = "${{ steps.make_bundle.outputs.asset_name }}"; | |
const tagName = process.env.UPLOAD_TO || process.env.CANVAS_VERSION_TO_BUILD; | |
const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/"); | |
const releases = await github.repos.listReleases({ owner, repo }); | |
const release = releases.data.find(r => r.tag_name === tagName); | |
if (!release) | |
throw new Error(`Tag ${tagName} not found. Did you make the GitHub release?`); | |
const oldAsset = release.assets.find(a => a.name === assetName); | |
if (oldAsset) | |
await github.repos.deleteReleaseAsset({ owner, repo, asset_id: oldAsset.id }); | |
// (This is equivalent to actions/upload-release-asset. We're | |
// already in a script, so might as well do it here.) | |
const r = await github.repos.uploadReleaseAsset({ | |
url: release.upload_url, | |
headers: { | |
"content-type": "application/x-gzip", | |
"content-length": `${fs.statSync(assetName).size}` | |
}, | |
name: assetName, | |
data: fs.readFileSync(assetName) | |
}); | |
macOS: | |
strategy: | |
matrix: | |
node: [18.12.0, 20.9.0] | |
canvas_tag: ["v2.11.2"] # Ensure this tag exists in your repository | |
os: [x64, arm64] | |
name: ${{ matrix.canvas_tag }}, Node.js ${{ matrix.node }}, macOS ${{ matrix.os }} | |
runs-on: ${{ matrix.os == 'arm64' && 'macos-latest-xlarge' || 'macos-latest' }} | |
env: | |
CANVAS_VERSION_TO_BUILD: ${{ matrix.canvas_tag }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
ref: ${{ matrix.canvas_tag }} | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ matrix.node }} | |
- name: Build | |
run: | | |
npm install -g node-gyp | |
npm install --ignore-scripts | |
. prebuild/macOS/preinstall.sh | |
cp prebuild/macOS/binding.gyp binding.gyp | |
node-gyp rebuild -j 2 --arch=${{ matrix.os }} | |
. prebuild/macOS/bundle.sh | |
- name: Test binary | |
run: | | |
brew uninstall --force cairo pango librsvg giflib harfbuzz | |
npm test | |
- name: Make bundle | |
id: make_bundle | |
run: . prebuild/tarball.sh | |
- name: Upload | |
uses: actions/github-script@0.9.0 | |
with: | |
script: | | |
const fs = require("fs"); | |
const assetName = "${{ steps.make_bundle.outputs.asset_name }}"; | |
const tagName = process.env.UPLOAD_TO || process.env.CANVAS_VERSION_TO_BUILD; | |
const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/"); | |
const releases = await github.repos.listReleases({ owner, repo }); | |
const release = releases.data find(r => r.tag_name === tagName); | |
if (!release) | |
throw new Error(`Tag ${tagName} not found. Did you make the GitHub release?`); | |
const oldAsset = release.assets find(a => a.name === assetName); | |
if (oldAsset) | |
await github.repos deleteReleaseAsset({ owner, repo, asset_id: oldAsset.id }); | |
// (This is equivalent to actions/upload-release-asset. We're | |
// already in a script, so might as well do it here.) | |
const r = await github.repos uploadReleaseAsset({ | |
url: release.upload_url, | |
headers: { | |
"content-type": "application/x-gzip", | |
"content-length": `${fs.statSync(assetName).size}` | |
}, | |
name: assetName, | |
data: fs.readFileSync(assetName) | |
}); | |
Win: | |
strategy: | |
matrix: | |
node: [18.12.0, 20.9.0] | |
canvas_tag: ["v2.11.2"] # Ensure this tag exists in your repository | |
name: ${{ matrix.canvas_tag }}, Node.js ${{ matrix.node }}, Windows | |
runs-on: windows-latest | |
env: | |
CANVAS_VERSION_TO_BUILD: ${{ matrix.canvas_tag }} | |
steps: | |
# TODO drop when https://github.com/actions/virtual-environments/pull/632 lands | |
- uses: numworks/setup-msys2@v1 | |
with: | |
update: true | |
path-type: inherit | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ matrix.node }} | |
- uses: actions/checkout@v4 | |
with: | |
ref: ${{ matrix.canvas_tag }} | |
- name: Build | |
run: | | |
npm install -g node-gyp | |
npm install --ignore-scripts | |
msys2do . prebuild/Windows/preinstall.sh | |
msys2do cp prebuild/Windows/binding.gyp binding.gyp | |
msys2do node-gyp configure | |
msys2do node-gyp rebuild -j 2 | |
- name: Bundle | |
run: msys2do . prebuild/Windows/bundle.sh | |
- name: Test binary | |
# By not running in msys2, this doesn't have access to the msys2 libs | |
run: npm test | |
- name: Make asset | |
id: make_bundle | |
# I can't figure out why this isn't an env var already. It shows up with `env`. | |
run: msys2do UPLOAD_TO=${{ env.UPLOAD_TO }} CANVAS_VERSION_TO_BUILD=${{ env.CANVAS_VERSION_TO_BUILD}} . prebuild/tarball.sh | |
- name: Upload | |
uses: actions/github-script@0.9.0 | |
with: | |
script: | | |
const fs = require("fs"); | |
const assetName = "${{ steps.make_bundle.outputs.asset_name }}"; | |
const tagName = process.env.UPLOAD_TO || process.env.CANVAS_VERSION_TO_BUILD; | |
const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/"); | |
const releases = await github.repos.listReleases({ owner, repo }); | |
const release is releases.data find(r => r.tag_name === tagName); | |
if (!release) | |
throw new Error(`Tag ${tagName} not found. Did you make the GitHub release?`); | |
const o |