Feat: devcontainer pytest integration#110
Conversation
@microsoft-github-policy-service agree [company="microsoft"] |
44faaca to
ec09cba
Compare
|
@microsoft-github-policy-service agree |
2523a23 to
0ebed45
Compare
d73bb8e to
82fb7b9
Compare
fe5a82e to
78f787f
Compare
a279838 to
5f6316e
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 15 out of 16 changed files in this pull request and generated 2 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
0e665e8 to
5f6316e
Compare
| @@ -13,44 +13,109 @@ permissions: | |||
| contents: read | |||
There was a problem hiding this comment.
I wonder if it's really worth splitting into several jobs instead of having having them as multiple steps based on job complextity we have. One thing I noticed is this does repo clone 4 times as it used to be just one for example and that's one of downsides of going with this structure
There was a problem hiding this comment.
Agreed — consolidated everything back into a single build job to avoid multiple repo clones. Lint runs first as steps, followed by sequential devcontainer tests (cpu, gpu, notebooks), then publish results. Keeps the structure simple while using the new devcontainer-based testing approach.
There was a problem hiding this comment.
Thanks. This simple structure looks better. Should we follow the same approach on AzDO side and remove templates and revert back to the original approach while updating test step only to keep the update simple?
There was a problem hiding this comment.
Good idea — done in a7187fc. Removed all 5 templates under .azuredevops/templates/ and inlined the devcontainer test steps directly into both ado-ci-pipeline-ms-hosted.yml and ado-ci-pipeline-self-hosted.yml, mirroring the flat structure of ci.yaml. The pipelines now only differ from main by replacing the ci-tests.sh step with the equivalent devcontainer up / devcontainer exec steps per project, plus the .env setup and @devcontainers/cli install. Net change: +213 / −303 vs the previous template-based version.
A couple of notes:
- I switched the coverage publish task to
PublishCodeCoverageResults@2so it can pick upcoverage-*.xmlvia glob and merge the per-project files automatically — this avoids needing the oldmerge-coverage.yml(nodotnetinstall /reportgeneratorstep). - I dropped the macOS / Apple Silicon support that was added on the self-hosted side, since restoring it would have required keeping the platform-conditional Docker handling that lived in
run-devcontainer.yml. The self-hosted pipeline is now Linux-only again, matchingmain. Happy to add macOS support back in a follow-up if you'd like.
fujikosu
left a comment
There was a problem hiding this comment.
Thanks for your PR! I left several comments so please check them
ce25229 to
f0d0c2c
Compare
|
@fujikosu Thank you for the thorough review! I've addressed all the comments — really appreciate you taking the time to go through everything in detail. The feedback helped improve the PR significantly. |
| name: pytest | ||
| path: | | ||
| **/test-results-*.xml | ||
| path: 'test-results-*.xml' |
There was a problem hiding this comment.
In the original ci-tests.sh flow, each project's test results landed in nested folders (e.g. src/sample_cpu_project/test-results-*.xml), so the reporter needed **/test-results-*.xml to find them. With the new devcontainers/ci approach we explicitly copy the JUnit XMLs back to the workspace root (test-results-cpu.xml, test-results-gpu.xml), so a flat glob is sufficient — and it also fixes the pre-existing typo (test-reuslts → test-results) from the original path.
| output: both | ||
| format: markdown | ||
| filename: coverage.xml | ||
| filename: 'coverage-*.xml' |
There was a problem hiding this comment.
what's this filename update for?
There was a problem hiding this comment.
Previously ci-tests.sh produced a single merged coverage.xml. With the per-devcontainer test steps we now emit one coverage file per project (coverage-cpu.xml, coverage-gpu.xml), so the glob coverage-*.xml lets CodeCoverageSummary aggregate them into one report. (irongut/CodeCoverageSummary supports glob patterns in filename.)
| test-results-*.xml | ||
| coverage-*.xml |
There was a problem hiding this comment.
what are these path update for?
There was a problem hiding this comment.
Same reason as the test-reporter path change: result/coverage files are now written to the workspace root (test-results-*.xml, coverage-*.xml) instead of nested project folders, so the **/ glob is no longer needed. This also fixes the pre-existing typo test-reuslts-*.xml → test-results-*.xml so the artifact actually picks them up.
fujikosu
left a comment
There was a problem hiding this comment.
thanks for the update! I added comments to your update
Per fujikosu's review feedback on PR #110, simplify the AzDO pipelines to mirror the flat structure of the GitHub Actions workflow. The templates added in this PR (setup-devcontainer, run-devcontainer, test-devcontainer-job, publish-test-results, merge-coverage) are removed and the devcontainer-based test steps are inlined directly into ado-ci-pipeline-ms-hosted.yml and ado-ci-pipeline-self-hosted.yml, keeping the diff vs main minimal — only the 'Run pytest in docker containers' step is replaced with the new devcontainer steps. PublishCodeCoverageResults@2 is used so that the multiple per-project coverage XML files (coverage-*.xml) are picked up via glob and merged without requiring a separate ReportGenerator stage. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace ci-tests.sh with devcontainer-based CI that builds and runs pytest inside each project's actual devcontainer, ensuring CI uses the exact same environment as developers. GitHub Actions: - Use devcontainers/ci@v0.3 to build and exec inside each devcontainer - Per-project pytest runs (cpu, gpu) with junit + coverage XML - Smoke build for notebooks devcontainer Azure DevOps (ms-hosted and self-hosted): - Inline @devcontainers/cli usage (no template files) - Same per-project pytest pattern; PublishTestResults + PublishCodeCoverageResults - Self-hosted variant adds Docker prune + _work cleanup CI workarounds for non-modifiable devcontainer.json: - Pre-create .env at relative paths (./, ../, ../../) expected by devcontainer.json runArgs --env-file paths - Strip --gpus all from GPU devcontainer.json at workflow runtime since GitHub-hosted runners lack GPU device drivers (local users keep auto GPU passthrough) Other: - Add hostRequirements gpu=optional hint to GPU devcontainer.json - pyproject.toml: coverage source/relative_files and exclude_lines - Remove obsolete ci-tests.sh Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
14b97e8 to
a50da65
Compare
This pull request introduces a major refactor and modernization of the CI pipeline infrastructure for both Azure DevOps and GitHub Actions. The main improvements are the switch to modular, template-driven pipeline definitions, enhanced support for devcontainer-based testing, and improved code coverage reporting. The changes streamline CI setup, make it easier to add new projects, and improve compatibility across platforms (Linux and macOS). Documentation and configuration files have also been updated for clarity and consistency.
Azure DevOps Pipeline Modernization
.azuredevops/ado-ci-pipeline-ms-hosted.ymland.azuredevops/ado-ci-pipeline-self-hosted.ymlare refactored to use a two-stage pipeline (Lint and Test), with jobs and steps defined via new templates for devcontainer testing and coverage publishing. This replaces legacy scripts and direct task definitions, making the pipeline more maintainable and extensible. [1] [2] [3]Template-Driven CI Architecture
.azuredevops/templates/, includingtest-devcontainer-job.ymlfor per-project devcontainer testing,run-devcontainer.ymlfor platform-aware container execution,setup-devcontainer.ymlfor environment setup,publish-test-results.ymlfor publishing test results and coverage, andmerge-coverage.ymlfor merging and publishing code coverage reports. [1] [2] [3] [4] [5]GitHub Actions Pipeline Improvements
.github/workflows/ci.yamlis reworked to use matrix jobs for devcontainer-based testing, artifact upload for results and coverage, and a dedicated lint job. A new job aggregates and publishes combined test results and coverage reports, improving visibility and maintainability. [1] [2]Documentation and Configuration Updates
ci-tests.sh) are removed fromREADME.mdand.env.exampleis updated for clarity, reflecting the new devcontainer and pipeline workflow. [1] [2] [3]Platform Compatibility and Usability Enhancements
Does this introduce a breaking change?
Author pre-publish checklist
Pull Request Type
What kind of change does this Pull Request introduce?