Skip to content

Unstable build tests and promotion #1991

Unstable build tests and promotion

Unstable build tests and promotion #1991

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, 1100, and 1900
- cron: "0 3,11,19 * * *"
# 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.13'
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
permissions: {} # Disable default permissions
jobs:
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 }}
permissions:
contents: read
packages: read
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
id: services
env:
CONTAINER_STABLE: ${{ matrix.container-stable }}
CONTAINER_UNSTABLE: ${{ matrix.container-unstable }}
SERVICE: ${{ matrix.service }}
SERVICE_NAME: ${{ matrix.service-name }}
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
windows-tests:
name: Windows Core Service
needs: manifests
if: needs.manifests.outputs.skip_core_windows == 0
runs-on: windows-latest
env:
PYVISTA_OFF_SCREEN: true
permissions:
contents: read
packages: read
steps:
- 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: Install packages for testing
run: |
pip install --upgrade build
pip install -e . --group tests
- 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: Download Geometry service container
run: |
docker pull $env:ANSRV_GEO_IMAGE_WINDOWS_CORE_TAG
- name: Start Geometry service and verify start
env:
TRANSPORT_MODE_SELECTION: ${{ secrets.TRANSPORT_MODE_SELECTION }}
PORT_MAPPING: "${{ env.ANSRV_GEO_PORT }}:50051"
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:ANSRV_GEO_IMAGE_WINDOWS_CORE_TAG $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: Run PyAnsys Geometry tests
timeout-minutes: 20 # Sometimes hangs...
run: |
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: Microsoft Teams Notification
uses: skitionek/notify-microsoft-teams@11e40c38c3a629ae65a985b582eca4897b01e79e # v1.0.9
if: failure()
with:
webhook_url: ${{ secrets.MSTEAMS_WEBHOOK }}
# Message to send to Teams as a webhook notification in JSON Payload format
raw: >-
{
"type": "message",
"attachments": [
{
"contentType": "application/vnd.microsoft.card.adaptive",
"content": {
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.0",
"body": [
{
"type": "TextBlock",
"text": "**Windows Core Service unstable build tests are failing**\n\n[View
details in GitHub Actions](https://github.com/ansys/pyansys-geometry/actions/runs/${{ github.run_id }})",
"wrap": true
}
]
}
}
]
}
linux-tests:
name: Linux Core Service
needs: manifests
if: needs.manifests.outputs.skip_core_linux == 0
runs-on: ubuntu-latest
permissions:
contents: read
packages: read
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: Pull and launch geometry service
env:
TRANSPORT_MODE_SELECTION: ${{ secrets.TRANSPORT_MODE_SELECTION }}
run: |
docker pull ${ANSRV_GEO_IMAGE_LINUX_CORE_TAG}
docker run --detach --name ${GEO_CONT_NAME} -e LICENSE_SERVER=${ANSRV_GEO_LICENSE_SERVER} -p ${ANSRV_GEO_PORT}:50051 ${ANSRV_GEO_IMAGE_LINUX_CORE_TAG} ${TRANSPORT_MODE_SELECTION}
- name: Set up headless display
uses: pyvista/setup-headless-display-action@7d84ae825e6d9297a8e99bdbbae20d1b919a0b19 # v4.2
- name: Run pytest
uses: ansys/actions/tests-pytest@c2fa7c93f6883114e0e643599431b33d29f0b13f # v10.1.4
env:
ALLOW_PLOTTING: true
with:
python-version: ${{ env.MAIN_PYTHON_VERSION }}
group-dependencies-name: "tests"
- name: Stop the Geometry service
if: always()
run: |
docker stop ${GEO_CONT_NAME}
docker logs ${GEO_CONT_NAME}
docker rm ${GEO_CONT_NAME}
- name: Microsoft Teams Notification
uses: skitionek/notify-microsoft-teams@11e40c38c3a629ae65a985b582eca4897b01e79e # v1.0.9
if: failure()
with:
webhook_url: ${{ secrets.MSTEAMS_WEBHOOK }}
# Message to send to Teams as a webhook notification in JSON Payload format
raw: >-
{
"type": "message",
"attachments": [
{
"contentType": "application/vnd.microsoft.card.adaptive",
"content": {
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.0",
"body": [
{
"type": "TextBlock",
"text": "**Linux Core Service unstable build tests are failing**\n\n[View
details in GitHub Actions](https://github.com/ansys/pyansys-geometry/actions/runs/${{ github.run_id }})",
"wrap": true
}
]
}
}
]
}
promote-windows:
needs: windows-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
permissions:
packages: write
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: 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
permissions:
packages: write
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: Pull Linux latest unstable container
run: docker pull ${LINUX_UNSTABLE}
- name: Tag container as latest (stable) for Github Container registry
run: docker tag ${LINUX_UNSTABLE} ${LINUX_STABLE_GHCR}
- name: Publish latest stable container in ghcr.io
run: docker push ${LINUX_STABLE_GHCR}