{"id":14969244,"url":"https://github.com/cucumber/polyglot-release","last_synced_at":"2025-10-19T09:32:27.334Z","repository":{"id":38183882,"uuid":"479097174","full_name":"cucumber/polyglot-release","owner":"cucumber","description":"Make polyglot releases with a single command","archived":false,"fork":false,"pushed_at":"2024-01-04T14:23:38.000Z","size":161,"stargazers_count":5,"open_issues_count":11,"forks_count":1,"subscribers_count":120,"default_branch":"main","last_synced_at":"2024-04-14T13:08:33.888Z","etag":null,"topics":["bash","polyglot-release"],"latest_commit_sha":null,"homepage":"","language":"Shell","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/cucumber.png","metadata":{"funding":{"open_collective":"cucumber"},"files":{"readme":"README.md","changelog":"CHANGELOG.md","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}},"created_at":"2022-04-07T18:06:55.000Z","updated_at":"2023-09-15T12:03:41.000Z","dependencies_parsed_at":"2024-01-18T17:08:19.706Z","dependency_job_id":null,"html_url":"https://github.com/cucumber/polyglot-release","commit_stats":{"total_commits":113,"total_committers":7,"mean_commits":"16.142857142857142","dds":0.5132743362831859,"last_synced_commit":"75e8af2c3398433d7a01862a863d038aa7d22dcb"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cucumber%2Fpolyglot-release","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cucumber%2Fpolyglot-release/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cucumber%2Fpolyglot-release/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cucumber%2Fpolyglot-release/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cucumber","download_url":"https://codeload.github.com/cucumber/polyglot-release/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":205636964,"owners_count":14457070,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["bash","polyglot-release"],"created_at":"2024-09-24T13:41:25.535Z","updated_at":"2025-10-19T09:32:27.322Z","avatar_url":"https://github.com/cucumber.png","language":"Shell","funding_links":["https://opencollective.com/cucumber"],"categories":[],"sub_categories":[],"readme":"[![Tests](https://github.com/cucumber/polyglot-release/actions/workflows/main.yml/badge.svg)](https://github.com/cucumber/polyglot-release/actions/workflows/main.yml)\n\n# polyglot-release\n\nMake releases with a single command\n\nSupports the release process for Cucumber repos as documented in [RELEASING.md](https://github.com/cucumber/.github/blob/main/RELEASING.md).\n\nIt's designed to be run locally on a dev's workstation to make the mechanical changes to package manager manifests and the `CHANGELOG.md` file neccesary when making a release.\n\nEssentially, when you run `polyglot-release X.Y.Z` it will:\n\n1. run some sanity checks to make sure you don't have unpushed local changes etc.\n1. modify package manager files in each language version to set the next version to X.Y.Z\n1. update the `CHANGELOG.md` moving everything in the `Unreleased` section into a section for the X.Y.Z release. \n1. commit\n1. tag the commit with `vX.Y.Z`\n1. git push to a `release/vX.Y.Z` branch on the `origin` remote\n4) modify package manager files in some languages (e.g. Java) to a \"post-release / next development / SNAPSHOT\" version\n5) commit again\n6) push everything to `origin/main`\n\n## Works with polyglot repos\n\nIf we have a project structure with distinct folders for each language, it will release each language, updating the version number in the different package manager manifests in a single git commit.\n\n```\n$ tree\n.\n├── CHANGELOG.md\n│── android\n│   └── gradle.properties\n│── c\n│   └── VERSION\n│── dotnet\n│   ├── Project.sln\n│   └── Project\n│       └── Project.csproj\n├── elixir\n│   └── mix.exs\n├── github-action\n│   └── action.yml\n├── go\n│   └── go.mod\n├── javascript\n│   └── package.json\n├── java\n│   └── pom.xml\n├── perl\n│   ├── cpanfile\n│   └── VERSION\n├── php\n│   └── composer.json\n├── python\n│   └── pyproject.toml # or setup.py, or pyproject.toml with uv.lock,  \n└── ruby\n    ├── project.gemspec\n    └── VERSION\n```\n\n## Works with monoglot repos\n\nIf certain key files (`pom.xml`, `*.gemspec`, `package.json`, etc.) are present in the root directory, the project is assumed to be a \"monoglot\" repo and we just release that language.\n\n```\n$ tree\n.\n├── CHANGELOG.md\n├── pom.xml\n```\n\n## Installation\n\nFirst, check that `/usr/local/bin` is writable on your machine:\n\n    touch /usr/local/bin/polyglot-release\n\nIf this fails, you need to [make it writable](https://apple.stackexchange.com/questions/192227/how-to-make-files-in-usr-local-writable-for-homebrew)\n\nTo install in a project run:\n\n```shell\nPOLYGLOT_RELEASE_VERSION=1.7.1\ncurl --silent -o /usr/local/bin/polyglot-release https://raw.githubusercontent.com/cucumber/polyglot-release/v$POLYGLOT_RELEASE_VERSION/polyglot-release\nchmod 755 /usr/local/bin/polyglot-release\n# Ensure /usr/local/bin is in your $PATH\npolyglot-release --help\n```\n\nBefore using `polyglot-release` to make a release, make sure you have these tools installed:\n* [Git](https://git-scm.com/) - version \u003e 2.25\n* [changelog](https://github.com/cucumber/changelog/)\n* `curl`\n* `gpg`\n* Core Utils (e.g. `find`, `sed`, `grep`, `pushd`, `popd`, ect). On MacOS you can install this with `brew install coreutils`\n\nOther tools may also be required depending on the language(s) you are trying to release. Polyglot-release will inform\nyou about these as needed.\n\n## Contributing\n\nFirst, install [shellcheck](https://www.shellcheck.net/)\n\nTo run all the tests:\n\n    ./polyglot-release-test\n\nTo run a single test:\n\n    ./polyglot-release-test \u003cpath-to-test-script\u003e\n\nWe use an [approval testing](https://approvaltests.com/) style for testing this app.\n\nEach test is a shell script in the [`tests`](./tests) folder. Alongside the test file you will find `.expected` files that show different kinds of expected outputs and effects from running the test script. If you've run the tests you will also find matching `.actual` files.\n\n### Fixtures\n\nWhen a test runs, we set up a temporary folder to run it in, with a `local` git repo and a remote `origin` repo (sitting in a folder right next to it). The `local` repo starts with an initial git commit with the contents of one of the [`tests/fixtures`](./tests/fixtures) folders. Use a header in your test script to specify the fixture to use (otherwise it will default to the `polyglot` fixture)\n\ne.g.\n\n```\n# fixture: my-unique-setup\npolyglot-release 1.0.0\n```\n\n### Exploratory testing\n\nSometimes it's helpful to play around with how the tool works in a safe, sandbox environment.\n\nYou can start a bash prompt in the same environment as an automated test would run in (with `local` and `origin` git repo folders) like this:\n\n    polyglot-release-test ./tests/fixtures/\u003csome-fixture\u003e\n\n## Releasing\n\nYou can use `polyglot-release` to release polyglot-release:\n\n```\n./polyglot-release MAJOR.MINOR.PATCH\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcucumber%2Fpolyglot-release","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcucumber%2Fpolyglot-release","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcucumber%2Fpolyglot-release/lists"}