Adds devel pipeline that tests with unreleased direct dependencies #5818
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
# This is a basic workflow | |
name: ci | |
# Controls when the action will run. Triggers the workflow on push or pull request | |
# events but only for the main branch | |
on: | |
push: | |
branches: ["main", "devel/*"] | |
tags: | |
- "v*.*" | |
pull_request: | |
branches: ["main", "devel/*"] | |
schedule: | |
- cron: "0 0 * * *" | |
workflow_dispatch: | |
inputs: | |
publish: | |
description: "Publish a pre-release" | |
required: false | |
default: "false" | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.ref }}-${{ github.event.pull_request.number || github.sha }} | |
cancel-in-progress: true | |
env: | |
FORCE_COLOR: "1" # make mocha output colorful | |
PRETTIER_LEGACY_CLI: "1" # https://github.com/prettier/prettier/issues/15832 | |
# https://docs.github.com/en/actions/learn-github-actions/environment-variables | |
# https://devblogs.microsoft.com/commandline/share-environment-vars-between-wsl-and-windows/ | |
WSLENV: HOSTNAME:CI:FORCE_COLOR:GITHUB_ACTION:GITHUB_ACTION_PATH/p:GITHUB_ACTION_REPOSITORY:GITHUB_WORKFLOW:GITHUB_WORKSPACE/p:GITHUB_PATH/p:GITHUB_ENV/p:VIRTUAL_ENV/p:SKIP_PODMAN:SKIP_DOCKER:NODE_OPTIONS | |
# We define a hostname because otherwise the variable might not always be accessible on runners. | |
HOSTNAME: gha | |
# A workflow run is made up of one or more jobs that can run sequentially or in parallel | |
jobs: | |
build: | |
name: ${{ matrix.name }} | |
environment: ci | |
env: | |
SKIP_DOCKER: ${{ matrix.env.SKIP_DOCKER || 0 }} | |
SKIP_PODMAN: ${{ matrix.env.SKIP_PODMAN || 0 }} | |
# NODE_OPTIONS must be kept in sync with one inside .envrc file | |
NODE_OPTIONS: --max-old-space-size=8192 | |
TASKFILE_ARGS: --output=group --output-group-begin='::group::{{.TASK}}' --output-group-end='::endgroup::' | |
defaults: | |
run: | |
shell: ${{ matrix.shell || 'bash'}} | |
# The type of runner that the job will run on | |
runs-on: ${{ matrix.os || 'ubuntu-22.04' }} | |
# see https://github.com/containers/podman/issues/13609 | |
continue-on-error: ${{ contains(matrix.name, 'macos') && true || false }} | |
outputs: | |
can_release_to_npm: ${{ steps.package.outputs.can_release_to_npm }} | |
strategy: | |
fail-fast: false | |
matrix: | |
# Avoid letting github do the matrix multiplication and use manual | |
# includes for each job, this gives us fine control over job name. | |
# Order is important, keep it alphabetical: docs, lint, test* | |
continue-on-error: | |
- false | |
os: | |
- ubuntu-22.04 | |
task-name: | |
- docs | |
name: | |
- docs | |
include: | |
- name: lint | |
task-name: lint | |
os: ubuntu-22.04 | |
env: | |
SKIP_PODMAN: 1 | |
SKIP_DOCKER: 1 | |
- name: test (linux) | |
task-name: test | |
- name: test-devel (linux) | |
task-name: test | |
env: | |
DEVEL: 1 | |
- name: test (macos) | |
task-name: test | |
os: macos-13-large | |
env: | |
SKIP_PODMAN: 1 | |
SKIP_DOCKER: 1 | |
# only until we fix some broken tests, as we need it to pass | |
# in order to enable the caching | |
continue-on-error: true | |
- name: test (wsl) | |
# runner does not support running containers | |
task-name: als:test-without-ee | |
log-name: als-test-without-ee | |
# https://github.com/actions/virtual-environments/issues/5151 | |
os: devtools-win-x64 | |
shell: "wsl-bash {0}" | |
env: | |
SKIP_PODMAN: 1 | |
SKIP_DOCKER: 1 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 # we need tags for dynamic versioning | |
show-progress: false | |
# https://github.com/marketplace/actions/setup-wsl | |
- name: Activate WSL | |
if: contains(matrix.shell, 'wsl') | |
uses: Vampire/setup-wsl@v4.0.0 | |
with: | |
distribution: Ubuntu-22.04 | |
set-as-default: "true" | |
# '-i' seems to be the only option that loads .bashrc file that we need | |
# https://github.com/Vampire/setup-wsl/discussions/54 | |
wsl-shell-command: "bash -i -eo pipefail" | |
# https://github.com/MicrosoftDocs/WSL/blob/main/WSL/wsl-config.md#L159 | |
wsl-conf: | | |
[automount] | |
enabled = true | |
root = / | |
options = "metadata,umask=077" | |
[boot] | |
command=/etc/init.d/dbus start | |
[interop] | |
enabled = false | |
appendWindowsPath = false | |
[network] | |
hostname = wsl | |
additional-packages: curl | |
dbus | |
dirmngr | |
gawk | |
git | |
gpg | |
gpg-agent | |
jq | |
make | |
python3-dev | |
python3-full | |
python3-venv | |
qemu-user-static | |
tar | |
unzip | |
xvfb | |
# asdf nodejs plugin requires: dirmngr gpg curl gawk | |
- name: Setup asdf | |
if: ${{ !contains(matrix.shell, 'wsl') }} | |
uses: asdf-vm/actions/install@v3 | |
- name: Setup python | |
if: ${{ !contains(matrix.shell, 'wsl') }} | |
uses: actions/setup-python@v5 | |
with: | |
python-version: "3.12" | |
- name: Install asdf inside WSL | |
if: contains(matrix.shell, 'wsl') | |
run: | | |
set -ex | |
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0 | |
echo '. "$HOME/.asdf/asdf.sh"' >> ~/.bashrc | |
export ASDF_DIR="$HOME/.asdf" | |
. "$HOME/.asdf/asdf.sh" | |
asdf plugin add direnv | |
asdf plugin add nodejs | |
asdf plugin add python | |
asdf plugin add task | |
asdf plugin add yarn | |
asdf install | |
direnv --version | |
task --version | |
yarn --version | |
node --version | |
python3 --version | |
- name: Activate direnv | |
if: ${{ !contains(matrix.shell, 'wsl') }} | |
run: | | |
set -x | |
asdf direnv setup --shell bash --version latest | |
asdf current | |
asdf exec direnv allow | |
asdf exec direnv reload | |
# https://github.com/direnv/direnv/wiki/GitHubActions | |
# Github prevents export of NODE_OPTIONS to GITHUB_ENV due to security reasons: | |
# https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/workflow-commands-for-github-actions#setting-an-environment-variable | |
asdf exec direnv export gha >> "$GITHUB_ENV" | |
asdf exec direnv exec . bash -c 'echo "${VIRTUAL_ENV}/bin"' >> "$GITHUB_PATH" | |
- name: Ensure .envrc file is automatically loaded (direnv) | |
if: ${{ !contains(matrix.shell, 'wsl') }} | |
run: | | |
set -ex | |
test "${VIRTUAL_ENV:-}" = "${HOME}/.local/share/virtualenvs/vsa" || { | |
echo "VIRTUAL_ENV mismatch" | |
exit 99 | |
} | |
test "$(which python3)" = "${HOME}/.local/share/virtualenvs/vsa/bin/python3" || { | |
echo "python3 mismatch" | |
exit 98 | |
} | |
# Ensure NODE_OPTIONS config on CI is identical with the one in .envrc | |
[[ "${NODE_OPTIONS:-}" == "$(asdf exec direnv exec . printenv NODE_OPTIONS)" ]] || { echo "NODE_OPTIONS mismatch between .envrc and ci.yaml"; exit 97; } | |
- name: Enable caching | |
uses: actions/cache@v4 | |
with: | |
path: | | |
.vscode-test | |
.yarn/cache | |
out/ext | |
out/test-resources | |
out/test-resources-oldest | |
~/.cache/pip | |
~/.cache/yarn | |
~/.cache/pre-commit/ | |
key: ${{ runner.os }}-${{ matrix.task-name }}-${{ hashFiles('package.json', 'yarn.lock', '.config/requirements.txt', 'tools/*.*') }} | |
# - name: Enable caching for podman-machine | |
# if: "contains(matrix.os, 'macos')" | |
# uses: actions/cache@v4 | |
# with: | |
# path: | | |
# ~/.local/share/containers | |
# ~/.config/containers | |
# key: ${{ runner.os }}-${{ matrix.task-name }}-${{ hashFiles('package.json', 'yarn.lock', '.config/requirements.txt', '**/Taskfile.yml', 'tools/*.*') }} | |
- name: task setup | |
# starting podman machine can randomly get stuck on macos | |
timeout-minutes: 25 | |
run: task setup | |
## uncomment to debug on GHA runner | |
# - name: Setup tmate session | |
# uses: mxschmitt/action-tmate@v3 | |
- name: task package | |
id: package | |
run: | | |
task package ${{ matrix.env.TASKFILE_ARGS }} | |
- name: task ${{ matrix.task-name }} | |
if: "${{ !contains(matrix.name, 'test') }}" | |
run: task ${{ matrix.task-name }} ${{ matrix.env.TASKFILE_ARGS }} | |
- name: task unit | |
if: contains(matrix.name, 'test') | |
run: task unit ${{ matrix.env.TASKFILE_ARGS }} | |
- name: task ui | |
# https://github.com/ansible/vscode-ansible/issues/1451 | |
if: "${{ contains(matrix.name, 'test') && !contains(matrix.name, 'wsl') }}" | |
run: task ui ${{ matrix.env.TASKFILE_ARGS }} | |
- name: task e2e | |
# https://github.com/ansible/vscode-ansible/issues/1451 | |
if: "${{ contains(matrix.name, 'test') && !contains(matrix.name, 'wsl') }}" | |
run: task e2e ${{ matrix.env.TASKFILE_ARGS }} | |
- name: task als | |
# https://github.com/ansible/vscode-ansible/issues/1451 | |
if: contains(matrix.name, 'test') | |
run: task als ${{ matrix.env.TASKFILE_ARGS }} | |
- name: Upload vsix artifact | |
if: ${{ matrix.name == 'test (linux)' }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ansible-extension-build-${{ github.event.number || github.ref_name }}.zip | |
path: ansible-*.vsix | |
if-no-files-found: error | |
retention-days: 90 | |
- name: Upload ansible-language-server npm package | |
if: ${{ matrix.name == 'test (linux)' }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: "@ansible-ansible-language-server-build-${{ github.event.number || github.ref_name }}.tgz" | |
path: packages/ansible-language-server/*.tgz | |
if-no-files-found: error | |
retention-days: 90 | |
- name: Upload test logs and reports | |
if: ${{ always() }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: logs-${{ matrix.os }}-${{ matrix.log-name || matrix.task-name }}.zip | |
path: | | |
out/coverage | |
out/e2eTestReport | |
out/log | |
out/test-resources/settings/logs | |
out/userdata/logs | |
out/test-resources/screenshots | |
if-no-files-found: ignore | |
retention-days: 90 | |
# - name: Stop services | |
# if: "contains(matrix.os, 'macos')" | |
# # Stopping podman machine is needed or caching it will fail | |
# run: | | |
# command -v podman && { | |
# podman machine stop | |
# while [[ "$(podman machine ls --format '{{.Running}}' \ | |
# --noheading || true)" != "false" ]]; do | |
# sleep 1 | |
# echo -n . | |
# done | |
# echo . | |
# } | |
# continue-on-error: true | |
## commented out for future use to debug on the GHA node if required | |
# - name: Setup tmate session | |
# if: ${{ always() }} | |
# uses: mxschmitt/action-tmate@v3 | |
ack: | |
if: github.event_name == 'pull_request' | |
uses: ansible/team-devtools/.github/workflows/ack.yml@main | |
secrets: inherit | |
check: # This job does nothing and is only used for the branch protection | |
if: always() | |
needs: | |
- build | |
permissions: # codecov | |
id-token: write | |
checks: read | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: Merge logs into a single archive | |
uses: actions/upload-artifact/merge@v4 | |
with: | |
name: logs.zip | |
pattern: logs*.zip | |
separate-directories: true | |
delete-merged: true | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: logs.zip | |
path: . | |
- name: Upload als test coverage data [1/4] | |
uses: codecov/codecov-action@v5.1.1 | |
with: | |
name: als | |
files: ./*/coverage/als/lcov.info | |
flags: als | |
disable_search: true | |
fail_ci_if_error: true | |
use_oidc: ${{ !(github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork) }} # cspell:ignore oidc | |
- name: Upload unit test coverage data [2/4] | |
uses: codecov/codecov-action@v5.1.1 | |
with: | |
name: unit | |
files: ./*/coverage/unit/lcov.info | |
flags: unit | |
disable_search: true | |
fail_ci_if_error: true | |
use_oidc: ${{ !(github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork) }} # cspell:ignore oidc | |
- name: Upload ui test coverage data [3/4] | |
uses: codecov/codecov-action@v5.1.1 | |
with: | |
name: ui | |
files: ./*/coverage/ui/lcov.info | |
flags: ui | |
disable_search: true | |
fail_ci_if_error: true | |
use_oidc: ${{ !(github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork) }} # cspell:ignore oidc | |
- name: Upload e2e test coverage data [4/4] | |
uses: codecov/codecov-action@v5.1.1 | |
with: | |
name: e2e | |
files: ./*/coverage/e2e/lcov.info | |
flags: e2e | |
disable_search: true | |
fail_ci_if_error: true | |
use_oidc: ${{ !(github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork) }} # cspell:ignore oidc | |
- name: Decide whether the needed jobs succeeded or failed | |
uses: re-actors/alls-green@release/v1 | |
with: | |
jobs: ${{ toJSON(needs) }} | |
publish: | |
if: github.ref_type == 'tag' || github.event.inputs.publish == 'true' | |
runs-on: ubuntu-latest | |
environment: release | |
needs: | |
- check | |
steps: | |
- name: Checkout Source | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: node post install | |
run: | | |
corepack enable | |
npm config set fund false | |
- name: Install Node | |
uses: actions/setup-node@v4 | |
with: | |
cache: yarn | |
cache-dependency-path: "**/yarn.lock" | |
node-version-file: .tool-versions | |
- name: Download the artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: ansible-extension-build-${{ github.event.number || github.ref_name }}.zip | |
- run: | | |
yarn install --immutable | |
ls -la *.vsix | |
- name: Setup python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: "3.12" | |
- name: Publish extension to marketplaces | |
run: | | |
./tools/helper --publish | |
env: | |
VSCE_PAT: ${{ secrets.VSCE_PAT }} | |
OVSX_PAT: ${{ secrets.OVSX_PAT }} | |
publish-npm: | |
environment: release | |
if: needs.build.outputs.can_release_to_npm == 'true' && (github.ref_type == 'tag' || github.event.inputs.publish == 'true') | |
runs-on: ubuntu-latest | |
needs: | |
- build | |
- check | |
steps: | |
- name: Download the artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: "@ansible-ansible-language-server-build-${{ github.event.number || github.ref_name }}.tgz" | |
# Setup .npmrc file to publish to npm | |
- uses: actions/setup-node@v4 | |
with: | |
cache: yarn | |
cache-dependency-path: "**/yarn.lock" | |
node-version-file: .tool-versions | |
registry-url: "https://registry.npmjs.org" | |
- run: npm publish --access public @ansible-ansible-language-server-*.tgz | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} |