Unstable build tests and promotion #1991
This file contains hidden or 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: 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} |