ci #5265
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 | |
# 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 }} | |
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/[email protected] | |
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 | |
asdf exec direnv exec . bash -c 'echo "VIRTUAL_ENV=${VIRTUAL_ENV}"' >> "$GITHUB_ENV" | |
asdf exec direnv exec . bash -c 'echo "${VIRTUAL_ENV}/bin"' >> "$GITHUB_PATH" | |
- name: Ensure virtualenv is active (direnv) | |
if: ${{ !contains(matrix.shell, 'wsl') }} | |
run: | | |
set -x | |
test "${VIRTUAL_ENV:-}" = "${HOME}/.local/share/virtualenvs/vsa" | |
test "$(which python3)" = "${HOME}/.local/share/virtualenvs/vsa/bin/python3" | |
- 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 | |
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/[email protected] | |
with: | |
name: als | |
files: ./*/coverage/als/lcov.info | |
flags: als | |
disable_search: true | |
fail_ci_if_error: true | |
use_oidc: true # cspell:ignore oidc | |
- name: Upload unit test coverage data [2/4] | |
uses: codecov/[email protected] | |
with: | |
name: unit | |
files: ./*/coverage/unit/lcov.info | |
flags: unit | |
disable_search: true | |
fail_ci_if_error: true | |
use_oidc: true # cspell:ignore oidc | |
- name: Upload ui test coverage data [3/4] | |
uses: codecov/[email protected] | |
with: | |
name: unit | |
files: ./*/coverage/ui/lcov.info | |
flags: ui | |
disable_search: true | |
fail_ci_if_error: true | |
use_oidc: true # cspell:ignore oidc | |
- name: Upload e2e test coverage data [4/4] | |
uses: codecov/[email protected] | |
with: | |
name: e2e | |
files: ./*/coverage/e2e/lcov.info | |
flags: e2e | |
disable_search: true | |
fail_ci_if_error: true | |
use_oidc: true # 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 }} |