{"id":18508947,"url":"https://github.com/lightspeed/palisade","last_synced_at":"2025-04-09T03:32:17.765Z","repository":{"id":37182549,"uuid":"268906456","full_name":"lightspeed/palisade","owner":"lightspeed","description":"A release automation tool for GitHub repos","archived":true,"fork":false,"pushed_at":"2023-07-23T19:00:45.000Z","size":300,"stargazers_count":57,"open_issues_count":18,"forks_count":4,"subscribers_count":18,"default_branch":"master","last_synced_at":"2025-03-03T01:18:39.168Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","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/lightspeed.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-06-02T20:55:27.000Z","updated_at":"2024-12-06T04:03:42.000Z","dependencies_parsed_at":"2023-02-12T06:45:46.547Z","dependency_job_id":null,"html_url":"https://github.com/lightspeed/palisade","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lightspeed%2Fpalisade","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lightspeed%2Fpalisade/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lightspeed%2Fpalisade/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lightspeed%2Fpalisade/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lightspeed","download_url":"https://codeload.github.com/lightspeed/palisade/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247973931,"owners_count":21026736,"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":[],"created_at":"2024-11-06T15:15:56.428Z","updated_at":"2025-04-09T03:32:17.475Z","avatar_url":"https://github.com/lightspeed.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# palisade\n\n[![built with\nnix](https://builtwithnix.org/badge.svg)](https://builtwithnix.org)\n[![written in rust](https://img.shields.io/badge/language-Rust-orange)](https://www.rust-lang.org/)\n\nA simple release automation tool for GitHub repos\n\nPalisade ([IPA][ipa]: /pæl əˈseɪd/) is a tool that reads from changelog and\nversion files  then uses them to cut releases of software. This tool is intended\nto be run by CI tools on every commit to master.\n\n[ipa]: https://en.wikipedia.org/wiki/International_Phonetic_Alphabet\n\n## Build Instructions\n\n### With Nix\n\nIf you have [Nix](https://nixos.org/nix) installed, you can run the following\ncommand to build this software:\n\n```console\n$ nix-build\n```\n\nThis will automatically create a release build linked to `./result`. The binary\nwill be `./result/bin/palisade`. \n\n### With Cargo\n\n```console\n$ cargo build --release\n```\n\n## Hacking\n\nIf you are using Nix, [direnv](https://direnv.net/) and\n[Lorri](https://github.com/target/lorri), you can get an exact replica of the\nrequired development environment by running `direnv allow` in the checkout of\nthis project. See [this\nblogpost](https://christine.website/blog/how-i-start-nix-2020-03-08) for more\ninformation on how to install Nix if you want to try this workflow out.\n\nIf you are not using Nix, you need at least the following dependencies:\n\n- Rust 1.43 or newer\n- libgit2 (newest if possible)\n- libiconv (should be part of glibc on linux)\n- openssl and its development headers\n- pkg-config\n\nDetails on how to do this will be distribution specific. Please consult the\ndocumentation of your package manager and operating system to figure out the\nlist of packages you will need.\n\nTests can be run with `cargo test`:\n\n```console\n$ cargo test\n```\n\nPlease be sure any tests relevant to the changes pass and that all changes are\ntested (when possible).\n\n## Raison d'Être\n\nExisting automated release scripts for our GitHub repos have been flaky and have\nnot been able to populate the release notes from the changelog. Palisade\naims to automate the process of cutting releases down to pull requesting two\nfiles in the repo: A [changelog](https://keepachangelog.com/en/1.0.0/) and a\nversion file. Once these files are updated on the master branch, then CI will use\nthis tool to bump the version if it needs to.\n\nThe changelog file will need to list version information in a second level\nheader. This will be used as the delimiters to scrape out the matching version\ninformation. For example, with a changelog that looks like this:\n\n```markdown\n# Changelog\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## 0.1.0\n\n### FIXED\n\n- Refrobnicate the spurious rilkefs\n\n## 0.0.1\n\nFirst release, proof of concept.\n```\n\nWhen a release is created for version 0.1.0, this tool will make the description\nof the release about as follows:\n\n```\n### FIXED\n\n- Refrobnicate the spurious rilkefs\n```\n\nThis allows the changelog file to be the ultimate source of truth for release\nnotes with this tool. Changes to the release notes can then be reviewed\nalongside the source code of your project.\n\nThe `VERSION` file plays into this as well. The `VERSION` file MUST be a single\nline containing a [semantic version][semver] string. This allows the `VERSION`\nfile to be the ultimate source of truth for software version data with this\ntool. It also allows the software version to be reviewed alongside the source\ncode of your project, exposing something normally hidden in git to your team.\n\n[semver]: https://semver.org/spec/v2.0.0.html\n\n### How It Works\n\nWhen this tool is run with the `cut` subcommand, the following actions take place:\n\n- The `VERSION` file is read and loaded as the desired tag for the repo\n- The `CHANGELOG.md` file (or the changelog path specified as a flag) is read\n  and the changes for the `VERSION` are cherry-picked out of the file\n- The git repo is checked to see if that tag already exists\n  - If the tag exists, the tool exits and does nothing\n- A GitHub release is created using the changelog fragment and the release name\n  is generated from the `VERSION` string, which creates a matching git tag\n\nSee [here](./doc/usage.md) for instructions on how to integrate this tool into\nyour CI workflows.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flightspeed%2Fpalisade","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flightspeed%2Fpalisade","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flightspeed%2Fpalisade/lists"}