Skip to content

Unstable build tests and promotion #953

Unstable build tests and promotion

Unstable build tests and promotion #953

name: Unstable build tests and promotion
on:
workflow_dispatch:
inputs:
promote:
description: 'Promote the latest build to stable (if tests pass)'
required: false
default: false
type: boolean
schedule: # UTC at 0300
- cron: "0 3 * * *"
# Trigger workflow when file is modified
push:
paths:
- '.github/workflows/nightly_docker_test.yml'
# Sequence of patterns matched against refs/heads
branches-ignore:
- 'release/**'
# Sequence of patterns matched against refs/tags
tags-ignore:
- v*
env:
MAIN_PYTHON_VERSION: '3.12'
ANSRV_GEO_IMAGE_WINDOWS_TAG: ghcr.io/ansys/geometry:windows-latest-unstable
ANSRV_GEO_IMAGE_WINDOWS_CORE_TAG: ghcr.io/ansys/geometry:core-windows-latest-unstable
ANSRV_GEO_IMAGE_LINUX_CORE_TAG: ghcr.io/ansys/geometry:core-linux-latest-unstable
ANSRV_GEO_PORT: 710
ANSRV_GEO_LICENSE_SERVER: ${{ secrets.LICENSE_SERVER }}
GEO_CONT_NAME: ans_geo_nightly
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
manifests:
name: Check Docker manifests
runs-on: ubuntu-latest
outputs:
skip_dms: ${{ steps.services.outputs.skip_dms }}
skip_core_windows: ${{ steps.services.outputs.skip_core_windows }}
skip_core_linux: ${{ steps.services.outputs.skip_core_linux }}
strategy:
matrix:
include:
- container-stable: "windows-latest"
container-unstable: "windows-latest-unstable"
service: "dms"
service-name: "Windows DMS"
- 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@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Check ${{ matrix.service-name }} manifest
id: services
run: |
docker manifest inspect ghcr.io/ansys/geometry:${{ matrix.container-stable }} > ${{ matrix.container-stable }}.json
docker manifest inspect ghcr.io/ansys/geometry:${{ matrix.container-unstable }} > ${{ matrix.container-unstable }}.json || true
# Verify that the unstable manifest exists - otherwise create an empty file
if [ ! -f ${{ matrix.container-unstable }}.json ]; then
touch ${{ matrix.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 ${{ matrix.container-stable }}.json ${{ matrix.container-unstable }}.json; then
echo "${{ matrix.service-name }} container manifests are the same... skipping"
echo "skip_${{ matrix.service }}=1" >> "$GITHUB_OUTPUT"
else
echo "${{ matrix.service-name }} container manifests are different"
echo "skip_${{ matrix.service }}=0" >> "$GITHUB_OUTPUT"
fi
# =================================================================================================
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RUNNING ON SELF-HOSTED RUNNER ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# =================================================================================================
windows-dms-tests:
name: Windows DMS
needs: manifests
if: needs.manifests.outputs.skip_dms == 0
runs-on: [self-hosted, Windows, pygeometry]
env:
PYVISTA_OFF_SCREEN: true
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.MAIN_PYTHON_VERSION }}
- name: Set up headless display
uses: pyvista/setup-headless-display-action@v3
with:
pyvista: false
- name: Create Python venv
run: |
python -m venv .venv
.\.venv\Scripts\Activate.ps1
- name: Install packages for testing
run: |
.\.venv\Scripts\Activate.ps1
pip install --upgrade build
pip install .[tests]
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Download Geometry service container (always latest version)
run: |
docker image rm ${{ env.ANSRV_GEO_IMAGE_WINDOWS_TAG }}
docker pull ${{ env.ANSRV_GEO_IMAGE_WINDOWS_TAG }}
- name: Check location of self-hosted runner and define license server accordingly
if: runner.name == 'pygeometry-ci-2'
run:
echo "ANSRV_GEO_LICENSE_SERVER=${{ secrets.INTERNAL_LICENSE_SERVER }}" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Start Geometry service and verify start
run: |
.\.venv\Scripts\Activate.ps1
docker run --detach --name ${{ env.GEO_CONT_NAME }} -e LICENSE_SERVER=${{ env.ANSRV_GEO_LICENSE_SERVER }} -p ${{ env.ANSRV_GEO_PORT }}:50051 ${{ env.ANSRV_GEO_IMAGE_WINDOWS_TAG }}
python -c "from ansys.geometry.core.connection.validate import validate; validate()"
- name: Run PyAnsys Geometry tests
run: |
.\.venv\Scripts\Activate.ps1
pytest -v
- 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: Clean all Docker dangling images
if: always()
run: docker image prune -f
- name: Microsoft Teams Notification
uses: skitionek/notify-microsoft-teams@master
if: failure()
with:
webhook_url: ${{ secrets.MSTEAMS_WEBHOOK }}
# Message to send to Teams as a webhook notification in JSON Payload format
raw: >-
{
"@type": "MessageCard",
"@context": "http://schema.org/extensions",
"summary": "Unstable build tests for Windows DMS failing",
"themeColor": "f44336",
"title": "PyAnsys Geometry unstable build tests - Windows DMS failing",
"sections": [
{
"activityTitle": "Windows DMS unstable build tests are failing",
"activitySubtitle": "Check the run for more details: https://github.com/ansys/pyansys-geometry/actions/runs/${{ github.run_id }}",
"facts": [
{
"name": "Status",
"value": "Failed"
}
]
}
]
}
windows-core-tests:
name: Windows Core Service
needs: manifests
if: needs.manifests.outputs.skip_core_windows == 0
# runs-on: [self-hosted, Windows, pygeometry]
runs-on: # TODO: Waiting for ansys-network runner to be updated
group: pyansys-self-hosted
labels: [self-hosted, Windows, pygeometry]
env:
PYVISTA_OFF_SCREEN: true
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.MAIN_PYTHON_VERSION }}
- name: Set up headless display
uses: pyvista/setup-headless-display-action@v3
with:
pyvista: false
- name: Create Python venv
run: |
python -m venv .venv
.\.venv\Scripts\Activate.ps1
- name: Install packages for testing
run: |
.\.venv\Scripts\Activate.ps1
pip install --upgrade build
pip install .[tests]
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Download Geometry service container (always latest version)
run: |
docker image rm ${{ env.ANSRV_GEO_IMAGE_WINDOWS_CORE_TAG }}
docker pull ${{ env.ANSRV_GEO_IMAGE_WINDOWS_CORE_TAG }}
- name: Check location of self-hosted runner and define license server accordingly
if: runner.name == 'pygeometry-ci-2'
run:
echo "ANSRV_GEO_LICENSE_SERVER=${{ secrets.INTERNAL_LICENSE_SERVER }}" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Start Geometry service and verify start
run: |
.\.venv\Scripts\Activate.ps1
docker run --detach --name ${{ env.GEO_CONT_NAME }} -e LICENSE_SERVER=${{ env.ANSRV_GEO_LICENSE_SERVER }} -p ${{ env.ANSRV_GEO_PORT }}:50051 ${{ env.ANSRV_GEO_IMAGE_WINDOWS_CORE_TAG }}
python -c "from ansys.geometry.core.connection.validate import validate; validate()"
- name: Run PyAnsys Geometry tests
run: |
.\.venv\Scripts\Activate.ps1
pytest -v
- 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: Clean all Docker dangling images
if: always()
run: docker image prune -f
- name: Microsoft Teams Notification
uses: skitionek/notify-microsoft-teams@master
if: failure()
with:
webhook_url: ${{ secrets.MSTEAMS_WEBHOOK }}
# Message to send to Teams as a webhook notification in JSON Payload format
raw: >-
{
"@type": "MessageCard",
"@context": "http://schema.org/extensions",
"summary": "Unstable build tests for Windows Core Service failing",
"themeColor": "f44336",
"title": "PyAnsys Geometry unstable build tests - Windows Core Service failing",
"sections": [
{
"activityTitle": "Windows Core Service unstable build tests are failing",
"activitySubtitle": "Check the run for more details: https://github.com/ansys/pyansys-geometry/actions/runs/${{ github.run_id }}",
"facts": [
{
"name": "Status",
"value": "Failed"
}
]
}
]
}
# =================================================================================================
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RUNNING ON SELF-HOSTED RUNNER ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# =================================================================================================
linux-tests:
name: Linux Core Service
needs: manifests
if: needs.manifests.outputs.skip_core_linux == 0
runs-on: ubuntu-latest
steps:
- name: Login in Github Container registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Pull and launch geometry service
run: |
docker pull ${{ env.ANSRV_GEO_IMAGE_LINUX_CORE_TAG }}
docker run --detach --name ${{ env.GEO_CONT_NAME }} -e LICENSE_SERVER=${{ env.ANSRV_GEO_LICENSE_SERVER }} -p ${{ env.ANSRV_GEO_PORT }}:50051 ${{ env.ANSRV_GEO_IMAGE_LINUX_CORE_TAG }}
- name: Run pytest
uses: ansys/actions/tests-pytest@v8
env:
ALLOW_PLOTTING: true
with:
python-version: ${{ env.MAIN_PYTHON_VERSION }}
requires-xvfb: true
- 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: Microsoft Teams Notification
uses: skitionek/notify-microsoft-teams@master
if: failure()
with:
webhook_url: ${{ secrets.MSTEAMS_WEBHOOK }}
# Message to send to Teams as a webhook notification in JSON Payload format
raw: >-
{
"@type": "MessageCard",
"@context": "http://schema.org/extensions",
"summary": "Unstable build tests for Linux Core Service failing",
"themeColor": "f44336",
"title": "PyAnsys Geometry unstable build tests - Linux Core Service failing",
"sections": [
{
"activityTitle": "Linux Core Service unstable build tests are failing",
"activitySubtitle": "Check the run for more details: https://github.com/ansys/pyansys-geometry/actions/runs/${{ github.run_id }}",
"facts": [
{
"name": "Status",
"value": "Failed"
}
]
}
]
}
promote-windows-dms:
needs: windows-dms-tests
runs-on: windows-latest
name: Promote Windows DMS container
if: ${{ github.event.inputs.promote == 'true' || github.event_name == 'schedule' }}
env:
WINDOWS_UNSTABLE: ghcr.io/ansys/geometry:windows-latest-unstable
WINDOWS_STABLE_GHCR: ghcr.io/ansys/geometry:windows-latest
steps:
- name: Login in Github Container registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Pull Windows latest unstable container
run: docker pull ${{ env.WINDOWS_UNSTABLE }}
- name: Tag container as latest (stable) for Github Container registry
run: docker tag ${{ env.WINDOWS_UNSTABLE }} ${{ env.WINDOWS_STABLE_GHCR }}
- name: Publish latest stable container in ghcr.io
run: docker push ${{ env.WINDOWS_STABLE_GHCR }}
promote-windows-core:
needs: windows-core-tests
runs-on: windows-latest
name: Promote Windows Core Service container
if: ${{ github.event.inputs.promote == 'true' || github.event_name == 'schedule' }}
env:
WINDOWS_UNSTABLE: ghcr.io/ansys/geometry:core-windows-latest-unstable
WINDOWS_STABLE_GHCR: ghcr.io/ansys/geometry:core-windows-latest
steps:
- name: Login in Github Container registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Pull Windows latest unstable container
run: docker pull ${{ env.WINDOWS_UNSTABLE }}
- name: Tag container as latest (stable) for Github Container registry
run: docker tag ${{ env.WINDOWS_UNSTABLE }} ${{ env.WINDOWS_STABLE_GHCR }}
- name: Publish latest stable container in ghcr.io
run: docker push ${{ env.WINDOWS_STABLE_GHCR }}
promote-linux:
needs: linux-tests
runs-on: ubuntu-latest
name: Promote Linux Core Service container
if: ${{ github.event.inputs.promote == 'true' || github.event_name == 'schedule' }}
env:
LINUX_UNSTABLE: ghcr.io/ansys/geometry:core-linux-latest-unstable
LINUX_STABLE_GHCR: ghcr.io/ansys/geometry:core-linux-latest
steps:
- name: Login in Github Container registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Pull Linux latest unstable container
run: docker pull ${{ env.LINUX_UNSTABLE }}
- name: Tag container as latest (stable) for Github Container registry
run: docker tag ${{ env.LINUX_UNSTABLE }} ${{ env.LINUX_STABLE_GHCR }}
- name: Publish latest stable container in ghcr.io
run: docker push ${{ env.LINUX_STABLE_GHCR }}