Draft release #89
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: Draft release | |
on: | |
workflow_dispatch: | |
inputs: | |
version: | |
description: The version to publish (include "v", i.e. "v4.9.1"). | |
type: string | |
required: true | |
permissions: | |
contents: write # For creating releases. | |
discussions: write # For creating a discussion. | |
# Cancel in-progress runs for pull requests when developers push | |
# additional changes | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: ${{ github.event_name == 'pull_request' }} | |
jobs: | |
# TODO: cache building yarn --production | |
# possibly 2m30s of savings(?) | |
# this requires refactoring our release scripts | |
package-linux-amd64: | |
name: x86-64 Linux build | |
runs-on: ubuntu-latest | |
timeout-minutes: 15 | |
needs: npm-version | |
container: "centos:7" | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
steps: | |
- name: Checkout repo | |
uses: actions/checkout@v3 | |
- name: Install Node.js v18 | |
uses: actions/setup-node@v3 | |
with: | |
node-version: "18" | |
- name: Install development tools | |
run: | | |
yum install -y epel-release centos-release-scl make | |
yum install -y devtoolset-9-{make,gcc,gcc-c++} jq rsync python3 | |
# for keytar | |
yum install -y libsecret-devel | |
# for kerberos | |
yum install -y krb5-devel | |
- name: Install nfpm and envsubst | |
run: | | |
mkdir -p ~/.local/bin | |
curl -sSfL https://github.com/goreleaser/nfpm/releases/download/v2.22.2/nfpm_2.22.2_`uname -s`_`uname -m`.tar.gz | tar -C ~/.local/bin -zxv nfpm | |
curl -sSfL https://github.com/a8m/envsubst/releases/download/v1.1.0/envsubst-`uname -s`-`uname -m` -o envsubst | |
chmod +x envsubst | |
mv envsubst ~/.local/bin | |
echo "$HOME/.local/bin" >> $GITHUB_PATH | |
- name: Install yarn | |
run: npm install -g yarn | |
- name: Download npm package | |
uses: actions/download-artifact@v3 | |
with: | |
name: npm-release-package | |
- name: Decompress npm package | |
run: tar -xzf package.tar.gz | |
# NOTE: && here is deliberate - GitHub puts each line in its own `.sh` | |
# file when running inside a docker container. | |
- name: Build standalone release | |
run: source scl_source enable devtoolset-9 && npm run release:standalone | |
- name: Install test dependencies | |
run: SKIP_SUBMODULE_DEPS=1 yarn --frozen-lockfile | |
- name: Run integration tests on standalone release | |
run: yarn test:integration | |
- name: Upload coverage report to Codecov | |
uses: codecov/codecov-action@v3 | |
with: | |
token: ${{ secrets.CODECOV_TOKEN }} | |
if: success() | |
# NOTE@jsjoeio - we do this so we can strip out the v | |
# i.e. v4.9.1 -> 4.9.1 | |
- name: Get and set VERSION | |
run: | | |
TAG="${{ inputs.version || github.ref_name }}" | |
echo "VERSION=${TAG#v}" >> $GITHUB_ENV | |
- name: Build packages with nfpm | |
env: | |
VERSION: ${{ env.VERSION }} | |
run: yarn package | |
- uses: softprops/action-gh-release@v1 | |
with: | |
draft: true | |
discussion_category_name: "📣 Announcements" | |
files: ./release-packages/* | |
# NOTE@oxy: | |
# We use Ubuntu 16.04 here, so that our build is more compatible | |
# with older libc versions. We used to (Q1'20) use CentOS 7 here, | |
# but it has a full update EOL of Q4'20 and a 'critical security' | |
# update EOL of 2024. We're dropping full support a few years before | |
# the final EOL, but I don't believe CentOS 7 has a large arm64 userbase. | |
# It is not feasible to cross-compile with CentOS. | |
# Cross-compile notes: To compile native dependencies for arm64, | |
# we install the aarch64/armv7l cross toolchain and then set it as the default | |
# compiler/linker/etc. with the AR/CC/CXX/LINK environment variables. | |
# qemu-user-static on ubuntu-16.04 currently doesn't run Node correctly, | |
# so we just build with "native"/x86_64 node, then download arm64/armv7l node | |
# and then put it in our release. We can't smoke test the cross build this way, | |
# but this means we don't need to maintain a self-hosted runner! | |
# NOTE@jsjoeio: | |
# We used to use 18.04 until GitHub browned it out on December 15, 2022 | |
# See here: https://github.com/actions/runner-images/issues/6002 | |
package-linux-cross: | |
name: Linux cross-compile builds | |
runs-on: ubuntu-20.04 | |
timeout-minutes: 15 | |
needs: npm-version | |
strategy: | |
matrix: | |
include: | |
- prefix: aarch64-linux-gnu | |
arch: arm64 | |
- prefix: arm-linux-gnueabihf | |
arch: armv7l | |
env: | |
AR: ${{ format('{0}-ar', matrix.prefix) }} | |
CC: ${{ format('{0}-gcc', matrix.prefix) }} | |
CXX: ${{ format('{0}-g++', matrix.prefix) }} | |
LINK: ${{ format('{0}-g++', matrix.prefix) }} | |
NPM_CONFIG_ARCH: ${{ matrix.arch }} | |
NODE_VERSION: v18.15.0 | |
steps: | |
- name: Checkout repo | |
uses: actions/checkout@v3 | |
- name: Install Node.js v18 | |
uses: actions/setup-node@v3 | |
with: | |
node-version: "18" | |
- name: Install nfpm | |
run: | | |
mkdir -p ~/.local/bin | |
curl -sSfL https://github.com/goreleaser/nfpm/releases/download/v2.3.1/nfpm_2.3.1_`uname -s`_`uname -m`.tar.gz | tar -C ~/.local/bin -zxv nfpm | |
echo "$HOME/.local/bin" >> $GITHUB_PATH | |
- name: Install cross-compiler and system dependencies | |
run: sudo apt update && sudo apt install -y $PACKAGE libkrb5-dev | |
env: | |
PACKAGE: ${{ format('g++-{0}', matrix.prefix) }} | |
- name: Download npm package | |
uses: actions/download-artifact@v3 | |
with: | |
name: npm-release-package | |
- name: Decompress npm package | |
run: tar -xzf package.tar.gz | |
# NOTE@jsjoeio - npm fails here | |
# so use yarn | |
- name: Build standalone release | |
run: yarn release:standalone | |
- name: Replace node with cross-compile equivalent | |
run: | | |
wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-${NPM_CONFIG_ARCH}.tar.xz | |
tar -xf node-${NODE_VERSION}-linux-${NPM_CONFIG_ARCH}.tar.xz node-${NODE_VERSION}-linux-${NPM_CONFIG_ARCH}/bin/node --strip-components=2 | |
mv ./node ./release-standalone/lib/node | |
# NOTE@jsjoeio - we do this so we can strip out the v | |
# i.e. v4.9.1 -> 4.9.1 | |
- name: Get and set VERSION | |
run: | | |
TAG="${{ inputs.version || github.ref_name }}" | |
echo "VERSION=${TAG#v}" >> $GITHUB_ENV | |
- name: Build packages with nfpm | |
env: | |
VERSION: ${{ env.VERSION }} | |
run: yarn package ${NPM_CONFIG_ARCH} | |
- uses: softprops/action-gh-release@v1 | |
with: | |
draft: true | |
discussion_category_name: "📣 Announcements" | |
files: ./release-packages/* | |
package-macos-amd64: | |
name: x86-64 macOS build | |
runs-on: macos-latest | |
timeout-minutes: 15 | |
needs: npm-version | |
steps: | |
- name: Checkout repo | |
uses: actions/checkout@v3 | |
- name: Install Node.js v18 | |
uses: actions/setup-node@v3 | |
with: | |
node-version: "18" | |
- name: Install nfpm | |
run: | | |
mkdir -p ~/.local/bin | |
curl -sSfL https://github.com/goreleaser/nfpm/releases/download/v2.3.1/nfpm_2.3.1_`uname -s`_`uname -m`.tar.gz | tar -C ~/.local/bin -zxv nfpm | |
echo "$HOME/.local/bin" >> $GITHUB_PATH | |
- name: Download npm package | |
uses: actions/download-artifact@v3 | |
with: | |
name: npm-release-package | |
- name: Decompress npm package | |
run: tar -xzf package.tar.gz | |
- name: Build standalone release | |
run: npm run release:standalone | |
- name: Install test dependencies | |
run: SKIP_SUBMODULE_DEPS=1 yarn install | |
- name: Run native module tests on standalone release | |
run: yarn test:native | |
# NOTE@jsjoeio - we do this so we can strip out the v | |
# i.e. v4.9.1 -> 4.9.1 | |
- name: Get and set VERSION | |
run: | | |
TAG="${{ inputs.version || github.ref_name }}" | |
echo "VERSION=${TAG#v}" >> $GITHUB_ENV | |
- name: Build packages with nfpm | |
env: | |
VERSION: ${{ env.VERSION }} | |
run: yarn package | |
- uses: softprops/action-gh-release@v1 | |
with: | |
draft: true | |
discussion_category_name: "📣 Announcements" | |
files: ./release-packages/* | |
npm-package: | |
name: Upload npm package | |
runs-on: ubuntu-latest | |
timeout-minutes: 15 | |
needs: npm-version | |
steps: | |
- name: Download npm package | |
uses: actions/download-artifact@v3 | |
with: | |
name: npm-release-package | |
- uses: softprops/action-gh-release@v1 | |
with: | |
draft: true | |
discussion_category_name: "📣 Announcements" | |
files: ./package.tar.gz | |
npm-version: | |
name: Modify package.json version | |
runs-on: ubuntu-latest | |
timeout-minutes: 15 | |
steps: | |
- name: Download artifacts | |
uses: dawidd6/action-download-artifact@v2 | |
id: download | |
with: | |
branch: ${{ github.ref }} | |
workflow: build.yaml | |
workflow_conclusion: completed | |
name: npm-package | |
check_artifacts: false | |
if_no_artifact_found: fail | |
- name: Decompress npm package | |
run: tar -xzf package.tar.gz | |
# NOTE@jsjoeio - we do this so we can strip out the v | |
# i.e. v4.9.1 -> 4.9.1 | |
- name: Get and set VERSION | |
run: | | |
TAG="${{ inputs.version || github.ref_name }}" | |
echo "VERSION=${TAG#v}" >> $GITHUB_ENV | |
- name: Modify version | |
env: | |
VERSION: ${{ env.VERSION }} | |
run: | | |
echo "Updating version in root package.json" | |
npm version --prefix release "$VERSION" | |
echo "Updating version in lib/vscode/product.json" | |
tmp=$(mktemp) | |
jq ".codeServerVersion = \"$VERSION\"" release/lib/vscode/product.json > "$tmp" && mv "$tmp" release/lib/vscode/product.json | |
# Ensure it has the same permissions as before | |
chmod 644 release/lib/vscode/product.json | |
- name: Compress release package | |
run: tar -czf package.tar.gz release | |
- name: Upload npm package artifact | |
uses: actions/upload-artifact@v3 | |
with: | |
name: npm-release-package | |
path: ./package.tar.gz |