Skip to content

Release OpenVSCode Server #1186

Release OpenVSCode Server

Release OpenVSCode Server #1186

Workflow file for this run

name: Release OpenVSCode Server
on:
workflow_dispatch:
inputs:
commit:
description: 'Commit to release'
required: true
quality:
description: 'Quality'
required: true
type: choice
options:
- insider
- stable
default: insider
uploadRelease:
description: 'Create GitHub and DockerHub Release'
type: boolean
required: true
workflow_run:
workflows: ["OpenVSCode Server Rebase"]
types: [completed]
env:
QUALITY: ${{ github.event.inputs.quality || 'insider' }}
RELEASE_COMMIT: ${{ github.event.inputs.commit || 'main' }}
jobs:
build:
runs-on: ubuntu-latest
# support only linux for now
strategy:
fail-fast: true
matrix:
include:
- vscode_arch: x64
npm_arch: x64
deps_container: gitpod/openvscode-server-linux-build-agent:centos7-devtoolset8-x64
- vscode_arch: arm64
npm_arch: arm64
deps_container: gitpod/openvscode-server-linux-build-agent:centos7-devtoolset8-arm64
- vscode_arch: armhf
npm_arch: arm
name: Build linux-${{ matrix.vscode_arch }}
outputs:
release_commit: ${{ steps.bundle_tar.outputs.release_commit }}
version: ${{ steps.bundle_tar.outputs.version }}
quality: ${{ steps.bundle_tar.outputs.quality }}
env:
OS_NAME: 'linux'
VSCODE_ARCH: ${{ matrix.vscode_arch }}
NPM_REGISTRY: 'https://registry.npmjs.org'
steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- uses: actions/checkout@v4
with:
repository: ${{ github.repository_owner }}/openvscode-server
ref: ${{ env.RELEASE_COMMIT }}
fetch-depth: 20
path: openvscode-server
token: ${{ secrets.VSCODE_GITHUB_TOKEN }}
- uses: actions/setup-node@v4
with:
node-version-file: ./openvscode-server/.nvmrc
- name: Setup system services
working-directory: ./openvscode-server
run: |
set -e
# Start X server
./build/azure-pipelines/linux/apt-retry.sh sudo apt-get update
./build/azure-pipelines/linux/apt-retry.sh sudo apt-get install -y pkg-config \
dbus \
xvfb \
libgtk-3-0 \
libxkbfile-dev \
libkrb5-dev \
libgbm1 \
rpm
sudo cp build/azure-pipelines/linux/xvfb.init /etc/init.d/xvfb
sudo chmod +x /etc/init.d/xvfb
sudo update-rc.d xvfb defaults
sudo service xvfb start
# Start dbus session
sudo mkdir -p /var/run/dbus
DBUS_LAUNCH_RESULT=$(sudo dbus-daemon --config-file=/usr/share/dbus-1/system.conf --print-address)
- name: Compute node modules cache key
working-directory: ./openvscode-server
id: nodeModulesCacheKey
run: |
mkdir -p .build
echo "value=$(node build/azure-pipelines/common/computeNodeModulesCacheKey.js linux ${{ matrix.vscode_arch }})" >> $GITHUB_OUTPUT
- name: Cache node modules
id: cacheNodeModules
uses: actions/cache@v4
with:
path: "openvscode-server/**/node_modules"
key: ${{ runner.os }}-cacheNodeModulesLinux-${{ steps.nodeModulesCacheKey.outputs.value }}
- name: Get npm cache directory path
working-directory: ./openvscode-server
id: npmCacheDirPath
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
- name: Cache npm directory
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
uses: actions/cache@v4
with:
path: ${{ steps.npmCacheDirPath.outputs.dir }}
key: ${{ runner.os }}-npmCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
restore-keys: ${{ runner.os }}-npmCacheDir-
- name: Override gnu target for arm64 and arm
working-directory: ./openvscode-server
if: matrix.vscode_arch == 'arm64' || matrix.vscode_arch == 'armhf'
run: |
set -e
includes=$(cat << 'EOF'
{
"target_defaults": {
"conditions": [
["OS=='linux'", {
'cflags_cc!': [ '-std=gnu++20' ],
'cflags_cc': [ '-std=gnu++2a' ],
}]
]
}
}
EOF
)
if [ ! -d "$HOME/.gyp" ]; then
mkdir -p "$HOME/.gyp"
fi
echo "$includes" > "$HOME/.gyp/include.gypi"
- name: Execute npm
working-directory: ./openvscode-server
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
npm_config_arch: ${{ matrix.npm_arch }}
VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME: ${{ matrix.deps_container }}
VSCODE_HOST_MOUNT: ${{ github.workspace }}/openvscode-server
run: |
set -e
npm config set registry "$NPM_REGISTRY"
cd ./build
for i in {1..5}; do # try 5 times
npm ci && break
if [ $i -eq 5 ]; then
echo "Npm install failed too many times" >&2
exit 1
fi
echo "Npm install failed $i, trying again..."
done
cd ..
export VSCODE_SYSROOT_PREFIX='-glibc-2.17'
source ./build/azure-pipelines/linux/setup-env.sh --skip-sysroot
for i in {1..5}; do # try 5 times
npm ci && break
if [ $i -eq 5 ]; then
echo "Npm install failed too many times" >&2
exit 1
fi
echo "Npm install failed $i, trying again..."
done
- name: Update product.json
working-directory: ./openvscode-server
run: |
set -e
nameShort=$(jq --raw-output '.nameShort' product.json)
nameLong=$(jq --raw-output '.nameLong' product.json)
if [ "$QUALITY" = "insider" ]; then
nameShort="$nameShort - Insiders"
nameLong="$nameLong - Insiders"
fi
setQuality="setpath([\"quality\"]; \"$QUALITY\")"
setNameShort="setpath([\"nameShort\"]; \"$nameShort\")"
setNameLong="setpath([\"nameLong\"]; \"$nameLong\")"
jqCommands="${setQuality} | ${setNameShort} | ${setNameLong}"
cat product.json | jq "${jqCommands}" > product.json.tmp
mv product.json.tmp product.json
jq '{quality,nameLong,nameShort}' product.json
- name: Prepare for distribution
working-directory: ./openvscode-server
run: |
set -e
base_commit_msg="code web server initial commit"
base_commit=$(git log --pretty="%H" --max-count=1 --grep "${base_commit_msg}")
if [ -z "$base_commit" ]; then
echo "Could not find base commit"
exit 1
fi
distro_commit=$(git rev-parse "${base_commit}"~)
echo "distro_commit: ${distro_commit}"
VSCODE_DISTRO_COMMIT="${distro_commit}" \
npm run gulp vscode-reh-web-linux-${{ matrix.vscode_arch }}-min
env:
DISABLE_V8_COMPILE_CACHE: 1
- name: Download playwright
if: matrix.vscode_arch == 'x64'
working-directory: ./openvscode-server
run: |
npm run playwright-install
- name: Build integration tests
if: matrix.vscode_arch == 'x64'
working-directory: ./openvscode-server
run: |
set -e
npm run gulp \
compile-extension:configuration-editing \
compile-extension:css-language-features-server \
compile-extension:emmet \
compile-extension:git \
compile-extension:github-authentication \
compile-extension:html-language-features-server \
compile-extension:ipynb \
compile-extension:notebook-renderers \
compile-extension:json-language-features-server \
compile-extension:markdown-language-features \
compile-extension-media \
compile-extension:microsoft-authentication \
compile-extension:typescript-language-features \
compile-extension:vscode-api-tests \
compile-extension:vscode-colorize-tests \
compile-extension:vscode-test-resolver
- name: Compile Integration Tests
if: matrix.vscode_arch == 'x64'
working-directory: ./openvscode-server/test/integration/browser
run: npm run compile
- name: Compile Smoke Tests
if: matrix.vscode_arch == 'x64'
working-directory: ./openvscode-server/test/smoke
run: npm run compile
- name: Run integration tests
if: matrix.vscode_arch == 'x64'
working-directory: ./openvscode-server
run: |
set -e
VSCODE_REMOTE_SERVER_PATH="$GITHUB_WORKSPACE/vscode-reh-web-linux-${{ matrix.vscode_arch }}" \
./scripts/test-web-integration.sh --browser chromium
- name: Run smoke tests
if: matrix.vscode_arch == 'x64'
working-directory: ./openvscode-server
run: |
set -e
VSCODE_REMOTE_SERVER_PATH="$GITHUB_WORKSPACE/vscode-reh-web-linux-${{ matrix.vscode_arch }}" \
npm run smoketest-no-compile -- --web --tracing --headless --electronArgs="--disable-dev-shm-usage"
- name: Bundle tarfile
id: bundle_tar
run: |
set -e
version=$(node -p -e "require('./openvscode-server/package.json').version")
release_commit=$(git -C openvscode-server rev-parse "${RELEASE_COMMIT}")
quality_name=$([ "$QUALITY" = "insider" ] && echo "-insiders" || echo "")
name="openvscode-server${quality_name}-v${version}-linux-${{ matrix.vscode_arch }}"
mv vscode-reh-web-linux-${{ matrix.vscode_arch }} ${name}
tar -czf ${name}.tar.gz ${name}
echo "release_commit=${release_commit}" >> $GITHUB_OUTPUT
echo "version=${version}" >> $GITHUB_OUTPUT
echo "quality=${QUALITY}" >> $GITHUB_OUTPUT
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: linux-${{ matrix.vscode_arch }}
path: openvscode-server-*.tar.gz
- name: Get previous job's status
id: lastrun
uses: filiptronicek/get-last-job-status@main
- name: Slack Notification
if: ${{ (success() && steps.lastrun.outputs.status == 'failed') || failure() }}
uses: rtCamp/action-slack-notify@v2
env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
SLACK_COLOR: ${{ job.status }}
github-release:
needs: build
if: github.event.inputs.uploadRelease == 'true' || github.event.workflow_run.conclusion == 'success'
uses: ./.github/workflows/github-release.yml
with:
release_commit: ${{ needs.build.outputs.release_commit }}
version: ${{ needs.build.outputs.version }}
stable: ${{ needs.build.outputs.quality == 'stable' }}
secrets:
VSCODE_GITHUB_TOKEN: ${{ secrets.VSCODE_GITHUB_TOKEN }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
docker-release:
needs: [github-release, build]
if: github.event.inputs.uploadRelease == 'true' || github.event.workflow_run.conclusion == 'success'
uses: ./.github/workflows/docker-release.yml
with:
version: ${{ needs.build.outputs.version }}
stable: ${{ needs.build.outputs.quality == 'stable' }}
secrets:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}