{"id":19293503,"url":"https://github.com/reloaded-project/devops-publish-action","last_synced_at":"2026-02-28T07:10:03.334Z","repository":{"id":245626467,"uuid":"818790409","full_name":"Reloaded-Project/devops-publish-action","owner":"Reloaded-Project","description":"A GitHub Action for publishing the artifacts to GitHub Releases and code packages to the package repositories","archived":false,"fork":false,"pushed_at":"2025-12-15T10:45:03.000Z","size":280,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"v3-master","last_synced_at":"2025-12-18T10:57:43.594Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Reloaded-Project.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":null,"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":"2024-06-22T21:55:25.000Z","updated_at":"2025-12-15T10:45:00.000Z","dependencies_parsed_at":"2025-12-05T04:06:21.181Z","dependency_job_id":null,"html_url":"https://github.com/Reloaded-Project/devops-publish-action","commit_stats":null,"previous_names":["reloaded-project/devops-publish-action"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/Reloaded-Project/devops-publish-action","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Reloaded-Project%2Fdevops-publish-action","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Reloaded-Project%2Fdevops-publish-action/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Reloaded-Project%2Fdevops-publish-action/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Reloaded-Project%2Fdevops-publish-action/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Reloaded-Project","download_url":"https://codeload.github.com/Reloaded-Project/devops-publish-action/tar.gz/refs/heads/v3-master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Reloaded-Project%2Fdevops-publish-action/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29927290,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-27T19:37:42.220Z","status":"online","status_checked_at":"2026-02-28T02:00:07.010Z","response_time":90,"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":[],"created_at":"2024-11-09T22:35:14.159Z","updated_at":"2026-02-28T07:10:03.311Z","avatar_url":"https://github.com/Reloaded-Project.png","language":"Python","readme":"\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/Reloaded-Project/devops-publish-action\" target=\"_blank\"\u003e\n    \u003cimg src=\"assets/reloaded-logo.png\" alt=\"Logo\" width=\"100\" height=\"100\"\u003e\n  \u003c/a\u003e\n\n  \u003ch1 align=\"center\"\u003eReloaded Publish Action\u003c/h1\u003e\n\n  \u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/Reloaded-Project/devops-publish-action/blob/main/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-blue.svg\" alt=\"License\"\u003e\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\nThis GitHub Action is designed to streamline the publishing process for Reloaded projects by \nautomatically detecting and uploading artifacts to the appropriate locations, such as GitHub \nReleases, NuGet, and crates.io.\n\n## Features\n\n- 📦 Download artifacts generated by other GitHub Actions\n- 🚀 Upload artifacts to GitHub Releases\n- 📦 Publish NuGet packages to nuget.org\n- 🦀 Publish Rust packages to crates.io\n- 📝 Generate changelogs via [devops-changelog](https://github.com/Reloaded-Project/devops-changelog)\n- 🔍 Automatically detect and upload the appropriate artifacts\n\n## Usage\n\nTo use this action in your GitHub workflow, add the following step:\n\n```yaml\npublish-crate:\n  permissions:\n    contents: write\n\n  # Dependencies that produce publish-able artifacts.\n  needs: [build-and-test,build-c-headers,build-dotnet-library]\n\n  # Publish only on tags\n  if: startsWith(github.ref, 'refs/tags/') \n  runs-on: ubuntu-latest\n  steps:\n  - uses: actions/checkout@v4\n\n  - name: Publish artifacts\n    uses: Reloaded-Project/devops-publish-action@v3\n    with:\n      csharp-nuget-api-key: ${{ secrets.NUGET_KEY }}\n      rust-crates-io-token: ${{ secrets.CRATES_IO_TOKEN }}\n      \n      # For standalone Rust projects, specify paths to the project directories\n      rust-cargo-project-paths: |\n        ./path/to/rust/project1\n        ./path/to/rust/project2\n        \n      # For Cargo workspace projects, specify the workspace root and crate names\n      rust-cargo-workspace-root: ./path/to/workspace\n      rust-cargo-workspace-crates: |\n        crate_name1\n        crate_name2\n```\n\n## Inputs\n\n### General Parameters\n\n| Input                            | Description                                                 | Required | Default                |\n| -------------------------------- | ----------------------------------------------------------- | -------- | ---------------------- |\n| `artifacts-directory`            | Path to the directory containing the artifacts              | No       | `artifacts`            |\n| `compressed-artifacts-directory` | Path to the directory containing the zipped artifacts       | No       | `compressed-artifacts` |\n| `create-release`                 | Whether the artifacts should be uploaded to GitHub Releases | No       | `true`                 |\n| `checkout-current-repo`          | Checks out the current repository                           | No       | `true`                 |\n\n### Compression Parameters\n\n| Input                  | Description                                                       | Required | Default                       |\n| ---------------------- | ----------------------------------------------------------------- | -------- | ----------------------------- |\n| `artifact-groups-file` | Path to YAML file for grouping artifact directories into archives | No       | `.github/artifact-groups.yml` |\n| `compression-tool`     | Compression tool to use (zip, 7z)                                 | No       | `zip`                         |\n| `compression-args`     | Additional arguments for the compression tool                     | No       | `''`                          |\n\n#### Artifact Groups Examples\n\nCreate a `.github/artifact-groups.yml` file in your repository to configure how artifact directories are grouped into archives. If the file doesn't exist, each artifact directory is compressed individually.\n\nExample `.github/artifact-groups.yml`:\n\n```yaml\n# Explicit list - name specific directories to group\nc-library:\n  - c-library-linux-x64\n  - c-library-windows-x64\n  - c-library-macos-arm64\n\n# Pattern matching (single string) with excludes (single string)\nnon-symbols:\n  patterns: \"*\"\n  excludes: \"*.symbols\"\n\n# Multiple patterns and excludes (list)\nbinaries:\n  patterns:\n    - \"linux-*\"\n    - \"windows-*\"\n    - \"macos-*\"\n  excludes:\n    - \"*-test\"\n    - \"*-debug\"\n\n# Multiple flatten patterns (list)\nheaders:\n  patterns: \"C-Headers-*\"\n  flattens:\n    - \"*-bindings_c.h\"\n    - \"*-bindings_cpp.hpp\"\n\n# Rename directories (search/replace on top-level dir names)\nc-library:\n  patterns: \"C-Library-*\"\n  renames:\n    - \"C-Library-prs-rs-\": \"\"  # Remove prefix\n\n# Combined with flattens (renames apply after flattens)\nbinaries:\n  patterns: \"C-Library-*\"\n  flattens: \"C-Library-linux-*\"\n  renames:\n    - \"C-Library-\": \"\"\n\n# Directories not matching any group remain as individual archives\n```\n\nNotes:\n- Directories not matching any group are compressed as individual archives\n- A directory can be included in multiple groups - each group independently matches directories, so overlapping patterns will result in the same directory appearing in multiple archives\n- `patterns`, `excludes`, and `flattens` accept either a single string or a list\n- The `flattens` option places files from matched directories directly at the archive root\n- The `renames` option applies search/replace transformations to top-level directory names\n- Renames are applied after flattens, in list order\n- `renames` uses list-of-dicts syntax: `- \"search\": \"replace\"`\n- If flattening or renaming would cause conflicts, the script fails with an error listing all conflicts\n\n### [C#/NuGet](https://nuget.org) Parameters\n\n| Input                         | Description                                 | Required | Default |\n| ----------------------------- | ------------------------------------------- | -------- | ------- |\n| `csharp-nuget-api-key`        | NuGet API key for publishing packages       | No       |         |\n| `csharp-nuget-publish-params` | Additional parameters for dotnet nuget push | No       | `''`    |\n\n### [Rust/Cargo](https://crates.io) Parameters\n\n| Input                         | Description                                                 | Required | Default |\n| ----------------------------- | ----------------------------------------------------------- | -------- | ------- |\n| `rust-crates-io-token`        | Crates.io token for publishing Rust packages                | No       |         |\n| `rust-cargo-project-paths`    | List of paths to standalone Rust projects                   | No       | `''`    |\n| `rust-cargo-workspace-root`   | Root path of the Cargo workspace                            | No       | `.`     |\n| `rust-cargo-workspace-crates` | List of specific crates to publish from a Cargo workspace   | No       | `''`    |\n| `rust-cargo-publish-params`   | Additional parameters for cargo publish (e.g., `--dry-run`) | No       | `''`    |\n\n### Changelog Parameters\n\nFor detailed documentation on changelog options, see [devops-changelog](https://github.com/Reloaded-Project/devops-changelog).\n\n#### Control Inputs\n\n| Input                          | Description                              | Required | Default     |\n| ------------------------------ | ---------------------------------------- | -------- | ----------- |\n| `changelog-enabled`            | Enable changelog generation              | No       | `false`     |\n| `changelog-include-in-release` | Include changelog file in release assets | No       | `false`     |\n| `changelog-upload-artifact`    | Upload changelog as GitHub artifact      | No       | `false`     |\n| `changelog-artifact-name`      | Name for the changelog artifact          | No       | `Changelog` |\n\n#### Auto-changelog Options\n\n| Input                                 | Description                                                                    | Required | Default        |\n| ------------------------------------- | ------------------------------------------------------------------------------ | -------- | -------------- |\n| `changelog-output`                    | Output file path                                                               | No       | `CHANGELOG.md` |\n| `changelog-config`                    | Path to auto-changelog config file                                             | No       | `''`           |\n| `changelog-template`                  | Template to use [compact, keepachangelog, json]                                | No       | `compact`      |\n| `changelog-remote`                    | Git remote for links                                                           | No       | `''`           |\n| `changelog-package`                   | Use version from file as latest release                                        | No       | `''`           |\n| `changelog-latest-version`            | Use specified version as latest release                                        | No       | `''`           |\n| `changelog-unreleased`                | Include unreleased changes section                                             | No       | `false`        |\n| `changelog-commit-limit`              | Number of commits to display per release                                       | No       | `''`           |\n| `changelog-backfill-limit`            | Number of commits to backfill empty releases                                   | No       | `''`           |\n| `changelog-commit-url`                | Override commit URL, use {id} for commit id                                    | No       | `''`           |\n| `changelog-issue-url`                 | Override issue URL, use {id} for issue id                                      | No       | `''`           |\n| `changelog-merge-url`                 | Override merge URL, use {id} for merge id                                      | No       | `''`           |\n| `changelog-compare-url`               | Override compare URL, use {from} and {to} for tags                             | No       | `''`           |\n| `changelog-issue-pattern`             | Override regex pattern for issues in commit messages                           | No       | `''`           |\n| `changelog-breaking-pattern`          | Regex pattern for breaking change commits                                      | No       | `''`           |\n| `changelog-merge-pattern`             | Add custom regex pattern for merge commits                                     | No       | `''`           |\n| `changelog-commit-pattern`            | Pattern to include when parsing commits                                        | No       | `''`           |\n| `changelog-ignore-commit-pattern`     | Pattern to ignore when parsing commits                                         | No       | `''`           |\n| `changelog-tag-pattern`               | Override regex pattern for version tags                                        | No       | `''`           |\n| `changelog-tag-prefix`                | Prefix used in version tags                                                    | No       | `''`           |\n| `changelog-starting-version`          | Specify earliest version to include in changelog                               | No       | `''`           |\n| `changelog-starting-date`             | Specify earliest date to include in changelog                                  | No       | `''`           |\n| `changelog-ending-version`            | Specify latest version to include in changelog                                 | No       | `''`           |\n| `changelog-sort-commits`              | Sort commits by property [relevance, date, date-desc, subject, subject-desc]   | No       | `relevance`    |\n| `changelog-release-summary`           | Display tagged commit message body as release summary                          | No       | `false`        |\n| `changelog-unreleased-only`           | Only output unreleased changes                                                 | No       | `false`        |\n| `changelog-hide-empty-releases`       | Hide empty releases                                                            | No       | `false`        |\n| `changelog-hide-credit`               | Hide auto-changelog credit                                                     | No       | `false`        |\n| `changelog-handlebars-setup`          | Handlebars setup file                                                          | No       | `''`           |\n| `changelog-append-git-log`            | String to append to git log command                                            | No       | `''`           |\n| `changelog-append-git-tag`            | String to append to git tag command                                            | No       | `''`           |\n| `changelog-prepend`                   | Prepend changelog to output file                                               | No       | `false`        |\n| `changelog-stdout`                    | Output changelog to stdout                                                     | No       | `false`        |\n| `changelog-is-release`                | Whether this is a GitHub Release                                               | No       | `false`        |\n| `changelog-release-tag`               | Tag associated with the GitHub Release                                         | No       | `''`           |\n| `changelog-override-starting-version` | Override the starting version with the release tag if this is a GitHub Release | No       | `false`        |\n\n## How this Action Works\n\n- Downloads all artifacts and re-uploads them to the GitHub Releases.\n- Optionally generates a changelog using the [devops-changelog](https://github.com/Reloaded-Project/devops-changelog) action and uses it as the release body.\n- Uploads all NuGet packages stored in artifacts to `nuget.org`\n- Uploads specified Rust projects to `crates.io` using two different methods:\n  - **Standalone Projects**: Use `rust-cargo-project-paths` with full paths to individual project directories. Publishes using `--manifest-path`.\n  - **Workspace Projects**: Use `rust-cargo-workspace-root` + `rust-cargo-workspace-crates` to publish specific crates from a workspace by name. Publishes using `-p` flag.\n\n## Why this Action Exists\n\nReloaded projects produce various types of artifacts, such as binaries, libraries, NuGet packages,\nand Rust packages. This action makes it easy to publish these artifacts.\n\nThis action is designed to be used in conjunction with actions such as:\n\n- [devops-changelog](https://github.com/Reloaded-Project/devops-changelog)\n- [devops-rust-cbindgen](https://github.com/Reloaded-Project/devops-rust-cbindgen)\n- [devops-rust-lightweight-binary](https://github.com/Reloaded-Project/devops-rust-lightweight-binary)\n\nThis action centralizes the publishing logic, ensuring consistency across projects and reducing\nmaintenance overhead.\n\n## Contributing\n\nContributions are welcome!\n\nIf you encounter any issues or have suggestions for improvements, please\nopen an issue or submit a pull request in this repository.\n\n## License\n\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freloaded-project%2Fdevops-publish-action","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Freloaded-project%2Fdevops-publish-action","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freloaded-project%2Fdevops-publish-action/lists"}