Skip to content

chore: pre-commit automatic update #11217

chore: pre-commit automatic update

chore: pre-commit automatic update #11217

Workflow file for this run

name: GitHub CI
on:
pull_request:
workflow_dispatch:
push:
tags:
- "*"
branches:
- main
env:
MAIN_PYTHON_VERSION: '3.13'
PACKAGE_NAME: 'ansys-geometry-core'
DOCUMENTATION_CNAME: 'geometry.docs.pyansys.com'
ANSRV_GEO_IMAGE: 'ghcr.io/ansys/geometry'
ANSRV_GEO_IMAGE_DOCS_TAG: ghcr.io/ansys/geometry:core-linux-latest
ANSRV_GEO_PORT: 700
ANSRV_GEO_LICENSE_SERVER: ${{ secrets.LICENSE_SERVER }}
GEO_CONT_NAME: ans_geo
RESET_IMAGE_CACHE: 0
IS_WORKFLOW_RUNNING: True
ARTIFACTORY_VERSION: v261
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
packages: read
jobs:
update-changelog:
name: "Update CHANGELOG (on release)"
if: github.event_name == 'push' && contains(github.ref, 'refs/tags')
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- uses: ansys/actions/doc-deploy-changelog@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
with:
token: ${{ secrets.PYANSYS_CI_BOT_TOKEN }}
bot-user: ${{ secrets.PYANSYS_CI_BOT_USERNAME }}
bot-email: ${{ secrets.PYANSYS_CI_BOT_EMAIL }}
vulnerabilities:
name: Vulnerabilities
runs-on: ubuntu-latest
steps:
- uses: ansys/actions/check-vulnerabilities@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
with:
python-version: ${{ env.MAIN_PYTHON_VERSION }}
python-package-name: ${{ env.PACKAGE_NAME }}
token: ${{ secrets.PYANSYS_CI_BOT_TOKEN }}
dev-mode: ${{ github.ref != 'refs/heads/main' }}
actions-security:
name: Actions Security
runs-on: ubuntu-latest
steps:
- uses: ansys/actions/check-actions-security@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
with:
generate-summary: true
token: ${{ secrets.GITHUB_TOKEN }}
auditing-level: 'high'
pr-name:
if: github.event_name == 'pull_request'
name: Check the name of the PR
runs-on: ubuntu-latest
steps:
- name: Check commit name
uses: ansys/actions/check-pr-title@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
with:
token: ${{ secrets.GITHUB_TOKEN }}
docs-style:
name: Documentation Style Check
runs-on: ubuntu-latest
steps:
- name: PyAnsys documentation style checks
uses: ansys/actions/doc-style@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
with:
token: ${{ secrets.GITHUB_TOKEN }}
smoke-tests:
name: Build and Smoke tests
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
python-version: ['3.10', '3.11', '3.12', '3.13']
should-release:
- ${{ github.event_name == 'push' && contains(github.ref, 'refs/tags') }}
exclude:
- should-release: false
os: macos-latest
steps:
- name: Build wheelhouse and perform smoke test
uses: ansys/actions/build-wheelhouse@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
with:
library-name: ${{ env.PACKAGE_NAME }}
operating-system: ${{ matrix.os }}
python-version: ${{ matrix.python-version }}
target: 'all'
docker-style:
name: Docker Style Check
runs-on: ubuntu-latest
steps:
- name: PyAnsys documentation style checks
uses: ansys/actions/docker-style@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
with:
directory: docker
recursive: true
manifests:
name: Check Docker manifests
runs-on: ubuntu-latest
outputs:
skip_core_windows: ${{ steps.services.outputs.skip_core_windows }}
skip_core_linux: ${{ steps.services.outputs.skip_core_linux }}
strategy:
matrix:
include:
- container-stable: "core-windows-latest"
container-unstable: "core-windows-latest-unstable"
service: "core_windows"
service-name: "Windows Core Service"
- container-stable: "core-linux-latest"
container-unstable: "core-linux-latest-unstable"
service: "core_linux"
service-name: "Linux Core Service"
steps:
- name: Login to GitHub Container Registry
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Check ${{ matrix.service-name }} manifest
env:
CONTAINER_STABLE: ${{ matrix.container-stable }}
CONTAINER_UNSTABLE: ${{ matrix.container-unstable }}
SERVICE: ${{ matrix.service }}
SERVICE_NAME: ${{ matrix.service-name }}
id: services
run: |
docker manifest inspect ghcr.io/ansys/geometry:${CONTAINER_STABLE} > ${CONTAINER_STABLE}.json
docker manifest inspect ghcr.io/ansys/geometry:${CONTAINER_UNSTABLE} > ${CONTAINER_UNSTABLE}.json || true
# Verify that the unstable manifest exists - otherwise create an empty file
if [ ! -f ${CONTAINER_UNSTABLE}.json ]; then
touch ${CONTAINER_UNSTABLE}.json
fi
# Check if the manifests are the same (and if so, create an output that will skip the next job)
if diff ${CONTAINER_STABLE}.json ${CONTAINER_UNSTABLE}.json; then
echo "${SERVICE_NAME} container manifests are the same... skipping"
echo "skip_${SERVICE}=1" >> "$GITHUB_OUTPUT"
else
echo "${SERVICE_NAME} container manifests are different"
echo "skip_${SERVICE}=0" >> "$GITHUB_OUTPUT"
fi
testing-windows:
name: Testing and coverage (Windows)
needs: [smoke-tests, manifests]
runs-on: windows-latest
continue-on-error: ${{ matrix.experimental }}
env:
SKIP_UNSTABLE: false
strategy:
fail-fast: false
matrix:
include:
- docker-image: "core-windows-latest"
experimental: false
- docker-image: "core-windows-latest-unstable"
experimental: true
steps:
- name: Calculate SKIP_UNSTABLE
if: matrix.experimental
env:
VARS_SKIP_UNSTABLE_CONTAINERS_TEMPORARILY: ${{ vars.SKIP_UNSTABLE_CONTAINERS_TEMPORARILY }}
SKIP_CORE_WINDOWS: ${{ needs.manifests.outputs.skip_core_windows }}
DOCKER_IMAGE: ${{ matrix.docker-image }}
run: |
# Choose the manifests output to consider based on the matrix value
if ("$env:DOCKER_IMAGE" -eq "core-windows-latest-unstable") {
$ImagesAreEqual = $env:SKIP_CORE_WINDOWS
} else {
Write-Output "Unknown docker image"
exit 1
}
$A = $env:VARS_SKIP_UNSTABLE_CONTAINERS_TEMPORARILY -eq 1
$B = $ImagesAreEqual -eq 1
# Calculate the logical expression
$Result = ($A -or $B).ToString().ToLower()
# Export it as an environment variable with true/false value
Write-Output "SKIP_UNSTABLE=$Result" | Out-File -FilePath $env:GITHUB_ENV -Append
Write-Output "SKIP_UNSTABLE will be: $Result"
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
if: env.SKIP_UNSTABLE == 'false'
with:
persist-credentials: false
- name: Set up Python
if: env.SKIP_UNSTABLE == 'false'
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
with:
python-version: ${{ env.MAIN_PYTHON_VERSION }}
- name: Set up headless display
if: env.SKIP_UNSTABLE == 'false'
uses: pyvista/setup-headless-display-action@7d84ae825e6d9297a8e99bdbbae20d1b919a0b19 # v4.2
- name: Install packages for testing
if: env.SKIP_UNSTABLE == 'false'
run: |
python -m pip install --upgrade pip
pip install --upgrade build wheel
pip install -e . --group tests
- name: Login to GitHub Container Registry
if: env.SKIP_UNSTABLE == 'false'
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Download Geometry service container (if needed)
if: env.SKIP_UNSTABLE == 'false'
env:
FULL_IMAGE_NAME: "${{ env.ANSRV_GEO_IMAGE }}:${{ matrix.docker-image }}"
run: |
Write-Host "Pulling Docker image: $env:FULL_IMAGE_NAME"
docker pull $env:FULL_IMAGE_NAME
- name: Start Geometry service and verify start
if: env.SKIP_UNSTABLE == 'false'
env:
FULL_IMAGE_NAME: "${{ env.ANSRV_GEO_IMAGE }}:${{ matrix.docker-image }}"
PORT_MAPPING: "${{ env.ANSRV_GEO_PORT }}:50051"
TRANSPORT_MODE_SELECTION: ${{ secrets.TRANSPORT_MODE_SELECTION }}
run: |
# Write command to file launch.txt for sanitizing purposes
echo "docker run --detach --name $env:GEO_CONT_NAME -e LICENSE_SERVER=$env:ANSRV_GEO_LICENSE_SERVER -p $env:PORT_MAPPING $env:FULL_IMAGE_NAME $env:TRANSPORT_MODE_SELECTION" | Out-File -FilePath launch.txt
# Read the file and execute the command
$command = Get-Content -Path launch.txt | Select-String -Pattern "docker run"
Invoke-Expression $command.Line
Start-Sleep -Seconds 10
python -c "from ansys.geometry.core.connection.validate import validate; validate()"
- name: Restore images cache
if: env.SKIP_UNSTABLE == 'false'
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: .\tests\integration\image_cache
key: pyvista-image-cache-${{ runner.os }}-v-${{ env.RESET_IMAGE_CACHE }}-${{ hashFiles('pyproject.toml') }}
restore-keys: pyvista-image-cache-${{ runner.os }}-v-${{ env.RESET_IMAGE_CACHE }}
lookup-only: false # zizmor: ignore[cache-poisoning]
- name: Testing
if: env.SKIP_UNSTABLE == 'false'
timeout-minutes: 20 # Sometimes hangs...
run: |
pytest -v
- name: Upload integration test logs
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: integration-test-logs-${{ matrix.docker-image }}
path: tests/integration/logs/integration_tests_logs.txt
retention-days: 7
- name: Upload PyVista generated images (cache and results)
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: pytest-pyvista-images-${{ matrix.docker-image }}
path: tests/integration/image_cache
retention-days: 7
- name: Upload Coverage Results
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
include-hidden-files: true
name: coverage-html-${{ matrix.docker-image }}
path: .cov/html
retention-days: 7
- name: Upload coverage to Codecov
uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
if: matrix.docker-image == 'core-windows-latest'
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
with:
files: .cov/xml
- name: Stop the Geometry service
if: always()
run: |
if ( "$env:SKIP_UNSTABLE" -match 'false')
{
docker stop $env:GEO_CONT_NAME
docker logs $env:GEO_CONT_NAME
docker rm $env:GEO_CONT_NAME
}
docs:
name: Documentation
needs: [docs-style]
runs-on: ubuntu-latest
steps:
- name: Set up headless display
uses: pyvista/setup-headless-display-action@7d84ae825e6d9297a8e99bdbbae20d1b919a0b19 # v4.2
- name: Login to GitHub Container Registry
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Pull and launch geometry service
env:
TRANSPORT_MODE_SELECTION: ${{ secrets.TRANSPORT_MODE_SELECTION }}
run: |
docker pull ${ANSRV_GEO_IMAGE_DOCS_TAG}
docker run --detach --name ${GEO_CONT_NAME} -e LICENSE_SERVER=${ANSRV_GEO_LICENSE_SERVER} -p ${ANSRV_GEO_PORT}:50051 ${ANSRV_GEO_IMAGE_DOCS_TAG} ${TRANSPORT_MODE_SELECTION}
- name: Run Ansys documentation building action
uses: ansys/actions/doc-build@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
with:
python-version: ${{ env.MAIN_PYTHON_VERSION }}
add-pdf-html-docs-as-assets: true
needs-quarto: true
dependencies: 'pandoc'
sphinxopts: '-j 1 -W --color'
group-dependencies-name: "doc"
- name: Stop the Geometry service
if: always()
run: |
docker stop ${GEO_CONT_NAME}
docker logs ${GEO_CONT_NAME}
docker rm ${GEO_CONT_NAME}
testing-linux:
name: Testing and coverage (Linux)
needs: [smoke-tests, manifests]
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental }}
env:
SKIP_UNSTABLE: false
strategy:
fail-fast: false
matrix:
include:
- docker-image: "core-linux-latest"
experimental: false
- docker-image: "core-linux-latest-unstable"
experimental: true
steps:
- name: Calculate SKIP_UNSTABLE
if: matrix.experimental
env:
DOCKER_IMAGE: ${{ matrix.docker-image }}
SKIP_CORE_LINUX: ${{ needs.manifests.outputs.skip_core_linux }}
VARS_SKIP_UNSTABLE_CONTAINERS_TEMPORARILY: ${{ vars.SKIP_UNSTABLE_CONTAINERS_TEMPORARILY}}
run: |
# Choose the manifests output to consider (for Core service)
# based on the matrix value
if [[ "${DOCKER_IMAGE}" == "core-linux-latest-unstable" ]]; then
ImagesAreEqual=${SKIP_CORE_LINUX}
else
echo "Unknown docker image"
exit 1
fi
A=$([[ "${VARS_SKIP_UNSTABLE_CONTAINERS_TEMPORARILY}" == "1" ]] && echo true || echo false)
B=$([[ "$ImagesAreEqual" == "1" ]] && echo true || echo false)
# Calculate the logical expression
Result=$([[ "$A" == true || "$B" == true ]] && echo true || echo false)
# Export it as an environment variable with true/false value
echo "SKIP_UNSTABLE=$Result" >> $GITHUB_ENV
echo "SKIP_UNSTABLE will be: $Result"
- name: Set up headless display
if: env.SKIP_UNSTABLE == 'false'
uses: pyvista/setup-headless-display-action@7d84ae825e6d9297a8e99bdbbae20d1b919a0b19 # v4.2
- name: Login in Github Container registry
if: env.SKIP_UNSTABLE == 'false'
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Pull and launch geometry service
if: env.SKIP_UNSTABLE == 'false'
env:
FULL_IMAGE_NAME: "${{ env.ANSRV_GEO_IMAGE }}:${{ matrix.docker-image }}"
TRANSPORT_MODE_SELECTION: ${{ secrets.TRANSPORT_MODE_SELECTION }}
run: |
echo "Pulling Docker image: ${FULL_IMAGE_NAME}"
docker pull ${FULL_IMAGE_NAME}
docker run --detach --name ${GEO_CONT_NAME} -e LICENSE_SERVER=${ANSRV_GEO_LICENSE_SERVER} -p ${ANSRV_GEO_PORT}:50051 ${FULL_IMAGE_NAME} ${TRANSPORT_MODE_SELECTION}
- name: Checkout repository
if: env.SKIP_UNSTABLE == 'false'
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Restore images cache
if: env.SKIP_UNSTABLE == 'false'
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: tests/integration/image_cache
key: pyvista-image-cache-${{ runner.os }}-v-${{ env.RESET_IMAGE_CACHE }}-${{ hashFiles('pyproject.toml') }}
restore-keys: pyvista-image-cache-${{ runner.os }}-v-${{ env.RESET_IMAGE_CACHE }}
lookup-only: false # zizmor: ignore[cache-poisoning]
- name: Run pytest
if: env.SKIP_UNSTABLE == 'false'
uses: ansys/actions/tests-pytest@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
env:
ALLOW_PLOTTING: true
with:
python-version: ${{ env.MAIN_PYTHON_VERSION }}
checkout: false
randomize: true
group-dependencies-name: "tests"
- name: Upload coverage to Codecov
uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
if: matrix.docker-image == 'core-linux-latest'
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
with:
files: .cov/xml
- name: Upload integration test logs
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: integration-test-logs-${{ matrix.docker-image }}
path: tests/integration/logs/integration_tests_logs.txt
retention-days: 7
- name: Upload PyVista generated images (cache and results)
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: pytest-pyvista-images-${{ matrix.docker-image }}
path: tests/integration/image_cache
retention-days: 7
- name: Stop the Geometry service
if: always()
run: |
if [[ ${SKIP_UNSTABLE} == 'false' ]];
then
docker stop ${GEO_CONT_NAME}
docker logs ${GEO_CONT_NAME}
docker rm ${GEO_CONT_NAME}
fi
testing-min-reqs:
name: Testing with minimum requirements
needs: [smoke-tests]
runs-on: ubuntu-latest
env:
ANSRV_GEO_IMAGE_MINREQS: 'ghcr.io/ansys/geometry:core-linux-latest'
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.11', '3.12', '3.13']
steps:
- name: Set up headless display
uses: pyvista/setup-headless-display-action@7d84ae825e6d9297a8e99bdbbae20d1b919a0b19 # v4.2
- name: Login in Github Container registry
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Checkout repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Setup Python ${{ matrix.python-version }}
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
with:
python-version: ${{ matrix.python-version }}
- name: Install minimum requirements
run: |
python -m pip install --upgrade pip
pip install -e .[all] --group tests-minimal
- name: Start Geometry service and verify start
env:
TRANSPORT_MODE_SELECTION: ${{ secrets.TRANSPORT_MODE_SELECTION }}
run: |
docker pull ${ANSRV_GEO_IMAGE_MINREQS}
docker run --detach --name ${GEO_CONT_NAME} -e LICENSE_SERVER=${ANSRV_GEO_LICENSE_SERVER} -p ${ANSRV_GEO_PORT}:50051 ${ANSRV_GEO_IMAGE_MINREQS} ${TRANSPORT_MODE_SELECTION}
python -c "from ansys.geometry.core.connection.validate import validate; validate()"
- name: Run pytest
run: |
pytest -v
- name: Stop the Geometry service
if: always()
run: |
docker stop ${GEO_CONT_NAME}
docker logs ${GEO_CONT_NAME}
docker rm ${GEO_CONT_NAME}
testing-no-graphics:
name: Testing with minimum requirements (no graphics)
needs: [smoke-tests]
runs-on: ubuntu-latest
env:
ANSRV_GEO_IMAGE_MINREQS: 'ghcr.io/ansys/geometry:core-linux-latest'
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.13']
steps:
- name: Login in Github Container registry
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Checkout repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Setup Python ${{ matrix.python-version }}
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
with:
python-version: ${{ matrix.python-version }}
- name: Install minimum requirements
run: |
python -m pip install --upgrade pip
pip install -e . --group tests-minimal
# Uninstall pytest-pyvista (not needed for these tests)
pip uninstall -y pytest-pyvista
# Installing docker (needed for the tests)
pip install docker
- name: Start Geometry service and verify start
env:
TRANSPORT_MODE_SELECTION: ${{ secrets.TRANSPORT_MODE_SELECTION }}
run: |
docker pull ${ANSRV_GEO_IMAGE_MINREQS}
docker run --detach --name ${GEO_CONT_NAME} -e LICENSE_SERVER=${ANSRV_GEO_LICENSE_SERVER} -p ${ANSRV_GEO_PORT}:50051 ${ANSRV_GEO_IMAGE_MINREQS} ${TRANSPORT_MODE_SELECTION}
python -c "from ansys.geometry.core.connection.validate import validate; validate()"
- name: Run pytest
run: |
pytest -v -c pytest-nographics.ini
- name: Stop the Geometry service
if: always()
run: |
docker stop ${GEO_CONT_NAME}
docker logs ${GEO_CONT_NAME}
docker rm ${GEO_CONT_NAME}
package:
name: Package library
needs: [testing-windows, testing-linux, testing-min-reqs, testing-no-graphics, docs]
runs-on: ubuntu-latest
permissions:
attestations: write
contents: read
id-token: write
steps:
- name: Build library source and wheel artifacts
uses: ansys/actions/build-library@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
with:
library-name: ${{ env.PACKAGE_NAME }}
python-version: ${{ env.MAIN_PYTHON_VERSION }}
attest-provenance: true
# =================================================================================================
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv RUNNING ON SELF-HOSTED RUNNER vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
# =================================================================================================
fetch-release-artifacts:
name: Fetch release artifacts
needs: [testing-windows, testing-linux, docs]
if: github.event_name == 'push' && contains(github.ref, 'refs/tags')
runs-on:
group: ansys-network
labels: [Windows, pygeometry]
env:
REUSE_LAST_ARTIFACTS: ${{ vars.REUSE_LAST_ARTIFACTS == 1 }}
steps:
- name: Check out repository pyansys-geometry-binaries
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
repository: 'ansys/pyansys-geometry-binaries'
token: ${{ secrets.BINARIES_TOKEN }}
persist-credentials: true
- name: Download binaries (if conditions met)
if: env.REUSE_LAST_ARTIFACTS == 'false'
env:
ARTIFACTORY_URL: ${{ secrets.ARTIFACTORY_URL }}
ARTIFACTORY_KEY: ${{ secrets.ARTIFACTORY_KEY }}
run: |
curl.exe -X GET -H "X-JFrog-Art-Api: $env:ARTIFACTORY_KEY" $env:ARTIFACTORY_URL/$env:ARTIFACTORY_VERSION/DockerCoreWindows.zip --output windows-core-binaries.zip
curl.exe -X GET -H "X-JFrog-Art-Api: $env:ARTIFACTORY_KEY" $env:ARTIFACTORY_URL/$env:ARTIFACTORY_VERSION/DockerCoreLinux.zip --output linux-core-binaries.zip
- name: Reuse last binaries (if conditions met)
if: env.REUSE_LAST_ARTIFACTS == 'true'
env:
VERSION_WITH_PREFIX: ${{ github.ref_name }}
run: |
# We are on a Windows machine. We need to copy the binaries from the previous tag,
# based on the current tag. We will also remove the trailing "v" from the tag. This will give
# us the folder from where we need to copy the binaries.
$env:VERSION=$env:VERSION_WITH_PREFIX.substring(1)
$env:PREVIOUS_VERSION=$env:VERSION.substring(0, $env:VERSION.Length - 1)
$env:PREVIOUS_PATCH_VERSION_NUMBER=$env:VERSION.substring($env:VERSION.Length - 1)
$env:PREVIOUS_PATCH_VERSION_NUMBER=[int]$env:PREVIOUS_PATCH_VERSION_NUMBER - 1
$env:PREVIOUS_VERSION=$env:PREVIOUS_VERSION + $env:PREVIOUS_PATCH_VERSION_NUMBER
# Fetch the LFS files from the previous version
git lfs fetch origin --include="$env:PREVIOUS_VERSION/*"
git lfs checkout $env:PREVIOUS_VERSION
# Copy the binaries from the previous version
cp ./$env:PREVIOUS_VERSION/windows-core-binaries.zip windows-core-binaries.zip
cp ./$env:PREVIOUS_VERSION/linux-core-binaries.zip linux-core-binaries.zip
- name: Upload Linux Core service binaries as workflow artifacts
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: linux-core-binaries.zip
path: linux-core-binaries.zip
retention-days: 1
- name: Upload Windows Core service binaries as workflow artifacts
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: windows-core-binaries.zip
path: windows-core-binaries.zip
retention-days: 1
- name: Publish the binaries to private repo
env:
VERSION_WITH_PREFIX: ${{ github.ref_name }}
BINARIES_EMAIL: ${{ secrets.BINARIES_EMAIL }}
BINARIES_USERNAME: ${{ secrets.BINARIES_USERNAME }}
run: |
$env:VERSION=$env:VERSION_WITH_PREFIX.substring(1)
mkdir $env:VERSION -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force .\$env:VERSION\*
mv windows-core-binaries.zip .\$env:VERSION\
mv linux-core-binaries.zip .\$env:VERSION\
git config user.email $env:BINARIES_EMAIL
git config user.name $env:BINARIES_USERNAME
git add *
git commit -m "adding binaries for $env:VERSION_WITH_PREFIX"
git push origin main
build-windows-container:
name: Building Geometry Service - Windows
runs-on: [self-hosted, Windows, pygeometry]
needs: [fetch-release-artifacts]
strategy:
fail-fast: false
matrix:
include:
- mode: "coreservice"
docker-file: "windows-core-dockerfile.zip"
zip-file: "windows-core-binaries.zip"
steps:
- name: Checkout repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Set up headless display
uses: pyvista/setup-headless-display-action@7d84ae825e6d9297a8e99bdbbae20d1b919a0b19 # v4.2
- name: Set up Python
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
with:
python-version: ${{ env.MAIN_PYTHON_VERSION }}
- name: Download Windows binaries for ${{ matrix.mode }}
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: ${{ matrix.zip-file }}
path: docker/${{ matrix.zip-file }}
- name: Build Docker image
working-directory: docker
env:
BUILD_MODE: ${{ matrix.mode }}
run: |
docker build -f windows/$env:BUILD_MODE/Dockerfile -t ghcr.io/ansys/geometry:windows-tmp .
- name: Check location of self-hosted runner and define license server accordingly
if: runner.name == 'pygeometry-ci-2'
env:
LICENSE_SERVER_INTERNAL: ${{ secrets.LICENSE_SERVER_INTERNAL }}
run: |
echo "ANSRV_GEO_LICENSE_SERVER=$env:LICENSE_SERVER_INTERNAL" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Validate connection using PyAnsys Geometry
run: |
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install -e . --group tests
- name: Restore images cache
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: .\tests\integration\image_cache
key: pyvista-image-cache-${{ runner.os }}-v-${{ env.RESET_IMAGE_CACHE }}-${{ hashFiles('pyproject.toml') }}
restore-keys: pyvista-image-cache-${{ runner.os }}-v-${{ env.RESET_IMAGE_CACHE }}
lookup-only: false # zizmor: ignore[cache-poisoning]
- name: Start Geometry service and verify start
env:
TRANSPORT_MODE_SELECTION: ${{ secrets.TRANSPORT_MODE_SELECTION }}
PORT_MAPPING: "${{ env.ANSRV_GEO_PORT }}:50051"
run: |
.\.venv\Scripts\Activate.ps1
# Write command to file launch.txt for sanitizing purposes
echo "docker run --detach --name $env:GEO_CONT_NAME -e LICENSE_SERVER=$env:ANSRV_GEO_LICENSE_SERVER -p $env:PORT_MAPPING ghcr.io/ansys/geometry:windows-tmp $env:TRANSPORT_MODE_SELECTION" | Out-File -FilePath launch.txt
# Read the file and execute the command
$command = Get-Content -Path launch.txt | Select-String -Pattern "docker run"
Invoke-Expression $command.Line
Start-Sleep -Seconds 10
python -c "from ansys.geometry.core.connection.validate import validate; validate()"
- name: Testing
timeout-minutes: 20 # On Windows self-hosted runners, sometimes hangs...
run: |
.\.venv\Scripts\Activate.ps1
pytest -v --use-existing-service=yes
- name: "Compressing Windows Dockerfile"
uses: vimtor/action-zip@1379ea20d4c5705669ba81fd626dd01b1c738f26 # v1.2
with:
files: docker/windows/${{ matrix.mode }}/Dockerfile
dest: ${{ matrix.docker-file }}
- name: Upload Windows Dockerfile
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ${{ matrix.docker-file }}
path: ${{ matrix.docker-file }}
retention-days: 7
- name: Stop the Geometry service
if: always()
run: |
docker stop $env:GEO_CONT_NAME
docker logs $env:GEO_CONT_NAME
docker rm $env:GEO_CONT_NAME
- name: Stop any remaining containers
if: always()
run: |
$dockerContainers = docker ps -a -q
if (-not [string]::IsNullOrEmpty($dockerContainers)) {
docker stop $dockerContainers
docker rm $dockerContainers
}
- name: Delete the Docker images (and untagged ones)
if: always()
run: |
docker image rm ghcr.io/ansys/geometry:windows-tmp
docker system prune -f
# =================================================================================================
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RUNNING ON SELF-HOSTED RUNNER ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# =================================================================================================
build-linux-container:
name: Building Geometry Service - Linux
runs-on: ubuntu-latest
needs: [fetch-release-artifacts]
steps:
- name: Checkout repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
with:
python-version: ${{ env.MAIN_PYTHON_VERSION }}
- name: Set up headless display
uses: pyvista/setup-headless-display-action@7d84ae825e6d9297a8e99bdbbae20d1b919a0b19 # v4.2
- name: Download Linux binaries
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: linux-core-binaries.zip
path: docker/linux-core-binaries.zip
- name: Build Docker image
working-directory: docker
run: |
docker build -f linux/coreservice/Dockerfile -t ghcr.io/ansys/geometry:linux-tmp .
- name: Validate connection using PyAnsys Geometry
run: |
python -m pip install --upgrade pip
pip install -e . --group tests
- name: Start Geometry service and verify start
env:
TRANSPORT_MODE_SELECTION: ${{ secrets.TRANSPORT_MODE_SELECTION }}
run: |
docker run --detach --name ${GEO_CONT_NAME} -e LICENSE_SERVER=${ANSRV_GEO_LICENSE_SERVER} -p ${ANSRV_GEO_PORT}:50051 ghcr.io/ansys/geometry:linux-tmp ${TRANSPORT_MODE_SELECTION}
python -c "from ansys.geometry.core.connection.validate import validate; validate()"
- name: Restore images cache
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: .\tests\integration\image_cache
key: pyvista-image-cache-${{ runner.os }}-v-${{ env.RESET_IMAGE_CACHE }}-${{ hashFiles('pyproject.toml') }}
restore-keys: pyvista-image-cache-${{ runner.os }}-v-${{ env.RESET_IMAGE_CACHE }}
lookup-only: false # zizmor: ignore[cache-poisoning]
- name: Run pytest
uses: ansys/actions/tests-pytest@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
env:
ALLOW_PLOTTING: true
with:
python-version: ${{ env.MAIN_PYTHON_VERSION }}
pytest-extra-args: "--use-existing-service=yes"
checkout: false
randomize: true
group-dependencies-name: "tests"
- name: "Compressing Linux Dockerfile"
uses: vimtor/action-zip@1379ea20d4c5705669ba81fd626dd01b1c738f26 # v1.2
with:
files: docker/linux/coreservice/Dockerfile
dest: linux-core-dockerfile.zip
- name: Upload Linux Dockerfile
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: linux-core-dockerfile.zip
path: linux-core-dockerfile.zip
retention-days: 7
- name: Stop the Geometry service
if: always()
run: |
docker stop ${GEO_CONT_NAME}
docker logs ${GEO_CONT_NAME}
docker rm ${GEO_CONT_NAME}
release:
name: Release project to GitHub
if: github.event_name == 'push' && contains(github.ref, 'refs/tags')
needs: [package, build-windows-container, build-linux-container, update-changelog]
runs-on: ubuntu-latest
# Specifying a GitHub environment is optional, but strongly encouraged
environment: release
permissions:
id-token: write
contents: write
steps:
- name: Release to GitHub
uses: ansys/actions/release-github@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
with:
token: ${{ secrets.GITHUB_TOKEN }}
library-name: ${{ env.PACKAGE_NAME }}
additional-artifacts: windows-core-dockerfile.zip linux-core-dockerfile.zip
add-artifact-attestation-notes: true
changelog-release-notes: true
release-pypi:
name: Release project to PyPI
if: github.event_name == 'push' && contains(github.ref, 'refs/tags')
needs: [package, build-windows-container, build-linux-container, update-changelog]
runs-on: ubuntu-latest
# Specifying a GitHub environment is optional, but strongly encouraged
environment: release
permissions:
id-token: write
contents: write
steps:
- name: "Download the library artifacts from build-library step"
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: ${{ env.PACKAGE_NAME }}-artifacts
path: ${{ env.PACKAGE_NAME }}-artifacts
- name: "Upload artifacts to PyPI using trusted publisher"
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
with:
repository-url: "https://upload.pypi.org/legacy/"
print-hash: true
packages-dir: ${{ env.PACKAGE_NAME }}-artifacts
skip-existing: false
upload_dev_docs:
name: Upload dev documentation
if: github.ref == 'refs/heads/main'
needs: [package]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Deploy the latest documentation
uses: ansys/actions/doc-deploy-dev@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
with:
cname: ${{ env.DOCUMENTATION_CNAME }}
token: ${{ secrets.PYANSYS_CI_BOT_TOKEN }}
bot-user: ${{ secrets.PYANSYS_CI_BOT_USERNAME }}
bot-email: ${{ secrets.PYANSYS_CI_BOT_EMAIL }}
upload_docs_release:
name: Upload release documentation
if: github.event_name == 'push' && contains(github.ref, 'refs/tags')
needs: [release, release-pypi]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Deploy the stable documentation
uses: ansys/actions/doc-deploy-stable@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
with:
cname: ${{ env.DOCUMENTATION_CNAME }}
token: ${{ secrets.PYANSYS_CI_BOT_TOKEN }}
bot-user: ${{ secrets.PYANSYS_CI_BOT_USERNAME }}
bot-email: ${{ secrets.PYANSYS_CI_BOT_EMAIL }}
automerge-prs:
name: Automerge PRs (dependabot and pre-commit.ci only)
runs-on: ubuntu-latest
needs: [package]
if: github.event_name == 'pull_request'
permissions:
contents: write
pull-requests: write
steps:
- name: Automerge PRs
uses: ansys/actions/hk-automerge-prs@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
with:
approver: ${{ secrets.PYANSYS_CI_BOT_USERNAME }}
approver-token: ${{ secrets.PYANSYS_CI_BOT_TOKEN }}
- name: If pre-commit PR, add assignee
if: startsWith(github.head_ref, 'pre-commit-ci-update-config')
run: gh pr edit --add-assignee pyansys-ci-bot "$PR_URL"
env:
PR_URL: ${{github.event.pull_request.html_url}}
GH_TOKEN: ${{ secrets.PYANSYS_CI_BOT_TOKEN }}