Use mise instead of asdf if present #5824
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 (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: Install mise | |
uses: jdx/mise-action@v2 | |
# with: | |
# version: 2024.12.14 # [default: latest] mise version to install | |
# install: true # [default: true] run `mise install` | |
# cache: true # [default: true] cache mise using GitHub's cache | |
# experimental: true # [default: false] enable experimental features | |
# # automatically write this mise.toml file | |
# mise_toml: | | |
# [tools] | |
# shellcheck = "0.9.0" | |
# # or, if you prefer .tool-versions: | |
# tool_versions: | | |
# shellcheck 0.9.0 | |
# - 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 mise inside WSL | |
if: contains(matrix.shell, 'wsl') | |
run: | | |
set -ex | |
curl https://mise.run | sh | |
echo "$HOME/.local/share/mise/bin" >> $GITHUB_PATH | |
echo "$HOME/.local/share/mise/shims" >> $GITHUB_PATH | |
mise 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 }} |