From c5ba3b439a7d111140551cc7c700f307394a89bb Mon Sep 17 00:00:00 2001 From: croche Date: Thu, 25 Apr 2024 14:20:35 +0100 Subject: [PATCH] OCM-7256 | chore: set up release action --- .github/workflows/publish-release.yml | 137 ++++++++++++++++++++++++++ .github/workflows/requirements.txt | 3 + .idea/.gitignore | 8 -- .idea/modules.xml | 8 -- .idea/rosa-support.iml | 9 -- .idea/vcs.xml | 6 -- CHANGES.md | 5 + README.md | 33 +++++++ pkg/version/version.go | 2 +- 9 files changed, 179 insertions(+), 32 deletions(-) create mode 100644 .github/workflows/publish-release.yml create mode 100644 .github/workflows/requirements.txt delete mode 100644 .idea/.gitignore delete mode 100644 .idea/modules.xml delete mode 100644 .idea/rosa-support.iml delete mode 100644 .idea/vcs.xml create mode 100644 CHANGES.md diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml new file mode 100644 index 0000000..10bc9e7 --- /dev/null +++ b/.github/workflows/publish-release.yml @@ -0,0 +1,137 @@ +name: Publish release + +on: + push: + tags: + - '*' + +jobs: + + release: + name: Publish release + runs-on: ubuntu-latest + steps: + - name: Checkout the source + uses: actions/checkout@v2 + + - name: Setup Python + uses: actions/setup-python@v3 + with: + python-version: '3.10' + cache: 'pip' + + - name: Install Python modules + run: pip install -r .github/workflows/requirements.txt + + - name: Setup Go + uses: actions/setup-go@v2 + with: + go-version: '1.17' + + - name: Create release + shell: python + run: | + import os + import re + import requests + import shutil + import subprocess + + # Get the context and secret data that we will need: + repository = "${{ github.repository }}" + reference = "${{ github.ref }}" + token = "${{ secrets.GITHUB_TOKEN }}" + + # Calculate the version number: + version = re.sub(r"^refs/tags/v(.*)$", r"\1", reference) + + # Make sure that the assets directory exists and is empty: + assets = "assets" + shutil.rmtree(assets, ignore_errors=True) + os.mkdir(assets) + + def build(goos: str, goarch: str): + # Set the environment variables that tell the Go compiler which + # operating system and architecture to build for: + env = dict(os.environ) + env["GOOS"] = goos + env["GOARCH"] = goarch + + # Build the binary: + args = ["make", "cmds"] + subprocess.run(check=True, env=env, args=args) + + # Copy the generated binary to the assets directory: + binary = "ocm-support" + if goos == "windows": + binary += ".exe" + asset = os.path.join(assets, f"ocm-support-{goos}-{goarch}") + os.rename(binary, asset) + + # Build for the supported operating systems and architectures: + build("darwin", "amd64") + build("linux", "amd64") + build("linux", "arm64") + build("linux", "ppc64le") + build("linux", "s390x") + build("windows", "amd64") + + # Calculate the SHA256 digests: + for asset in os.listdir(assets): + digest = os.path.join(assets, f"{asset}.sha256") + with open(digest, "wb") as stream: + args = ["sha256sum", asset] + subprocess.run(check=True, cwd=assets, stdout=stream, args=args) + + # Get the list of changes: + body = "" + with open("CHANGES.md", "r") as stream: + while True: + line = stream.readline() + if line == "" or line.startswith("## " + version): + break + while True: + line = stream.readline() + if line == "" or line.startswith("## "): + break + body += line + + # Send the request to create the release: + response = requests.post( + headers={ + "Authorization": f"Bearer {token}", + "Content-Type": "application/json", + "Accept": "application/json", + }, + json={ + "tag_name": f"v{version}", + "name": f"Release {version}", + "body": body, + }, + url=( + "https://api.github.com" + f"/repos/{repository}/releases" + ), + ) + response.raise_for_status() + + # Get the release identifier: + release = response.json()["id"] + + # Upload the assets: + for asset in os.listdir(assets): + file = os.path.join(assets, asset) + with open(file, "rb") as stream: + response = requests.post( + headers={ + "Authorization": f"Bearer {token}", + "Content-Type": "application/octet-stream", + "Accept": "application/json", + }, + data=stream, + url=( + "https://uploads.github.com" + f"/repos/{repository}/releases/{release}/assets?name={asset}" + ), + ) + response.raise_for_status() \ No newline at end of file diff --git a/.github/workflows/requirements.txt b/.github/workflows/requirements.txt new file mode 100644 index 0000000..cc2ed18 --- /dev/null +++ b/.github/workflows/requirements.txt @@ -0,0 +1,3 @@ +# This file lists the Python dependencies used by the GitHub actions. + +requests \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 699742b..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/rosa-support.iml b/.idea/rosa-support.iml deleted file mode 100644 index 5e764c4..0000000 --- a/.idea/rosa-support.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/CHANGES.md b/CHANGES.md new file mode 100644 index 0000000..7c56492 --- /dev/null +++ b/CHANGES.md @@ -0,0 +1,5 @@ +## Changes +This document describes the relevant changes between releases of the CLI + +## 0.0.1 +- Add version command \ No newline at end of file diff --git a/README.md b/README.md index 281e5f5..74838bd 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,36 @@ # ROSA Support `rosa-support` is a tool designed to be a plugin to the [ROSA CLI](https://github.com/openshift/rosa) by adding useful commands for engineers to support and develop the CLI +## Build +To build the binary run +``` +$ make build +``` +To install the binary run onto your `$GOPATH` +``` +$ make install +``` + +## Releases a new CLI Version +Releasing a new version requires submitting an MR for review/merge with an update to Version constant in [version.go](pkg/version/version.go). +Additionally. update the [CHANGES.md](CHANGES.md) file to include the new version and describe all changes included + +Below is an example CHANGES.md update: +``` +## 0.0.1 + +- Added an awesome change +``` + +Submit an MR for review/merge with the CHANGES.md and version.go update. + +Finally, create and submit a new tag with the new version following the below example: + +```shell +git checkout main +git pull +git tag -a -m 'Release 0.0.1' v0.0.1 +git push origin v0.0.1 +``` + +Note that a repository administrator may need to push the tag to the repository due to access restrictions. \ No newline at end of file diff --git a/pkg/version/version.go b/pkg/version/version.go index 2d56d86..b9067b4 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -1,5 +1,5 @@ package version -const Version = "0.0.0" +const Version = "0.0.1" var VersionStamp string