{"id":13719521,"url":"https://github.com/ros-tooling/action-ros-ci","last_synced_at":"2026-04-11T19:14:41.792Z","repository":{"id":35238209,"uuid":"215920213","full_name":"ros-tooling/action-ros-ci","owner":"ros-tooling","description":"Github Action to build and test ROS 2 packages using colcon","archived":false,"fork":false,"pushed_at":"2026-03-25T23:10:05.000Z","size":25878,"stargazers_count":166,"open_issues_count":54,"forks_count":61,"subscribers_count":12,"default_branch":"main","last_synced_at":"2026-03-31T11:42:15.401Z","etag":null,"topics":["ci","colcon","ros2","testing"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ros-tooling.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-10-18T01:54:46.000Z","updated_at":"2026-03-05T14:58:00.000Z","dependencies_parsed_at":"2023-01-15T16:52:15.808Z","dependency_job_id":"c9810d84-6280-468c-9d0c-b74d8b9df938","html_url":"https://github.com/ros-tooling/action-ros-ci","commit_stats":{"total_commits":555,"total_committers":31,"mean_commits":"17.903225806451612","dds":0.5513513513513513,"last_synced_commit":"5816ec0d18cf064a7c6bcc0ff6d84bb5a9fddc69"},"previous_names":[],"tags_count":57,"template":false,"template_full_name":null,"purl":"pkg:github/ros-tooling/action-ros-ci","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ros-tooling%2Faction-ros-ci","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ros-tooling%2Faction-ros-ci/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ros-tooling%2Faction-ros-ci/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ros-tooling%2Faction-ros-ci/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ros-tooling","download_url":"https://codeload.github.com/ros-tooling/action-ros-ci/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ros-tooling%2Faction-ros-ci/sbom","scorecard":{"id":784898,"data":{"date":"2025-08-11","repo":{"name":"github.com/ros-tooling/action-ros-ci","commit":"c8bee402c95e6b4a47c9bb5ce69de4c692128d3a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.3,"checks":[{"name":"Maintained","score":10,"reason":"9 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":5,"reason":"Found 16/27 approved changesets -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/autoapprove.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/autoapprove.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/automerge.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/automerge.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/mirror.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/mirror.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/pr.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/pr.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:49: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:77: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:78: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:82: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:103: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:257: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:258: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:262: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:472: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:473: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:477: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:117: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:151: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:192: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:193: update your workflow using https://app.stepsecurity.io/secureworkflow/ros-tooling/action-ros-ci/test.yml/main?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/build-and-test.sh:4","Warn: npmCommand not pinned by hash: .github/workflows/pr.yml:19","Info:   0 out of  15 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   6 third-party GitHubAction dependencies pinned","Info:   1 out of   3 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/autoapprove.yml:1","Warn: no topLevel permission defined: .github/workflows/automerge.yml:1","Warn: no topLevel permission defined: .github/workflows/mirror.yml:1","Warn: no topLevel permission defined: .github/workflows/pr.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 21 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"10 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-x4c5-c7rf-jjgv","Warn: Project is vulnerable to: GHSA-h5c3-5r3r-rr8q","Warn: Project is vulnerable to: GHSA-rmvr-2pp2-xj38","Warn: Project is vulnerable to: GHSA-xx4v-prfh-6cgc","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-c76h-2ccp-4975","Warn: Project is vulnerable to: GHSA-cxrh-j4jr-qwg3"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T05:49:28.023Z","repository_id":35238209,"created_at":"2025-08-23T05:49:28.023Z","updated_at":"2025-08-23T05:49:28.023Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31543229,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"online","status_checked_at":"2026-04-08T02:00:06.127Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ci","colcon","ros2","testing"],"created_at":"2024-08-03T01:00:50.673Z","updated_at":"2026-04-11T19:14:41.768Z","avatar_url":"https://github.com/ros-tooling.png","language":"TypeScript","funding_links":[],"categories":["Development Environment"],"sub_categories":["Unit and Integration Test"],"readme":"# `action-ros-ci`\n\n[![GitHub Action Status](https://github.com/ros-tooling/action-ros-ci/workflows/Test%20action-ros-ci/badge.svg)](https://github.com/ros-tooling/action-ros-ci)\n[![Dependabot Status](https://api.dependabot.com/badges/status?host=github\u0026repo=ros-tooling/action-ros-ci)](https://dependabot.com)\n[![codecov](https://codecov.io/gh/ros-tooling/action-ros-ci/branch/master/graph/badge.svg)](https://codecov.io/gh/ros-tooling/action-ros-ci)\n\nThis action builds and tests a [ROS](http://wiki.ros.org/) or [ROS 2](https://docs.ros.org/en/rolling/) workspace from source.\n\n1. [Requirements](#Requirements)\n1. [Overview](#Overview)\n1. [Action Output](#Action-Output)\n1. [Usage](#Usage)\n   1. [Base Usage Patterns](#Base-Usage-Patterns)\n   1. [Building ROS 2 core dependencies from source](#building-ros-2-core-dependencies-from-source)\n   1. [Build with a custom `repos` or `rosinstall` file](#Build-with-a-custom-repos-or-rosinstall-file)\n   1. [Build a ROS 1 workspace](#Build-a-ROS-1-workspace)\n   1. [Skip tests](#Skip-tests)\n   1. [Use a `colcon` `defaults.yaml` file](#Use-a-colcon-defaultsyaml-file)\n   1. [Do not use `--symlink-install` when building](#Do-not-use---symlink-install-when-building)\n   1. [Enable Address Sanitizer to automatically report memory issues](#Enable-Address-Sanitizer-to-automatically-report-memory-issues)\n   1. [Generate and process code coverage data](#Generate-and-process-code-coverage-data)\n   1. [Store `colcon` logs as build artifacts](#Store-colcon-logs-as-build-artifacts)\n   1. [Use with private repos](#Use-with-private-repos)\n   1. [Skip `rosdep install` and run `rosdep check`](#Skip-rosdep-install-and-run-rosdep-check)\n   1. [Interdependent pull requests or merge requests](#Interdependent-pull-requests-or-merge-requests)\n1. [Developing](#Developing)\n1. [License](#License)\n\n## Requirements\n\nThis action requires ROS development tools to be installed (and initialized if applicable) on the CI worker instance.\n\nFor Ubuntu Linux builds, it is recommended to run your CI on an appropriate base container image from [`ros-tooling/setup-ros-docker`](https://github.com/ros-tooling/setup-ros-docker).\n\nIf you want to use a different base environment, you can prepare that environment for building a ROS workspace with [`ros-tooling/setup-ros`](https://github.com/ros-tooling/setup-ros).\n\nFor reference, these are the minimum tools needed by the action, which are provided automatically by the options mentioned above:\n\n- Base development tools, `cmake` and compilers for the platform\n- `vcstool`\n- `rosdep`\n- `colcon-common-extensions`\n- `colcon-lcov-result` (Optional)\n- `colcon-coveragepy-result` (Optional)\n- `colcon-mixin` (Optional)\n\n**Note**: for Windows, ROS 2 currently only officially supports Visual Studio 2019, but GitHub has dropped support for the `windows-2019` runner image, so we can only use `windows-2022` (Visual Studio 2022) or newer.\n\n## Overview\n\nThe action first assembles a workspace with the dependencies needed to build the source, then runs `colcon build` and `colcon test`.\n\nStep by step, that process goes like this:\n\n- `vcs import` the repo file(s) specified through the `vcs-repo-file-url` argument, if any (defaults to none)\n- checkout the code under test in the workspace using `vcs`\n- `rosdep install` for the workspace, to get its dependencies\n- run `colcon build` (optionally limited to packages specified in `package-name`)\n- run `colcon test` (optionally limited to packages specified in `package-name`; optionally [skipped](#Skip-tests))\n\nThis action requires targeting a ROS or ROS 2 distribution explicitly.\nThis is provided via the `target-ros1-distro` or `target-ros2-distro` inputs.\nEither or both may be specified, if neither is provided an error will be raised.\nThis input is used to `source setup.sh` for any installed ROS binaries (e.g. installed using [`ros-tooling/setup-ros`](https://github.com/ros-tooling/setup-ros)), as well as used as an argument to `rosdep install`.\n\n## Action Output\n\nThis action defines [an output variable](https://help.github.com/en/actions/building-actions/metadata-syntax-for-github-actions#outputs): `ros-workspace-directory-name`.\nIt contains the path to the root of the ROS workspace assembled by the action.\n\nThe variable value can be used to retrieve logs, binaries, etc. after the action completes.\n\n## Usage\n\nSee [`action.yml`](action.yml) to get the list of inputs supported by this action.\n\n[action-ros-ci-template](https://github.com/ros-tooling/action-ros-ci-template) offers a template for using `action-ros-ci`.\n\n### Base Usage Patterns\n\nIn most cases, you will use one of the following two base patterns to set up your build environment and run your build.\n\nThe sections following cover more specific options.\n\n#### Using a prepared base container image from `setup-ros-docker` (Recommended)\n\n```yaml\njobs:\n  build_and_test_ros2:\n    runs-on: ubuntu-latest\n    container:\n      image: rostooling/setup-ros-docker:ubuntu-noble-latest\n    steps:\n      - name: Build and run tests\n        uses: ros-tooling/action-ros-ci@v0.4\n        with:\n          package-name: my_package\n          target-ros2-distro: jazzy\n```\n\n\n#### Using `ros-tooling/setup-ros` to prepare the environment\n\nIn this case, `action-ros-ci` will rely on `setup-ros` for installing ROS 2 development tools, instead of a base container.\n\n```yaml\njobs:\n  build_and_test_ros2:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: ros-tooling/setup-ros@v0.7\n        with:\n          required-ros-distributions: jazzy\n      - uses: ros-tooling/action-ros-ci@v0.4\n        with:\n          package-name: my_package\n          target-ros2-distro: jazzy\n```\n\n### Building ROS 2 core dependencies from source\n\nIn this case, `action-ros-ci` will build all necessary ROS 2 dependencies of `my_package` from source.\n\n```yaml\n  - name: Build and run tests\n    uses: ros-tooling/action-ros-ci@v0.4\n    with:\n      package-name: my_package\n      target-ros2-distro: jazzy\n      vcs-repo-file-url: https://raw.githubusercontent.com/ros2/ros2/jazzy/ros2.repos\n```\n\n### Scheduling periodic builds\n\nYou may want to run a build periodically - for example to reveal flaky tests or reveal problems from updates in upstream dependencies.\n\nNote in this example that we've specified `ref:` in the action, to build a non-default branch.\nWithout this setting, the repository default branch and most recent commit will be checked out.\n\n```yaml\nname: Jazzy Source Build\non:\n  schedule:\n    # At 00:00 on Sunday.\n    - cron '0 0 * * 0'\n\njobs:\n  jazzy_from_source:\n    runs-on: ubuntu-latest\n    container:\n      image: rostooling/setup-ros-docker:ubuntu-noble-latest\n    steps:\n      - uses: ros-tooling/action-ros-ci@v0.4\n        with:\n          package-name: my_package\n          ref: jazzy\n          target-ros2-distro: jazzy\n          vcs-repo-file-url: https://raw.githubusercontent.com/ros2/ros2/jazzy/ros2.repos\n```\n\n### Build with a custom `repos` or `rosinstall` file\n\nYou can specify your own repos file using the `vcs-repo-file-url` input.\nYou can also automatically generate your package's dependencies using the following workflow:\n\n```yaml\n  - uses: actions/checkout@v4\n  - run: |\n      rosinstall_generator \u003cpackage-name\u003e --rosdistro \u003ctarget-distro\u003e \\\n      --deps-only --deps --upstream-development \u003e /tmp/deps.repos\n  # Pass the file to the action\n  - uses: ros-tooling/action-ros-ci@v0.4\n    with:\n      package-name: my_package\n      target-ros2-distro: jazzy\n      vcs-repo-file-url: /tmp/deps.repos\n```\n\nNote that the `actions/checkout` step is required when using a custom repos file from your repository.\n\n### Build a ROS 1 workspace\n\nBuilding a ROS 1 workspace works the same way.\nSimply use `target-ros1-distro` instead of `target-ros2-distro`.\n\n```yaml\njobs:\n  build_and_test_ros1:\n    runs-on: ubuntu-latest\n    container:\n      image: rostooling/setup-ros-docker:ubuntu-focal-latest\n    steps:\n      - uses: ros-tooling/action-ros-ci@v0.4\n        with:\n          package-name: my_package\n          target-ros1-distro: noetic\n```\n\n### Skip tests\n\nTo skip tests and code coverage data processing, set the `skip-tests` option to `true`.\n\n```yaml\n  - uses: ros-tooling/action-ros-ci@v0.4\n    with:\n      package-name: my_package\n      target-ros2-distro: jazzy\n      skip-tests: true\n```\n\n### Use a `colcon` `defaults.yaml` file\n\nTo use a [`colcon` `defaults.yaml` file](https://colcon.readthedocs.io/en/released/user/configuration.html#defaults-yaml), provide a valid JSON string through the `colcon-defaults` input.\nThis allows using a `colcon` option/argument that is not exposed by this action's inputs.\n\n```yaml\n  - uses: ros-tooling/action-ros-ci@v0.4\n    with:\n      package-name: my_package\n      target-ros2-distro: jazzy\n      colcon-defaults: |\n        {\n          \"build\": {\n            \"cmake-args\": [\n                \"-DMY_CUSTOM_OPTION=ON\"\n            ]\n          }\n        }\n```\n\n### Do not use `--symlink-install` when building\n\nBy default, [`--symlink-install` is used with `colcon build`](https://colcon.readthedocs.io/en/released/reference/verb/build.html).\nTo avoid this, set the `no-symlink-install` input to `true`.\n\n```yaml\n  - uses: ros-tooling/action-ros-ci@v0.4\n    with:\n      package-name: my_package\n      target-ros2-distro: jazzy\n      no-symlink-install: true\n```\n\n### Enable Address Sanitizer to automatically report memory issues\n\n[ASan][addresssanitizer] is an open-source tool developed to automatically report\nmemory corruption bugs.\n\n```yaml\n  - uses: ros-tooling/action-ros-ci@v0.4\n    with:\n      colcon-defaults: |\n        {\n          \"build\": {\n            \"mixin\": [\"asan-gcc\"]\n          }\n        }\n      colcon-mixin-repository: https://raw.githubusercontent.com/colcon/colcon-mixin-repository/b8436aa16c0bdbc01081b12caa253cbf16e0fb82/index.yaml\n      package-name: my_package\n      target-ros2-distro: jazzy\n```\n\nTo look for detected memory errors, check the build logs for entries containing `ERROR: AddressSanitizer`. Example:\n\n```\n==9442== ERROR: AddressSanitizer heap-use-after-free on address 0x7f7ddab8c084 at pc 0x403c8c bp 0x7fff87fb82d0 sp 0x7fff87fb82c8\n```\n\nASan is analyzing memory issues at runtime. ASan diagnostic messages will be emitted by the package tests when they run.\n\n### Generate and process code coverage data\n\n#### Generate code coverage information using `lcov` and `colcon-lcov-result`\n\nGenerate code coverage information for C/C++ files using the appropriate mixins for `gcc`.\n`action-ros-ci` uses [`colcon-lcov-result`](https://github.com/colcon/colcon-lcov-result) to aggregate generated coverage information.\n\nFlags can be passed manually using, for instance, `extra-cmake-args`, but it is\npreferable to use a `colcon` mixin (through [`colcon-defaults`](#Use-a-colcon-defaultsyaml-file)) to pass the appropriate flags automatically.\n\n```yaml\n  - uses: ros-tooling/action-ros-ci@v0.4\n    with:\n      package-name: my_package\n      target-ros2-distro: jazzy\n      colcon-defaults: |\n        {\n          \"build\": {\n            \"mixin\": [\"coverage-gcc\"]\n          }\n        }\n      # If possible, pin the repository in the workflow to a specific commit to avoid\n      # changes in colcon-mixin-repository from breaking your tests.\n      colcon-mixin-repository: https://raw.githubusercontent.com/colcon/colcon-mixin-repository/b8436aa16c0bdbc01081b12caa253cbf16e0fb82/index.yaml\n```\n\n#### Generate code coverage information using `coveragepy` and `colcon-coveragepy-result`\n\nGenerate code coverage information for Python files using the appropriate mixins.\n`action-ros-ci` uses [`colcon-coveragepy-result`](https://github.com/colcon/colcon-coveragepy-result) to aggregate generated coverage information.\n\n```yaml\n  - uses: ros-tooling/action-ros-ci@v0.4\n    with:\n      package-name: my_package\n      target-ros2-distro: jazzy\n      colcon-defaults: |\n        {\n          \"build\": {\n            \"mixin\": [\"coverage-pytest\"]\n          },\n          \"test\": {\n            \"mixin\": [\"coverage-pytest\"]\n          }\n        }\n      # If possible, pin the repository in the workflow to a specific commit to avoid\n      # changes in colcon-mixin-repository from breaking your tests.\n      colcon-mixin-repository: https://raw.githubusercontent.com/colcon/colcon-mixin-repository/b8436aa16c0bdbc01081b12caa253cbf16e0fb82/index.yaml\n```\n\n#### Integrate `action-ros-ci` with `codecov`\n\nThe generated code coverage information can be uploaded to [codecov.io](https://codecov.io/).\n\nFor a private repo, you will need to setup a secret `CODECOV_TOKEN` in [your repository settings][creating-encrypted-secrets].\nSee [`codecov/codecov-action`](https://github.com/codecov/codecov-action) documentation for more information about how to setup the action.\n\n```yaml\n  - uses: actions/checkout@v4\n  - uses: ros-tooling/action-ros-ci@v0.4\n    with:\n      package-name: my_package\n      target-ros2-distro: jazzy\n      colcon-defaults: |\n        {\n          \"build\": {\n            \"mixin\": [\"coverage-gcc\", \"coverage-pytest\"]\n          },\n          \"test\": {\n            \"mixin\": [\"coverage-pytest\"]\n          }\n        }\n      # If possible, pin the repository in the workflow to a specific commit to avoid\n      # changes in colcon-mixin-repository from breaking your tests.\n      colcon-mixin-repository: https://raw.githubusercontent.com/colcon/colcon-mixin-repository/b8436aa16c0bdbc01081b12caa253cbf16e0fb82/index.yaml\n  - uses: codecov/codecov-action@v1.2.1\n    with:\n      token: ${{ secrets.CODECOV_TOKEN }}  # only needed for private repos\n      files: ros_ws/lcov/total_coverage.info,ros_ws/coveragepy/.coverage\n      flags: unittests\n      name: codecov-umbrella\n```\n\nYou will also need to add a [`codecov.yml` configuration file](https://docs.codecov.io/docs/codecovyml-reference) (at the root of your repo):\n\n```yaml\nfixes:\n  # For each package in your repo\n  - \"ros_ws/src/*/my_repo/my_package/::\"\n```\n\nThe configuration file is required to let codecov map the workspace directory structure to the Git repository structure, and setup the links between codecov and GitHub properly.\nNote here that `actions/checkout` is required because `codecov/codecov-action` needs the `codecov.yml` file.\n\n#### Disable code coverage results collection\n\nBy default, when tests are run, code coverage data is collected using [`colcon-lcov-result`](#generate-code-coverage-information-using-lcov-and-colcon-lcov-result) and [`colcon-coveragepy-result`](#generate-code-coverage-information-using-coveragepy-and-colcon-coveragepy-result).\nTo disable it, set `coverage-result` to `false`.\n\n```yaml\n  - uses: ros-tooling/action-ros-ci@v0.4\n    with:\n      # ...\n      coverage-result: false\n```\n\n### Store `colcon` logs as build artifacts\n\nGitHub workflows can persist data generated in workers during the build using [artifacts](persisting-workflow-data-using-artifacts). `action-ros-ci` generated colcon logs can be saved as follows:\n\n```yaml\n  - uses: ros-tooling/action-ros-ci@v0.4\n    id: action_ros_ci_step\n    with:\n      package-name: ament_copyright\n      target-ros2-distro: jazzy\n  - uses: actions/upload-artifact@v1\n    with:\n      name: colcon-logs\n      path: ${{ steps.action_ros_ci_step.outputs.ros-workspace-directory-name }}/log\n    if: always() # upload the logs even when the build fails\n```\n\n### Use with private repos\n\n`action-ros-ci` needs a token to be able to clone private repositories.\nIf the only private repository your workflow needs is the one against which it runs, using the default `GITHUB_TOKEN` will work.\nHowever, if your workflow also clones other private repositories (e.g., repositories included in repos files provided through `vcs-repo-file-url`), you will need to generate a [personal access token](https://github.com/settings/tokens) (PAT) with the \"repo\" scope and add it to your repo's [secrets][creating-encrypted-secrets].\nFor example, if this secret is called `REPO_TOKEN`:\n\n```yaml\n  - uses: ros-tooling/action-ros-ci@v0.4\n    with:\n      package-name: my_package\n      # If there are no private dependencies, use the default token, no need to create a PAT or add a secret\n      import-token: ${{ secrets.GITHUB_TOKEN }}\n      # If there are private dependencies (e.g., in a file provided through vcs-repo-file-url), a PAT is required\n      import-token: ${{ secrets.REPO_TOKEN }}\n```\n\nNote that this currently only works for tokens for the GitHub server this action runs on.\nFor example, it will not work with a token for a private repo on github.com when the action is running on an enterprise GitHub server.\n\n### Skip `rosdep install` and run `rosdep check`\n\nInclude an option to bypass `rosdep install` for workflow that uses specific docker image that is expected to already have all dependencies.\nTo check for missing dependencies within the workflow's image, user can run with `rosdep-check: true` flag.\n\n```yaml\nruns-on: ubuntu-latest\ncontainer:\n  image: my-prepared-docker-image\nsteps:\n  # ...\n  - uses: ros-tooling/action-ros-ci@v0.4\n    with:\n      target-ros2-distro: jazzy\n      package-name: ament_copyright\n      vcs-repo-file-url: \"https://raw.githubusercontent.com/ros2/ros2/release-jazzy-20240523/ros2.repos\"\n      skip-rosdep-install: true\n      rosdep-check: true\n```\n\n### Interdependent pull requests or merge requests\n\nThis action allows declaring PR dependencies by providing:\n* repos file(s) to override the one(s) defined through the `vcs-repo-file-url` action input\n* supplemental repos file(s) to be used along with the rest\n\nFor example, this may be useful when your PR depends on PRs/MRs/branches from other repos for it to work or be properly tested.\n\nInclude links in your PR's description using the following format:\n\n```\naction-ros-ci-repos-override: https://gist.github.com/some-user/some.repos\naction-ros-ci-repos-override: https://gist.github.com/some-user/some-other.repos\naction-ros-ci-repos-supplemental: https://gist.github.com/some-user/some-supplemental.repos\naction-ros-ci-repos-supplemental: file://path/to/some/other/supplemental.repos\n```\n\n## Developing\n\nFor developing and releasing `action-ros-ci`, see [`DEVELOPING.md`](DEVELOPING.md).\n\n## License\n\nThe scripts and documentation in this project are released under the [Apache 2](LICENSE) license.\n\n[creating-encrypted-secrets]: https://help.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets#creating-encrypted-secrets\n[persisting-workflow-data-using-artifacts]: https://help.github.com/en/actions/configuring-and-managing-workflows/persisting-workflow-data-using-artifacts\n[addresssanitizer]: https://en.wikipedia.org/wiki/AddressSanitizer\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fros-tooling%2Faction-ros-ci","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fros-tooling%2Faction-ros-ci","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fros-tooling%2Faction-ros-ci/lists"}