Skip to content

CI: Refact and extend CI/CD workflows to leverage ansys actions #7

CI: Refact and extend CI/CD workflows to leverage ansys actions

CI: Refact and extend CI/CD workflows to leverage ansys actions #7

Workflow file for this run

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 }}