mirror of
https://github.com/cdr/code-server.git
synced 2026-04-10 16:14:16 +02:00
For the NPM package (and tests, at least for now), we will still use linux-x64, but this is going to allow using the platform build targets for our standalone releases so we can avoid having to copy all the packaging steps (like cleaning up modules). This does mean that the NPM package when installed will be missing those cleanup steps. Possibly we can try to break out the packaging step into a something that can be ran standalone (which will also require installing dev dependencies like gulp) but not sure how much work this would be.
301 lines
9.8 KiB
YAML
301 lines
9.8 KiB
YAML
name: Build
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
pull_request:
|
|
branches:
|
|
- main
|
|
|
|
# Cancel in-progress runs for pull requests when developers push
|
|
# additional changes, and serialize builds in branches.
|
|
# https://docs.github.com/en/actions/using-jobs/using-concurrency#example-using-concurrency-to-cancel-any-in-progress-job-or-run
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
|
|
# Note: if: success() is used in several jobs -
|
|
# this ensures that it only executes if all previous jobs succeeded.
|
|
|
|
# if: steps.cache-node-modules.outputs.cache-hit != 'true'
|
|
# will skip running `npm install` if it successfully fetched from cache
|
|
|
|
jobs:
|
|
changes:
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
ci: ${{ steps.filter.outputs.ci }}
|
|
code: ${{ steps.filter.outputs.code }}
|
|
deps: ${{ steps.filter.outputs.deps }}
|
|
docs: ${{ steps.filter.outputs.docs }}
|
|
helm: ${{ steps.filter.outputs.helm }}
|
|
steps:
|
|
- name: Checkout repo
|
|
uses: actions/checkout@v6
|
|
- name: Check changed files
|
|
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
|
|
id: filter
|
|
with:
|
|
filters: |
|
|
ci:
|
|
- ".github/**"
|
|
- "ci/**"
|
|
docs:
|
|
- "docs/**"
|
|
- "README.md"
|
|
- "CHANGELOG.md"
|
|
helm:
|
|
- "ci/helm-chart/**"
|
|
code:
|
|
- "src/**"
|
|
- "test/**"
|
|
deps:
|
|
- "lib/**"
|
|
- "patches/**"
|
|
- "package-lock.json"
|
|
- "test/package-lock.json"
|
|
- id: debug
|
|
run: |
|
|
echo "${{ toJSON(steps.filter )}}"
|
|
|
|
prettier:
|
|
name: Run prettier check
|
|
runs-on: ubuntu-22.04
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
- uses: actions/setup-node@v6
|
|
with:
|
|
node-version-file: .node-version
|
|
cache: npm
|
|
cache-dependency-path: |
|
|
package-lock.json
|
|
test/package-lock.json
|
|
- run: SKIP_SUBMODULE_DEPS=1 npm ci
|
|
- run: npx prettier --check .
|
|
|
|
doctoc:
|
|
name: Doctoc markdown files
|
|
runs-on: ubuntu-22.04
|
|
needs: changes
|
|
if: needs.changes.outputs.docs == 'true'
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
- uses: actions/setup-node@v6
|
|
with:
|
|
node-version-file: .node-version
|
|
cache: npm
|
|
cache-dependency-path: |
|
|
package-lock.json
|
|
test/package-lock.json
|
|
- run: SKIP_SUBMODULE_DEPS=1 npm ci
|
|
- run: npm run doctoc
|
|
|
|
lint-helm:
|
|
name: Lint Helm chart
|
|
runs-on: ubuntu-22.04
|
|
needs: changes
|
|
if: needs.changes.outputs.helm == 'true'
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
- uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4
|
|
with:
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
- run: helm plugin install https://github.com/instrumenta/helm-kubeval
|
|
- run: helm kubeval ci/helm-chart
|
|
|
|
lint-ts:
|
|
name: Lint TypeScript files
|
|
runs-on: ubuntu-22.04
|
|
needs: changes
|
|
if: needs.changes.outputs.code == 'true'
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
- uses: actions/setup-node@v6
|
|
with:
|
|
node-version-file: .node-version
|
|
cache: npm
|
|
cache-dependency-path: |
|
|
package-lock.json
|
|
test/package-lock.json
|
|
- run: SKIP_SUBMODULE_DEPS=1 npm ci
|
|
- run: npm run lint:ts
|
|
|
|
lint-actions:
|
|
name: Lint GitHub Actions
|
|
runs-on: ubuntu-latest
|
|
needs: changes
|
|
if: needs.changes.outputs.ci == 'true'
|
|
steps:
|
|
- name: Checkout repo
|
|
uses: actions/checkout@v6
|
|
- name: Check workflow files
|
|
run: |
|
|
bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash) 1.7.9
|
|
./actionlint -color -shellcheck= -ignore "softprops/action-gh-release"
|
|
shell: bash
|
|
|
|
test-unit:
|
|
name: Run unit tests
|
|
runs-on: ubuntu-22.04
|
|
needs: changes
|
|
if: needs.changes.outputs.code == 'true'
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
- uses: actions/setup-node@v6
|
|
with:
|
|
node-version-file: .node-version
|
|
cache: npm
|
|
cache-dependency-path: |
|
|
package-lock.json
|
|
test/package-lock.json
|
|
- run: SKIP_SUBMODULE_DEPS=1 npm ci
|
|
- run: npm run test:unit
|
|
- uses: codecov/codecov-action@1af58845a975a7985b0beb0cbe6fbbb71a41dbad # v5
|
|
if: success()
|
|
with:
|
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
|
|
build:
|
|
name: Build code-server npm package
|
|
runs-on: ubuntu-22.04
|
|
env:
|
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
DISABLE_V8_COMPILE_CACHE: 1
|
|
VERSION: 0.0.0
|
|
VSCODE_TARGET: linux-x64
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
submodules: true
|
|
- run: sudo apt update && sudo apt install -y libkrb5-dev
|
|
- uses: awalsh128/cache-apt-pkgs-action@2c09a5e66da6c8016428a2172bd76e5e4f14bb17 # latest
|
|
with:
|
|
packages: quilt
|
|
version: 1.0
|
|
- run: quilt push -a
|
|
- uses: actions/setup-node@v6
|
|
with:
|
|
node-version-file: .node-version
|
|
cache: npm
|
|
cache-dependency-path: |
|
|
package-lock.json
|
|
test/package-lock.json
|
|
- run: SKIP_SUBMODULE_DEPS=1 npm ci
|
|
- run: npm run build
|
|
# Get Code's git hash. When this changes it means the content is
|
|
# different and we need to rebuild.
|
|
- name: Get latest lib/vscode rev
|
|
id: vscode-rev
|
|
run: echo "rev=$(git rev-parse HEAD:./lib/vscode)" >> $GITHUB_OUTPUT
|
|
# We need to rebuild when we have a new version of Code, when any of the
|
|
# patches changed, or when the code-server version changes (since it gets
|
|
# embedded into the code). Use VSCODE_CACHE_VERSION to force a rebuild.
|
|
- name: Fetch prebuilt linux-x64 Code package from cache
|
|
id: cache-vscode
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: lib/vscode-reh-web-linux-x64-min-ci
|
|
key: vscode-reh-linux-x64-package-${{ secrets.VSCODE_CACHE_VERSION }}-${{ steps.vscode-rev.outputs.rev }}-${{ hashFiles('patches/*.diff', 'ci/build/build-vscode.sh') }}
|
|
- name: Build vscode
|
|
if: steps.cache-vscode.outputs.cache-hit != 'true'
|
|
run: |
|
|
pushd lib/vscode
|
|
npm ci
|
|
popd
|
|
npm run build:vscode
|
|
# The release package is just the compiled code, does not contain any
|
|
# native modules, and is thus neutral to architecture/os/libc version.
|
|
- run: npm run release
|
|
if: success()
|
|
# https://github.com/actions/upload-artifact/issues/38
|
|
- run: tar -czf package.tar.gz release
|
|
- uses: actions/upload-artifact@v7
|
|
with:
|
|
name: npm-package
|
|
path: ./package.tar.gz
|
|
|
|
test-e2e:
|
|
name: Run e2e tests
|
|
runs-on: ubuntu-22.04
|
|
needs: [changes, build]
|
|
if: needs.changes.outputs.code == 'true' || needs.changes.outputs.deps == 'true'
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
- run: sudo apt update && sudo apt install -y libkrb5-dev
|
|
- uses: actions/setup-node@v6
|
|
with:
|
|
node-version-file: .node-version
|
|
cache: npm
|
|
cache-dependency-path: |
|
|
package-lock.json
|
|
test/package-lock.json
|
|
- run: SKIP_SUBMODULE_DEPS=1 npm ci
|
|
- uses: actions/download-artifact@v8
|
|
with:
|
|
name: npm-package
|
|
- run: tar -xzf package.tar.gz
|
|
- run: cd release && npm install --unsafe-perm --omit=dev
|
|
- name: Install Playwright OS dependencies
|
|
run: |
|
|
./test/node_modules/.bin/playwright install-deps
|
|
./test/node_modules/.bin/playwright install
|
|
- run: CODE_SERVER_TEST_ENTRY=./release npm run test:e2e
|
|
- uses: actions/upload-artifact@v7
|
|
if: always()
|
|
with:
|
|
name: failed-test-videos
|
|
path: ./test/test-results
|
|
- run: rm -rf ./release ./test/test-results
|
|
|
|
test-e2e-proxy:
|
|
name: Run e2e tests behind proxy
|
|
runs-on: ubuntu-22.04
|
|
needs: [changes, build]
|
|
if: needs.changes.outputs.code == 'true' || needs.changes.outputs.deps == 'true'
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
- run: sudo apt update && sudo apt install -y libkrb5-dev
|
|
- uses: actions/setup-node@v6
|
|
with:
|
|
node-version-file: .node-version
|
|
cache: npm
|
|
cache-dependency-path: |
|
|
package-lock.json
|
|
test/package-lock.json
|
|
- run: SKIP_SUBMODULE_DEPS=1 npm ci
|
|
- uses: actions/download-artifact@v8
|
|
with:
|
|
name: npm-package
|
|
- run: tar -xzf package.tar.gz
|
|
- run: cd release && npm install --unsafe-perm --omit=dev
|
|
- name: Install Playwright OS dependencies
|
|
run: |
|
|
./test/node_modules/.bin/playwright install-deps
|
|
./test/node_modules/.bin/playwright install
|
|
- name: Cache Caddy
|
|
uses: actions/cache@v4
|
|
id: caddy-cache
|
|
with:
|
|
path: |
|
|
~/.cache/caddy
|
|
key: cache-caddy-2.5.2
|
|
- name: Install Caddy
|
|
env:
|
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
if: steps.caddy-cache.outputs.cache-hit != 'true'
|
|
run: |
|
|
gh release download v2.5.2 --repo caddyserver/caddy --pattern "caddy_2.5.2_linux_amd64.tar.gz"
|
|
mkdir -p ~/.cache/caddy
|
|
tar -xzf caddy_2.5.2_linux_amd64.tar.gz --directory ~/.cache/caddy
|
|
- run: ~/.cache/caddy/caddy start --config ./ci/Caddyfile
|
|
- run: CODE_SERVER_TEST_ENTRY=./release npm run test:e2e:proxy
|
|
- run: ~/.cache/caddy/caddy stop --config ./ci/Caddyfile
|
|
if: always()
|
|
|
|
- uses: actions/upload-artifact@v7
|
|
if: always()
|
|
with:
|
|
name: failed-test-videos-proxy
|
|
path: ./test/test-results
|