Skip to content

Commit

Permalink
Rewrite publish release action in Python
Browse files Browse the repository at this point in the history
This patch rewrites the publish release action in Python, so that it
will be easier to improve it in the future.

Signed-off-by: Juan Hernandez <[email protected]>
  • Loading branch information
jhernand committed Dec 3, 2021
1 parent f038533 commit bda59ca
Show file tree
Hide file tree
Showing 3 changed files with 125 additions and 63 deletions.
164 changes: 101 additions & 63 deletions .github/workflows/publish-release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,80 +30,118 @@ jobs:
- name: Checkout the source
uses: actions/checkout@v2

- name: Setup Python
uses: actions/setup-python@v2
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.16
go-version: '1.16'

- name: Build binaries
- name: Create release
shell: python
run: |
# Create the directory for the assets that will be part of the release:
mkdir assets
# This function builds for the operating system and architecture passed
# as parameters.
function build {
# Get the parameters:
local os="$1"
local arch="$2"
# Set the environment variables that tell the Go compiler which
# operating system and architecture to build for:
export GOOS="${os}"
export GOARCH="${arch}"
# Build the binary:
echo "Building binary for OS '${os}' and architecture '${arch}'"
make cmds
# Copy the generated binary to the assets directory and calculate
# the digest:
cp "metamodel" "assets/metamodel-${os}-${arch}"
sha256sum "metamodel" > "assets/metamodel-${os}-${arch}.sha256"
}
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 = os.path.join(assets, f"metamodel-{goos}-{goarch}")
os.rename("metamodel", binary)
# Build for the supported operating systems and architectures:
build darwin amd64
build linux amd64
build windows amd64
build("darwin", "amd64")
build("linux", "amd64")
build("windows", "amd64")
- name: Create release
run: |
# Get the version number:
version=$(echo -n ${{ github.ref }} | sed -E 's|^refs/tags/v(.*)$|\1|')
# 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:
cat > request.json <<.
{
"tag_name": "v${version}",
"name": "Release ${version}",
"body": "See the CHANGES.md file for details."
}
.
curl \
--silent \
--request "POST" \
--header "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--url "https://api.github.com/repos/${{ github.repository }}/releases" \
--data-binary @request.json \
--output response.json \
--fail
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:
id=$(cat response.json | jq -r ".id")
release = response.json()["id"]
# Upload the assets:
for file in $(ls assets); do
curl \
--silent \
--request "POST" \
--header "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
--header "Content-Type: application/octect-stream" \
--header "Accept: application/json" \
--url "https://uploads.github.com/repos/${{ github.repository }}/releases/${id}/assets?name=${file}" \
--data-binary "@assets/${file}" \
--output response.json \
--fail
done
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()
19 changes: 19 additions & 0 deletions .github/workflows/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#
# Copyright (c) 2021 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# This file lists the Python dependencies used by the GitHub actions.

requests
5 changes: 5 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
This document describes the relevant changes between releases of the
API metamodel.

## 3.6 Dec 3 2021

- Check loops in locator paths.
- Add `Empty` method to builders.

## 0.0.44 Nov 22 2021

- Check loops in locator paths.
Expand Down

0 comments on commit bda59ca

Please sign in to comment.