{"id":15945747,"url":"https://github.com/marccarre/go-github-release","last_synced_at":"2026-04-28T20:04:17.372Z","repository":{"id":143069907,"uuid":"157090256","full_name":"marccarre/go-github-release","owner":"marccarre","description":"An utility to manage GitHub releases, sign binaries \u0026 release them to GitHub","archived":false,"fork":false,"pushed_at":"2018-11-14T04:06:17.000Z","size":2042,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-03T22:14:33.316Z","etag":null,"topics":["github","gpg","release-automation","utility"],"latest_commit_sha":null,"homepage":"","language":"Go","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/marccarre.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}},"created_at":"2018-11-11T14:56:33.000Z","updated_at":"2018-11-14T04:06:18.000Z","dependencies_parsed_at":"2023-03-26T16:49:54.463Z","dependency_job_id":null,"html_url":"https://github.com/marccarre/go-github-release","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/marccarre/go-github-release","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marccarre%2Fgo-github-release","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marccarre%2Fgo-github-release/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marccarre%2Fgo-github-release/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marccarre%2Fgo-github-release/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marccarre","download_url":"https://codeload.github.com/marccarre/go-github-release/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marccarre%2Fgo-github-release/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32396794,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-28T19:38:08.556Z","status":"ssl_error","status_checked_at":"2026-04-28T19:37:55.688Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["github","gpg","release-automation","utility"],"created_at":"2024-10-07T09:06:08.399Z","updated_at":"2026-04-28T20:04:17.345Z","avatar_url":"https://github.com/marccarre.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![CircleCI](https://circleci.com/gh/marccarre/go-github-release/tree/master.svg?style=shield)](https://circleci.com/gh/marccarre/go-github-release/tree/master)\n[![Go Report Card](https://goreportcard.com/badge/github.com/marccarre/go-github-release)](https://goreportcard.com/report/github.com/marccarre/go-github-release)\n[![Coverage Status](https://coveralls.io/repos/github/marccarre/go-github-release/badge.svg)](https://coveralls.io/github/marccarre/go-github-release)\n[![codecov](https://codecov.io/gh/marccarre/go-github-release/branch/master/graph/badge.svg)](https://codecov.io/gh/marccarre/go-github-release)\n[![Docker Repository on Quay](https://quay.io/repository/marccarre/go-github-release/status)](https://quay.io/repository/marccarre/go-github-release)\n\n# go-github-release\n\n## Features\n\n- `release`:\n  - creates the GitHub release matching the provided tag,\n  - signs the provided release assets,\n  - uploads the provided release assets and their signatures to the GitHub release.\n\n## Installation\n\n1. Download the [latest version](https://github.com/marccarre/go-github-release/releases/latest) of `ghrelease` and its signature.\n2. [Optional] Verify `ghrelease`'s signature:\n\n    1. Import my CI/CD GPG key:\n\n      ```console\n      $ gpg --recv-keys 92A05461\n      gpg: key 6A74FEA692A05461: public key \"Marc CARRE (GitHub software releases) \u003ccarre.marc@gmail.com\u003e\" imported\n      gpg: Total number processed: 1\n      gpg:               imported: 1\n      ```\n\n    2. Check its fingerprint:\n\n      ```console\n      $ gpg --fingerprint 92A05461\n      gpg: checking the trustdb\n      gpg: marginals needed: 3  completes needed: 1  trust model: pgp\n      gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u\n      gpg: next trustdb check due at 2020-11-13\n      pub   rsa4096 2018-11-11 [SC] [expires: 2019-11-11]\n            49A9 5DE0 562B 072A 82B4  F072 6A74 FEA6 92A0 5461\n      uid           [ unknown] Marc CARRE (GitHub software releases) \u003ccarre.marc@gmail.com\u003e\n      sub   rsa4096 2018-11-11 [E] [expires: 2019-11-11]\n      ```\n\n    3. Import my [personal GPG key](https://keybase.io/marccarre):\n\n      ```console\n      $ gpg --recv-keys F69B8B32\n      gpg: key 062658EFF69B8B32: public key \"Marc CARRE \u003ccarre.marc@gmail.com\u003e\" imported\n      gpg: Total number processed: 1\n      gpg:               imported: 1\n      ```\n\n    4. Ensure my CI/CD key is signed by [me](https://keybase.io/marccarre):\n\n      ```console\n      $ gpg --list-signatures 92A05461\n      pub   rsa4096 2018-11-11 [SC] [expires: 2019-11-11]\n            49A95DE0562B072A82B4F0726A74FEA692A05461\n      uid           [ unknown] Marc CARRE (GitHub software releases) \u003ccarre.marc@gmail.com\u003e\n      sig 3        6A74FEA692A05461 2018-11-11  Marc CARRE (GitHub software releases) \u003ccarre.marc@gmail.com\u003e\n      sig 3        062658EFF69B8B32 2018-11-11  Marc CARRE \u003ccarre.marc@gmail.com\u003e\n      sub   rsa4096 2018-11-11 [E] [expires: 2019-11-11]\n      sig          6A74FEA692A05461 2018-11-11  Marc CARRE (GitHub software releases) \u003ccarre.marc@gmail.com\u003e\n      ```\n\n    5. Check `ghrelease` against its detached signature, e.g.:\n\n      ```console\n      $ gpg --verify ghrelease-v1.0.0-linux.asc ghrelease-v1.0.0-linux\n      gpg: Signature made Wed 14 Nov 12:41:17 2018 JST\n      gpg:                using RSA key 6A74FEA692A05461\n      gpg: Good signature from \"Marc CARRE (GitHub software releases) \u003ccarre.marc@gmail.com\u003e\" [ultimate]\n      ```\n\n## Usage\n\n```console\n$ gpg --export-secret-keys \u003ckey-id\u003e \u003e /path/to/your/private/key.asc\n$ export GPG_PASSWD=\"...\"\n$ export GITHUB_API_TOKEN=\"...\"\n$ ghrelease release --help\nSign and upload the provided release assets on GitHub under the release corresponding to the provided tag\n\nUsage:\n  ghrelease release [flags]\n\nFlags:\n  -d, --draft          Should the release be a draft release, default: true (default true)\n  -h, --help           help for release\n  -k, --key string     Path to the private GPG key to use to sign the release assets\n  -o, --owner string   GitHub owner, e.g. marccarre in github.com/marccarre/go-github-release\n  -r, --repo string    GitHub repository, e.g. go-github-release in github.com/marccarre/go-github-release\n  -t, --tag string     Git tag corresponding to the release to perform, e.g. v1.0.0\n\n$ ghrelease release -o marccarre -r go-github-release -t v1.0.0 -k /path/to/your/private/key.asc \u003cyour-binary\u003e ...\n{\"level\":\"info\",\"msg\":\"creating release\",\"owner\":\"marccarre\",\"repo\":\"go-github-release\",\"tag\":\"v1.0.0\",\"draft\":true}\n{\"level\":\"info\",\"msg\":\"successfully created release\",\"owner\":\"marccarre\",\"repo\":\"go-github-release\",\"tag\":\"v1.0.0\",\"draft\":true}\n{\"level\":\"info\",\"msg\":\"signing release asset\",\"file\":\"\u003cyour-binary\u003e\"}\n{\"level\":\"info\",\"msg\":\"successfully signed release asset\",\"file\":\"\u003cyour-binary\u003e\"}\n{\"level\":\"info\",\"msg\":\"uploading release asset\",\"file\":\"\u003cyour-binary\u003e\",\"release\":\"v1.0.0\"}\n{\"level\":\"info\",\"msg\":\"successfully uploaded release asset\",\"file\":\"\u003cyour-binary\u003e\",\"release\":\"v1.0.0\",\"asset\":\"\u003cyour-binary\u003e\"}\n{\"level\":\"info\",\"msg\":\"uploading release asset\",\"file\":\"\u003cyour-binary\u003e.asc\",\"release\":\"v1.0.0\"}\n{\"level\":\"info\",\"msg\":\"successfully uploaded release asset\",\"file\":\"\u003cyour-binary\u003e.asc\",\"release\":\"v1.0.0\",\"asset\":\"\u003cyour-binary\u003e.asc\"}\n```\n\n## Development\n\n### Setup\n\n- Install [`docker`](https://store.docker.com/search?type=edition\u0026offering=community)\n- Install `make`\n\nThat's all folks!\nAll other tools are packaged in build Docker images (see `Dockerfile`) to ensure any machine can build easily, hence avoiding the \"[_it works on my machine_](http://www.codinghorror.com/blog/2007/03/the-works-on-my-machine-certification-program.html)\" syndrome.\n\n### Build\n\n```console\nmake\n```\n\n### Lint\n\n```console\nmake lint\n```\n\n### Test\n\n```console\nmake test\n```\n\n### Release\n\n```console\ngit tag vX.Y.Z \u003ccommit-hash\u003e -a -m vX.Y.Z\ngit push --tags\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarccarre%2Fgo-github-release","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarccarre%2Fgo-github-release","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarccarre%2Fgo-github-release/lists"}