CI: Refact and extend CI/CD workflows to leverage ansys actions #7
Workflow file for this run
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
name: GitHub CI | |
on: | |
pull_request: | |
workflow_dispatch: | |
push: | |
tags: | |
- "*" | |
branches: | |
- main | |
env: | |
ANSYSLMD_LICENSE_FILE: ${{ format('1055@{0}', secrets.LICENSE_SERVER) }} | |
MAIN_PYTHON_VERSION: '3.10' | |
PACKAGE_NAME: 'PyAEDT' | |
DOCUMENTATION_CNAME: 'aedt.docs.pyansys.com' | |
MEILISEARCH_API_KEY: ${{ secrets.MEILISEARCH_API_KEY }} | |
MEILISEARCH_HOST_URL: ${{ vars.MEILISEARCH_HOST_URL }} | |
MEILISEARCH_PUBLIC_API_KEY: ${{ secrets.MEILISEARCH_PUBLIC_API_KEY }} | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: true | |
jobs: | |
doc-style: | |
name: Documentation style check | |
runs-on: ubuntu-latest | |
steps: | |
- name: Check documentation style | |
uses: ansys/actions/doc-style@v5 | |
with: | |
token: ${{ secrets.GITHUB_TOKEN }} | |
vale-config: "doc/.vale.ini" | |
vale-version: "2.29.6" | |
smoke-tests: | |
name: Build and Smoke tests | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ubuntu-latest, windows-latest] | |
python-version: ['3.7', '3.8', '3.9', '3.10', '3.11'] | |
steps: | |
- name: Build wheelhouse and perform smoke test | |
uses: ansys/actions/build-wheelhouse@v5 | |
with: | |
library-name: ${{ env.PACKAGE_NAME }} | |
operating-system: ${{ matrix.os }} | |
python-version: ${{ matrix.python-version }} | |
- name: Import python package | |
run: | | |
python -c "import pyaedt; from pyaedt import __version__" | |
doc-build: | |
name: Documentation build without examples | |
runs-on: ubuntu-latest | |
needs: [doc-style] | |
steps: | |
- name: Install Git and checkout project | |
uses: actions/checkout@v4 | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ env.MAIN_PYTHON_VERSION }} | |
- name: Update pip | |
run: | | |
pip install --upgrade pip | |
- name: Install pyaedt and documentation dependencies | |
run: | | |
pip install .[doc-noexamples] | |
- name: Retrieve PyAEDT version | |
id: version | |
run: | | |
echo "PYAEDT_VERSION=$(python -c 'from pyaedt import __version__; print(__version__)')" >> $GITHUB_OUTPUT | |
echo "PyAEDT version is: $(python -c "from pyaedt import __version__; print(__version__)")" | |
- name: Install OS package | |
run: | | |
sudo apt install graphviz | |
# TODO: Update this step once pyaedt-examples is ready | |
- name: Build documentation without examples | |
run: | | |
make -C doc clean | |
mkdir doc/source/examples -p | |
echo $'Examples\n========' > doc/source/examples/index.rst | |
make -C doc html-noexamples | |
# # Verify that sphinx generates no warnings | |
# - name: Check for warnings | |
# run: | | |
# python doc/print_errors.py | |
# - name: Upload HTML documentation without examples artifact | |
# uses: actions/upload-artifact@v3 | |
# with: | |
# name: documentation-no-examples-html | |
# path: doc/_build/html | |
# retention-days: 7 | |
# # ================================================================================================= | |
# # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv RUNNING ON SELF-HOSTED RUNNER vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv | |
# # ================================================================================================= | |
test-solver-windows: | |
name: Testing solvers and coverage (Windows) | |
needs: [smoke-tests] | |
runs-on: [ self-hosted, Windows, pyaedt ] | |
# Steps represent a sequence of tasks that will be executed as part of the job | |
steps: | |
- name: Install Git and checkout project | |
uses: actions/checkout@v4 | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ env.MAIN_PYTHON_VERSION }} | |
- name: Create virtual environment | |
run: | | |
python -m venv .venv | |
.venv\Scripts\Activate.ps1 | |
python -m pip install pip -U | |
python -m pip install wheel setuptools -U | |
python -c "import sys; print(sys.executable)" | |
- name: Install pyaedt and tests dependencies | |
run: | | |
.venv\Scripts\Activate.ps1 | |
pip install .[tests] | |
- name: Install CI dependencies (e.g. vtk-osmesa) | |
run: | | |
.venv\Scripts\Activate.ps1 | |
# Uninstall conflicting dependencies | |
pip uninstall vtk -y | |
pip install --extra-index-url https://wheels.vtk.org .[ci] | |
- name: 'Unit testing' | |
uses: nick-fields/retry@v3 | |
with: | |
max_attempts: 3 | |
retry_on: error | |
timeout_minutes: 40 | |
command: | | |
.venv\Scripts\Activate.ps1 | |
Set-Item -Path env:PYTHONMALLOC -Value "malloc" | |
pytest --durations=50 -v --cov=pyaedt --cov-report=xml --cov-report=html --junitxml=junit/test-results.xml _unittest_solvers | |
- uses: codecov/codecov-action@v4 | |
with: | |
token: ${{ secrets.CODECOV_TOKEN }} | |
name: codecov-system-solver-tests | |
file: ./coverage.xml | |
flags: system,solver | |
- name: Upload pytest test results | |
uses: actions/upload-artifact@v4 | |
with: | |
name: pytest-solver-results | |
path: junit/test-results.xml | |
# Use always() to always run this step to publish test results when there are test failures | |
if: ${{ always() }} | |
# # ================================================================================================= | |
# # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv RUNNING ON SELF-HOSTED RUNNER vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv | |
# # ================================================================================================= | |
test-windows: | |
name: Testing and coverage (Windows) | |
needs: [smoke-tests] | |
runs-on: [ self-hosted, Windows, pyaedt ] | |
# Steps represent a sequence of tasks that will be executed as part of the job | |
steps: | |
- name: Install Git and checkout project | |
uses: actions/checkout@v4 | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ env.MAIN_PYTHON_VERSION }} | |
- name: Create virtual environment | |
run: | | |
python -m venv .venv | |
.venv\Scripts\Activate.ps1 | |
python -m pip install pip -U | |
python -m pip install wheel setuptools -U | |
python -c "import sys; print(sys.executable)" | |
- name: Install pyaedt and tests dependencies | |
run: | | |
.venv\Scripts\Activate.ps1 | |
pip install .[tests] | |
- name: Install CI dependencies (e.g. vtk-osmesa) | |
run: | | |
.venv\Scripts\Activate.ps1 | |
# Uninstall conflicting dependencies | |
pip uninstall vtk -y | |
pip install --extra-index-url https://wheels.vtk.org .[ci] | |
- name: 'Unit testing' | |
uses: nick-fields/retry@v3 | |
with: | |
max_attempts: 3 | |
retry_on: error | |
timeout_minutes: 40 | |
command: | | |
.venv\Scripts\Activate.ps1 | |
Set-Item -Path env:PYTHONMALLOC -Value "malloc" | |
pytest -n auto --dist loadfile --durations=50 -v --cov=pyaedt --cov-report=xml --cov-report=html --junitxml=junit/test-results.xml _unittest | |
- uses: codecov/codecov-action@v4 | |
with: | |
token: ${{ secrets.CODECOV_TOKEN }} | |
name: codecov-system-tests | |
file: ./coverage.xml | |
flags: system | |
- name: Upload pytest test results | |
uses: actions/upload-artifact@v4 | |
with: | |
name: pytest-results | |
path: junit/test-results.xml | |
# Use always() to always run this step to publish test results when there are test failures | |
if: ${{ always() }} | |
# legacy-tests: | |
# name: Test dotnet | |
# runs-on: [ Windows, self-hosted, pyedb ] | |
# steps: | |
# - name: "Install Git and clone project" | |
# uses: actions/checkout@v4 | |
# - name: "Set up Python" | |
# uses: ansys/actions/_setup-python@v5 | |
# with: | |
# python-version: ${{ env.MAIN_PYTHON_VERSION }} | |
# use-cache: false | |
# - name: Create Python venv | |
# run: | | |
# python -m venv .venv | |
# . .venv\Scripts\Activate.ps1 | |
# - name: "Update pip" | |
# run: | | |
# . .venv\Scripts\Activate.ps1 | |
# python -m pip install -U pip | |
# - name: "Install Python library and tests dependencies" | |
# run: | | |
# . .venv\Scripts\Activate.ps1 | |
# python -m pip install .[tests] | |
# - name: Uninstall conflicting CI packages | |
# run: | | |
# .\.venv\Scripts\Activate.ps1 | |
# pip uninstall vtk -y | |
# - name: Install CI related dependencies | |
# run: | | |
# .\.venv\Scripts\Activate.ps1 | |
# pip install --extra-index-url https://wheels.vtk.org .[ci] | |
# - name: "Executing legacy tests" | |
# uses: nick-fields/retry@v3 | |
# with: | |
# max_attempts: 3 | |
# retry_on: error | |
# timeout_minutes: 10 | |
# command: | | |
# . .venv\Scripts\Activate.ps1 | |
# pytest -m "legacy" -n auto --dist loadfile -v --cov | |
# - name: "Create coverage files" | |
# run: | | |
# . .venv\Scripts\Activate.ps1 | |
# python -m coverage html -d .cov\legacy-html | |
# python -m coverage xml -o .cov\legacy.xml | |
# - name: Upload Coverage Results | |
# if: always() | |
# uses: actions/upload-artifact@v4 | |
# with: | |
# path: .cov\legacy-html | |
# name: html-legacy-coverage | |
# retention-days: 7 | |
# - name: Upload coverage to Codecov | |
# uses: codecov/codecov-action@v3 | |
# env: | |
# CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
# with: | |
# files: .cov/legacy.xml | |
# # ================================================================================================= | |
# # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv RUNNING ON SELF-HOSTED RUNNER vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv | |
# # ================================================================================================= | |
# docs-build: | |
# name: Build documentation | |
# runs-on: [ Windows, self-hosted, pyedb ] | |
# timeout-minutes: 480 | |
# steps: | |
# - uses: actions/checkout@v4 | |
# - name: "Set up Python" | |
# uses: ansys/actions/_setup-python@v5 | |
# with: | |
# python-version: ${{ env.MAIN_PYTHON_VERSION }} | |
# use-cache: false | |
# - name: 'Create virtual env' | |
# run: | | |
# python -m venv .venv | |
# - name: "Update pip" | |
# run: | | |
# . .venv\Scripts\Activate.ps1 | |
# python -m pip install pip -U | |
# python -m pip install wheel setuptools -U | |
# python -c "import sys; print(sys.executable)" | |
# - name: Install pyedb with doc dependencies | |
# run: | | |
# . .venv\Scripts\Activate.ps1 | |
# pip install .[doc] | |
# - name: Verify that pyedb can be imported | |
# run: | | |
# . .venv\Scripts\Activate.ps1 | |
# python -c "import pyedb" | |
# - name: Retrieve pyedb version | |
# run: | | |
# . .venv\Scripts\Activate.ps1 | |
# echo "PyEDB version is: $(python -c "from pyedb import __version__; print(); print(__version__)")" | |
# - name: Install pyaedt | |
# run: | | |
# . .venv\Scripts\Activate.ps1 | |
# pip install pyaedt | |
# - name: Uninstall conflicting CI packages | |
# run: | | |
# .\.venv\Scripts\Activate.ps1 | |
# pip uninstall vtk -y | |
# - name: Install CI related dependencies | |
# run: | | |
# .\.venv\Scripts\Activate.ps1 | |
# pip install --extra-index-url https://wheels.vtk.org .[ci] | |
# - name: Build the documentation (HTML) | |
# run: | | |
# .\.venv\Scripts\Activate.ps1 | |
# cd doc | |
# .\make.bat html | |
# - name: Build the documentation (PDF) | |
# run: | | |
# .\.venv\Scripts\Activate.ps1 | |
# cd doc | |
# .\make.bat pdf | |
# # Verify that sphinx generates no warnings | |
# - name: Check for warnings | |
# run: | | |
# . .venv\Scripts\Activate.ps1 | |
# python doc/print_errors.py | |
# - name: Upload HTML Documentation artifact | |
# uses: actions/upload-artifact@v4 | |
# with: | |
# name: documentation-html | |
# path: doc/_build/html | |
# retention-days: 1 | |
# - name: Upload PDF Documentation artifact | |
# uses: actions/upload-artifact@v4 | |
# with: | |
# name: documentation-pdf | |
# path: doc/_build/latex/*.pdf | |
# retention-days: 7 | |
# package: | |
# name: Package library | |
# needs: [legacy-tests, docs-build] | |
# runs-on: ubuntu-latest | |
# steps: | |
# - name: Build library source and wheel artifacts | |
# uses: ansys/actions/build-library@v5 | |
# with: | |
# library-name: ${{ env.PACKAGE_NAME }} | |
# python-version: ${{ env.MAIN_PYTHON_VERSION }} | |
# release: | |
# name: Release project | |
# if: github.event_name == 'push' && contains(github.ref, 'refs/tags') | |
# needs: [package] | |
# runs-on: ubuntu-latest | |
# steps: | |
# - name: Release to the public PyPI repository | |
# uses: ansys/actions/release-pypi-public@v5 | |
# with: | |
# library-name: ${{ env.PACKAGE_NAME }} | |
# twine-username: "__token__" | |
# twine-token: ${{ secrets.PYPI_TOKEN }} | |
# - name: Release to GitHub | |
# uses: ansys/actions/release-github@v5 | |
# with: | |
# library-name: ${{ env.PACKAGE_NAME }} | |
# upload-dev-docs: | |
# name: Upload dev documentation | |
# if: github.ref == 'refs/heads/main' | |
# runs-on: ubuntu-latest | |
# needs: [package] | |
# steps: | |
# - name: Deploy the latest documentation | |
# uses: ansys/actions/doc-deploy-dev@v5 | |
# with: | |
# cname: ${{ env.DOCUMENTATION_CNAME }} | |
# token: ${{ secrets.GITHUB_TOKEN }} | |
# doc-index-dev: | |
# name: "Deploy dev index docs" | |
# if: github.ref == 'refs/heads/main' | |
# runs-on: ubuntu-latest | |
# needs: upload-dev-docs | |
# steps: | |
# - name: "Deploy the latest documentation index" | |
# uses: ansys/actions/doc-deploy-index@v5 | |
# with: | |
# cname: ${{ env.DOCUMENTATION_CNAME }}/version/dev | |
# index-name: pyedb-vdev | |
# host-url: ${{ env.MEILISEARCH_HOST_URL }} | |
# api-key: ${{ env.MEILISEARCH_API_KEY }} | |
# python-version: ${{ env.MAIN_PYTHON_VERSION }} | |
# upload-docs-release: | |
# name: Upload release documentation | |
# if: github.event_name == 'push' && contains(github.ref, 'refs/tags') | |
# runs-on: ubuntu-latest | |
# needs: [release] | |
# steps: | |
# - name: Deploy the stable documentation | |
# uses: ansys/actions/doc-deploy-stable@v5 | |
# with: | |
# cname: ${{ env.DOCUMENTATION_CNAME }} | |
# token: ${{ secrets.GITHUB_TOKEN }} | |
# doc-index-stable: | |
# name: "Deploy stable docs index" | |
# runs-on: ubuntu-latest | |
# needs: upload-docs-release | |
# steps: | |
# - name: "Install Git and clone project" | |
# uses: actions/checkout@v4 | |
# - name: "Install the package requirements" | |
# run: pip install -e . | |
# - name: "Get the version to PyMeilisearch" | |
# run: | | |
# VERSION=$(python -c "from pyedb import __version__; print('.'.join(__version__.split('.')[:2]))") | |
# VERSION_MEILI=$(python -c "from pyedb import __version__; print('-'.join(__version__.split('.')[:2]))") | |
# echo "Calculated VERSION: $VERSION" | |
# echo "Calculated VERSION_MEILI: $VERSION_MEILI" | |
# echo "VERSION=$VERSION" >> $GITHUB_ENV | |
# echo "VERSION_MEILI=$VERSION_MEILI" >> $GITHUB_ENV | |
# - name: "Deploy the latest documentation index" | |
# uses: ansys/actions/doc-deploy-index@v5 | |
# with: | |
# cname: ${{ env.DOCUMENTATION_CNAME }}/version/${{ env.VERSION }} | |
# index-name: pyedb-v${{ env.VERSION_MEILI }} | |
# host-url: ${{ env.MEILISEARCH_HOST_URL }} | |
# api-key: ${{ env.MEILISEARCH_API_KEY }} | |
# python-version: ${{ env.MAIN_PYTHON_VERSION }} | |