Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
0c2015a
Initial plan
Copilot Feb 6, 2026
9a89c91
Add Podman integration tests for OCI runtime compatibility
Copilot Feb 6, 2026
269bf0d
Pass environment variables to Podman container
Copilot Feb 6, 2026
8a54623
Add comment clarifying Ubuntu runner requirement for Podman
Copilot Feb 6, 2026
aa27255
Fix code injection vulnerabilities in Podman workflow
Copilot Feb 10, 2026
5891521
Merge branch 'main' into copilot/test-compatibility-with-podman
rjaegers Feb 10, 2026
2f5b5c1
Fix DNS resolution issue in Podman tests by using host network
Copilot Feb 20, 2026
9abfa4a
chore(deps, rust): update github.vscode-pull-request-github in devcon…
philips-software-forest-releaser[bot] Feb 10, 2026
7857c0b
chore(deps): bump conan from 2.25.1 to 2.25.2 in /.devcontainer (#1149)
dependabot[bot] Feb 13, 2026
aa1f4fe
ci(deps): bump the github-actions group with 4 updates (#1151)
dependabot[bot] Feb 13, 2026
965666b
test(deps): bump the npm group with 4 updates (#1150)
dependabot[bot] Feb 13, 2026
218e65d
chore(deps, base): update g++-14 (#1156)
philips-software-forest-releaser[bot] Feb 17, 2026
ec93132
chore(deps, cpp): update ms-vscode.cpptools in devcontainer-metadata.…
philips-software-forest-releaser[bot] Feb 17, 2026
31ea3e8
chore(deps, rust): update rust-lang.rust-analyzer in devcontainer-met…
philips-software-forest-releaser[bot] Feb 17, 2026
138b2e5
chore(deps, cpp): update alexkrechik.cucumberautocomplete, ms-vscode.…
philips-software-forest-releaser[bot] Feb 17, 2026
e441bff
chore(deps, rust): update rust-lang.rust-analyzer in devcontainer.jso…
philips-software-forest-releaser[bot] Feb 18, 2026
1f05c32
Initial plan
Copilot Feb 6, 2026
d34bb7b
Merge branch 'main' into copilot/test-compatibility-with-podman
rjaegers Feb 20, 2026
3d287dd
Merge branch 'main' into copilot/test-compatibility-with-podman
rjaegers Feb 23, 2026
06d1031
ci: minor updates
rjaegers Feb 23, 2026
75ac14c
Merge branch 'main' into copilot/test-compatibility-with-podman
rjaegers Feb 23, 2026
1a7b277
Merge branch 'main' into copilot/test-compatibility-with-podman
rjaegers Feb 24, 2026
0942a2f
ci: process review comments
rjaegers Feb 24, 2026
a021052
Merge branch 'main' into copilot/test-compatibility-with-podman
rjaegers Feb 25, 2026
4508d51
ci: make podman tests optional
rjaegers Feb 26, 2026
2f143c5
ci: reduce duplication
rjaegers Feb 26, 2026
5ab54a1
ci: fix workflow needs
rjaegers Feb 26, 2026
6488602
ci: remove concurrency from workflow_call workflow
rjaegers Feb 26, 2026
6c0f10f
ci: pass secrets to workflow
rjaegers Feb 26, 2026
ca9025c
ci: correct syntax for passing secrets
rjaegers Feb 26, 2026
aae1dd9
Merge branch 'main' into copilot/test-compatibility-with-podman
rjaegers Feb 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions .github/workflows/build-push-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
---
name: Build, Push & Test

on:
workflow_call:
secrets:
TEST_GITHUB_PASSWORD:
required: false
TEST_GITHUB_TOKEN:
required: false
TEST_GITHUB_TOTP_SECRET:
required: false
TEST_GITHUB_USER:
required: false

permissions: {}

jobs:
build-push-test-base:
name: 🍨 base
uses: ./.github/workflows/wc-build-push-test.yml
permissions: &build-push-test-permissions
actions: read # is needed by anchore/sbom-action to find workflow artifacts when attaching release assets
artifact-metadata: write # is needed by actions/attest-build-provenance to write artifact metadata
attestations: write # is needed by actions/attest-build-provenance to push attestations
contents: write # is needed by anchore/sbom-action for artifact uploads
id-token: write # is needed by actions/attest-build-provenance to obtain an OIDC token
packages: write # is needed to push image manifest when using GitHub Container Registry
pull-requests: write # is needed by marocchino/sticky-pull-request-comment to post comments
with:
dockerfile: .devcontainer/base/Dockerfile
enable-edge-tag: ${{ github.event_name == 'merge_group' }}
image-name: ${{ github.repository }}-base
integration-test-file: test/base/integration-tests.bats
integration-test-podman: true

build-push-test-flavors:
name: 🍨 ${{ matrix.flavor }}
needs: build-push-test-base
strategy:
matrix:
flavor: [cpp, rust]
uses: ./.github/workflows/wc-build-push-test.yml
secrets:
TEST_GITHUB_TOKEN: ${{ secrets.TEST_GITHUB_TOKEN }}
TEST_GITHUB_USER: ${{ secrets.TEST_GITHUB_USER }}
TEST_GITHUB_PASSWORD: ${{ secrets.TEST_GITHUB_PASSWORD }}
TEST_GITHUB_TOTP_SECRET: ${{ secrets.TEST_GITHUB_TOTP_SECRET }}
permissions: *build-push-test-permissions
with:
acceptance-test-path: ${{ (github.actor != 'dependabot[bot]' && matrix.flavor == 'cpp') && 'test/cpp/features' || '' }}
acceptance-test-devcontainer-file: .devcontainer/${{ matrix.flavor }}-test/devcontainer.json
build-args: |
BASE_IMAGE=${{ needs.build-push-test-base.outputs.fully-qualified-image-name }}@${{ needs.build-push-test-base.outputs.digest }}
devcontainer-metadata-file: .devcontainer/${{ matrix.flavor }}/devcontainer-metadata.json
dockerfile: .devcontainer/${{ matrix.flavor }}/Dockerfile
enable-edge-tag: ${{ github.event_name == 'merge_group' }}
image-name: ${{ github.repository }}-${{ matrix.flavor }}
integration-test-file: test/${{ matrix.flavor }}/integration-tests.bats
integration-test-podman: true
41 changes: 5 additions & 36 deletions .github/workflows/continuous-integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ concurrency:
permissions: {}

jobs:
build-push-base:
name: Build → Push → Test (🍨 base)
uses: ./.github/workflows/wc-build-push-test.yml
build-push-test:
name: Build → Push → Test
uses: ./.github/workflows/build-push-test.yml
permissions:
actions: read # is needed by anchore/sbom-action to find workflow artifacts when attaching release assets
artifact-metadata: write # is needed by actions/attest-build-provenance to write artifact metadata
Expand All @@ -24,46 +24,15 @@ jobs:
id-token: write # is needed by actions/attest-build-provenance to obtain an OIDC token
packages: write # is needed to push image manifest when using GitHub Container Registry
pull-requests: write # is needed by marocchino/sticky-pull-request-comment to post comments
with:
dockerfile: .devcontainer/base/Dockerfile
enable-edge-tag: ${{ github.event_name == 'merge_group' }}
image-name: ${{ github.repository }}-base
integration-test-file: test/base/integration-tests.bats

build-push-flavors:
name: Build → Push → Test (🍨 ${{ matrix.flavor }})
needs: build-push-base
strategy:
matrix:
flavor: [cpp, rust]
uses: ./.github/workflows/wc-build-push-test.yml
secrets:
TEST_GITHUB_TOKEN: ${{ secrets.TEST_GITHUB_TOKEN }}
TEST_GITHUB_USER: ${{ secrets.TEST_GITHUB_USER }}
TEST_GITHUB_PASSWORD: ${{ secrets.TEST_GITHUB_PASSWORD }}
TEST_GITHUB_TOTP_SECRET: ${{ secrets.TEST_GITHUB_TOTP_SECRET }}
permissions:
actions: read # is needed by anchore/sbom-action to find workflow artifacts when attaching release assets
artifact-metadata: write # is needed by actions/attest-build-provenance to write artifact metadata
attestations: write # is needed by actions/attest-build-provenance to push attestations
contents: write # is needed by anchore/sbom-action for artifact uploads
id-token: write # is needed by actions/attest-build-provenance to obtain an OIDC token
packages: write # is needed to push image manifest when using GitHub Container Registry
pull-requests: write # is needed by marocchino/sticky-pull-request-comment to post comments
with:
build-args: |
BASE_IMAGE=${{ needs.build-push-base.outputs.fully-qualified-image-name }}@${{ needs.build-push-base.outputs.digest }}
devcontainer-metadata-file: .devcontainer/${{ matrix.flavor }}/devcontainer-metadata.json
dockerfile: .devcontainer/${{ matrix.flavor }}/Dockerfile
enable-edge-tag: ${{ github.event_name == 'merge_group' }}
image-name: ${{ github.repository }}-${{ matrix.flavor }}
integration-test-file: test/${{ matrix.flavor }}/integration-tests.bats
acceptance-test-path: ${{ (github.actor != 'dependabot[bot]' && matrix.flavor == 'cpp') && 'test/cpp/features' || '' }}
test-devcontainer-file: .devcontainer/${{ matrix.flavor }}-test/devcontainer.json

dependency-review:
name: 🔍 Dependency Review
needs: build-push-flavors
needs: build-push-test
uses: ./.github/workflows/wc-dependency-review.yml
permissions:
contents: read
Expand All @@ -75,7 +44,7 @@ jobs:
permissions:
checks: write # is needed by EnricoMi/publish-unit-test-result-action to add a check run with test results
pull-requests: write # is needed by EnricoMi/publish-unit-test-result-action to annotate PRs
needs: build-push-flavors
needs: build-push-test
if: ${{ !cancelled() }}
steps:
- uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
Expand Down
37 changes: 4 additions & 33 deletions .github/workflows/release-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ concurrency:
permissions: {}

jobs:
build-push-base:
name: Build → Push → Test (🍨 base)
uses: ./.github/workflows/wc-build-push-test.yml
build-push-test:
name: Build → Push → Test
uses: ./.github/workflows/build-push-test.yml
permissions:
actions: read # is needed by anchore/sbom-action to find workflow artifacts when attaching release assets
artifact-metadata: write # is needed by actions/attest-build-provenance to write artifact metadata
Expand All @@ -24,40 +24,11 @@ jobs:
id-token: write # is needed by actions/attest-build-provenance to obtain an OIDC token
packages: write # is needed to push image manifest when using GitHub Container Registry
pull-requests: write # is needed by marocchino/sticky-pull-request-comment to post comments
with:
dockerfile: .devcontainer/base/Dockerfile
image-name: ${{ github.repository }}-base
integration-test-file: test/base/integration-tests.bats

build-push-flavors:
name: Build → Push → Test (🍨 ${{ matrix.flavor }})
needs: build-push-base
strategy:
matrix:
flavor: [cpp, rust]
uses: ./.github/workflows/wc-build-push-test.yml
secrets:
TEST_GITHUB_TOKEN: ${{ secrets.TEST_GITHUB_TOKEN }}
TEST_GITHUB_USER: ${{ secrets.TEST_GITHUB_USER }}
TEST_GITHUB_PASSWORD: ${{ secrets.TEST_GITHUB_PASSWORD }}
TEST_GITHUB_TOTP_SECRET: ${{ secrets.TEST_GITHUB_TOTP_SECRET }}
permissions:
actions: read # is needed by anchore/sbom-action to find workflow artifacts when attaching release assets
artifact-metadata: write # is needed by actions/attest-build-provenance to write artifact metadata
attestations: write # is needed by actions/attest-build-provenance to push attestations
contents: write # is needed by anchore/sbom-action for artifact uploads
id-token: write # is needed by actions/attest-build-provenance to obtain an OIDC token
packages: write # is needed to push image manifest when using GitHub Container Registry
pull-requests: write # is needed by marocchino/sticky-pull-request-comment to post comments
with:
build-args: |
BASE_IMAGE=${{ needs.build-push-base.outputs.fully-qualified-image-name }}@${{ needs.build-push-base.outputs.digest }}
devcontainer-metadata-file: .devcontainer/${{ matrix.flavor }}/devcontainer-metadata.json
dockerfile: .devcontainer/${{ matrix.flavor }}/Dockerfile
image-name: ${{ github.repository }}-${{ matrix.flavor }}
integration-test-file: test/${{ matrix.flavor }}/integration-tests.bats
acceptance-test-path: ${{ matrix.flavor == 'cpp' && 'test/cpp/features' || '' }}
test-devcontainer-file: ${{ matrix.flavor == 'cpp' && '.devcontainer/cpp-test/devcontainer.json' || '' }}

apply-release-notes-template:
name: 📝 Apply Release Template
Expand Down Expand Up @@ -96,7 +67,7 @@ jobs:
# Please note that this is an overly broad scope, but GitHub does not
# currently provide a more fine-grained permission for release modification.
contents: write # is needed to modify a release
needs: [build-push-base, build-push-flavors, apply-release-notes-template]
needs: [build-push-test, apply-release-notes-template]
env:
CONTAINER_FLAVOR: ${{ matrix.flavor }}
REF_NAME: ${{ github.ref_name }}
Expand Down
51 changes: 32 additions & 19 deletions .github/workflows/wc-build-push-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,16 @@ name: Build, Push & Test
on:
workflow_call:
inputs:
acceptance-test-devcontainer-file:
description: Path to the devcontainer.json file to use for acceptance tests.
required: false
type: string
acceptance-test-path:
description: Path to the Playwright acceptance tests (directory that contains playwright.config.ts)
description: Path to the Playwright acceptance tests (directory that contains playwright.config.ts).
required: false
type: string
build-args:
description: Optional docker build args (newline-separated KEY=VALUE)
description: Optional docker build args (newline-separated KEY=VALUE).
required: false
type: string
build-test-runner-labels:
Expand Down Expand Up @@ -38,7 +42,7 @@ on:
required: true
type: string
enable-edge-tag:
description: Whether to also build and push an "edge" tag for the image
description: Whether to also build and push an "edge" tag for the image.
required: false
type: boolean
default: false
Expand All @@ -52,9 +56,14 @@ on:
required: true
type: string
integration-test-file:
description: Path to the BATS test file to run for integration tests
description: Path to the BATS test file to run for integration tests.
required: false
type: string
integration-test-podman:
description: Enable running the tests using the Podman container runtime, next to the default Docker container runtime.
required: false
type: boolean
default: false
registry:
description: >-
Docker registry to push built containers to.
Expand All @@ -73,10 +82,6 @@ on:
required: false
type: string
default: '["ubuntu-latest"]'
test-devcontainer-file:
description: Path to the devcontainer.json file to use for acceptance tests
required: false
type: string
outputs:
digest:
value: ${{ jobs.build-push.outputs.digest }}
Expand All @@ -88,10 +93,10 @@ on:
value: ${{ jobs.build-push.outputs.version }}
secrets:
DOCKER_REGISTRY_PASSWORD:
description: Password or token for Docker login, if not provided the GitHub token will be used
description: Password or token for Docker login, if not provided the GitHub token will be used.
required: false
DOCKER_REGISTRY_USERNAME:
description: User name for Docker login, if not provided the GitHub actor will be used
description: User name for Docker login, if not provided the GitHub actor will be used.
required: false
TEST_GITHUB_PASSWORD:
required: false
Expand All @@ -116,7 +121,7 @@ jobs:
id-token: write # is needed by actions/attest-build-provenance to obtain an OIDC token
packages: write # is needed to push image manifest when using GitHub Container Registry
pull-requests: write # is needed by marocchino/sticky-pull-request-comment to post comments
secrets:
secrets: &docker-secrets
DOCKER_REGISTRY_USERNAME: ${{ secrets.DOCKER_REGISTRY_USERNAME }}
DOCKER_REGISTRY_PASSWORD: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
with:
Expand All @@ -129,27 +134,35 @@ jobs:
runner-labels: ${{ inputs.runner-labels }}
build-test-runner-labels: ${{ inputs.build-test-runner-labels }}

integration-test:
integration-test-docker:
name: 🧪
if: ${{ inputs.integration-test-file }}
needs: build-push
uses: ./.github/workflows/wc-integration-test.yml
uses: ./.github/workflows/wc-integration-test-docker.yml
permissions:
contents: read
secrets:
DOCKER_REGISTRY_USERNAME: ${{ secrets.DOCKER_REGISTRY_USERNAME }}
DOCKER_REGISTRY_PASSWORD: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
with:
secrets: *docker-secrets
with: &integration-test-inputs
build-test-runner-labels: ${{ inputs.build-test-runner-labels }}
fully-qualified-image-name: ${{ needs.build-push.outputs.fully-qualified-image-name }}
image-basename: ${{ needs.build-push.outputs.image-basename }}
image-digest: ${{ needs.build-push.outputs.digest }}
registry: ${{ inputs.registry }}
test-file: ${{ inputs.integration-test-file }}

integration-test-podman:
name: 🧪
if: ${{ inputs.integration-test-file && inputs.integration-test-podman }}
needs: build-push
uses: ./.github/workflows/wc-integration-test-podman.yml
permissions:
contents: read
secrets: *docker-secrets
with: *integration-test-inputs

acceptance-test:
name: 🏗️
if: ${{ inputs.test-devcontainer-file && inputs.acceptance-test-path }}
if: ${{ inputs.acceptance-test-devcontainer-file && inputs.acceptance-test-path }}
needs: build-push
uses: ./.github/workflows/wc-acceptance-test.yml
permissions:
Expand All @@ -161,5 +174,5 @@ jobs:
TEST_GITHUB_TOTP_SECRET: ${{ secrets.TEST_GITHUB_TOTP_SECRET }}
with:
image-basename: ${{ needs.build-push.outputs.image-basename }}
devcontainer-file: ${{ inputs.test-devcontainer-file }}
devcontainer-file: ${{ inputs.acceptance-test-devcontainer-file }}
acceptance-test-path: ${{ inputs.acceptance-test-path }}
Original file line number Diff line number Diff line change
@@ -1,66 +1,66 @@
---
name: Integration Test
name: 🐳 Integration Test

on:
workflow_call:
inputs:
build-test-runner-labels:
required: true
type: string
fully-qualified-image-name:
required: true
type: string
image-basename:
required: true
type: string
image-digest:
required: true
type: string
test-file:
required: true
type: string
build-test-runner-labels:
registry:
required: true
type: string
registry:
test-file:
required: true
type: string
secrets:
DOCKER_REGISTRY_USERNAME:
required: true
DOCKER_REGISTRY_PASSWORD:
required: true
DOCKER_REGISTRY_USERNAME:
required: true

permissions: {}

jobs:
run-test:
name: Integration Test (${{ (startsWith(matrix.runner, '[') && endsWith(matrix.runner, ']')) && join(matrix.runner, ', ') || matrix.runner }})
name: 🐳 Integration Test (${{ (startsWith(matrix.runner, '[') && endsWith(matrix.runner, ']')) && join(matrix.runner, ', ') || matrix.runner }})
strategy:
matrix:
runner: ${{ fromJson(inputs.build-test-runner-labels) }}
runs-on: ${{ matrix.runner }}
container:
image: ${{ inputs.fully-qualified-image-name }}@${{ inputs.image-digest }}
credentials:
username: ${{ secrets.DOCKER_REGISTRY_USERNAME || github.actor }}
password: ${{ secrets.DOCKER_REGISTRY_PASSWORD || github.token }}
permissions:
contents: read
steps:
- uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
with:
disable-sudo: true
egress-policy: audit
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- run: echo "arch=$(echo "${RUNNER_ARCH}" | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_OUTPUT"
id: runner-arch
- run: bats --formatter junit "${TEST_FILE}" | tee "test-report-${IMAGE_BASENAME}-${RUNNER_ARCH}.xml"
env:
IMAGE_BASENAME: ${{ inputs.image-basename }}
TEST_FILE: ${{ inputs.test-file }}
RUNNER_ARCH: ${{ steps.runner-arch.outputs.arch }}
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
if: ${{ !cancelled() }}
with:
name: test-results-integration-${{ inputs.image-basename }}-${{ steps.runner-arch.outputs.arch }}
name: test-results-integration-docker-${{ inputs.image-basename }}-${{ steps.runner-arch.outputs.arch }}
path: test-report-*.xml
Loading
Loading