Skip to content

Commit

Permalink
Merge pull request #135 from marcransome/release-workflow
Browse files Browse the repository at this point in the history
Refactor release workflow
  • Loading branch information
marcransome authored Mar 24, 2024
2 parents 6ec82ae + b0b31b0 commit 0569e2c
Show file tree
Hide file tree
Showing 9 changed files with 129 additions and 157 deletions.
108 changes: 52 additions & 56 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,96 +13,92 @@ jobs:
os: [macos-13, macos-14]
runs-on: ${{ matrix.os }}
outputs:
hash-darwin-x86_64: ${{ steps.hash.outputs.hash-darwin-x86_64 }}
hash-darwin-arm64: ${{ steps.hash.outputs.hash-darwin-arm64 }}
checksum-darwin-x86_64: ${{ steps.hash.outputs.checksum-darwin-x86_64 }}
checksum-darwin-arm64: ${{ steps.hash.outputs.checksum-darwin-arm64 }}
archive-darwin-x86_64: ${{ steps.archive.outputs.archive-darwin-x86_64 }}
archive-darwin-arm64: ${{ steps.archive.outputs.archive-darwin-arm64 }}
artifact-filename-darwin-arm64: ${{ steps.artifact.outputs.artifact-filename-darwin-arm64 }}
artifact-filename-darwin-x86_64: ${{ steps.artifact.outputs.artifact-filename-darwin-x86_64 }}
sha256-checksum-darwin-arm64: ${{ steps.checksum.outputs.sha256-checksum-darwin-arm64 }}
sha256-checksum-darwin-x86_64: ${{ steps.checksum.outputs.sha256-checksum-darwin-x86_64 }}
sha256-filename-darwin-arm64: ${{ steps.checksum.outputs.sha256-filename-darwin-arm64 }}
sha256-filename-darwin-x86_64: ${{ steps.checksum.outputs.sha256-filename-darwin-x86_64 }}
steps:
- name: Checkout repository
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
- name: Install dependencies
- name: Install build dependencies
run: brew install popt
- name: Install build tools
run: brew install just
- id: arch
name: Get machine hardware name
run: |
set -euo pipefail
arch=$(uname -m)
if [[ "${arch}" != "x86_64" && "${arch}" != "arm64" ]]; then
echo "Unexpected machine hardware name: ${arch}"
exit 1
fi
echo "name=${arch}" >> "$GITHUB_OUTPUT"
echo "name=${arch}" >> "${GITHUB_OUTPUT}"
- id: artifact
name: Generate build artifact
env:
ARCHITECTURE: ${{ steps.arch.outputs.name }}
run: |
cmake -S . -B build
cmake --build build
output_dir="build/src"
artifact="flog"
if [[ ! -f "${output_dir}/${artifact}" ]]; then
echo "Failed to generate build artifact: ${output_dir}/${artifact}"
exit 1
set -euo pipefail
just package "${GITHUB_REF_NAME}"
artifact="flog-${GITHUB_REF_NAME}-darwin-${ARCHITECTURE}.tar.xz"
if [[ ! -f "${artifact}" ]]; then
echo "Failed to generated expected build artifact: ${artifact}"
fi
echo "dir=${output_dir}" >> "$GITHUB_OUTPUT"
echo "name=${artifact}" >> "$GITHUB_OUTPUT"
- id: archive
name: Compress build artifact
run: |
archive="flog-${GITHUB_REF_NAME}-darwin-${{ steps.arch.outputs.name }}.tar.xz"
tar -cvJf "${archive}" -C "${{ steps.artifact.outputs.dir }}" "${{ steps.artifact.outputs.name }}"
echo "name=${archive}" >> "$GITHUB_OUTPUT"
echo "archive-darwin-${{ steps.arch.outputs.name }}=${archive}" >> "$GITHUB_OUTPUT"
- id: hash
name: Generate build artifact hash
echo "name=${artifact}" >> "${GITHUB_OUTPUT}"
echo "artifact-filename-darwin-${{ steps.arch.outputs.name }}=${archive}" >> "${GITHUB_OUTPUT}"
- id: checksum
name: Generate build artifact SHA-256 checksum file
env:
ARCHITECTURE: ${{ steps.arch.outputs.name }}
ARTIFACT_NAME: ${{ steps.artifact.outputs.name }}
run: |
set -o pipefail
shasum -a 256 "${{ steps.archive.outputs.name }}" > "${{ steps.archive.outputs.name }}.sha256"
b64_hash=$(cat "${{ steps.archive.outputs.name }}.sha256" | base64)
echo "hash-darwin-${{ steps.arch.outputs.name }}=${b64_hash}" >> "$GITHUB_OUTPUT"
echo "checksum-darwin-${{ steps.arch.outputs.name }}=${{ steps.archive.outputs.name }}.sha256" >> "$GITHUB_OUTPUT"
set -euo pipefail
shasum -a 256 "${ARTIFACT_NAME}" > "${ARTIFACT_NAME}.sha256"
echo "sha256-checksum-darwin-${ARCHITECTURE}=$(cat "${ARTIFACT_NAME}.sha256" | base64)" >> "${GITHUB_OUTPUT}"
echo "sha256-filename-darwin-${ARCHITECTURE}=${ARTIFACT_NAME}.sha256" >> "${GITHUB_OUTPUT}"
- name: Upload build artifact
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
with:
name: ${{ steps.archive.outputs.name }}
path: ${{ steps.archive.outputs.name }}
name: ${{ steps.artifact.outputs.name }}
path: ${{ steps.artifact.outputs.name }}
if-no-files-found: error
retention-days: 7
- name: Upload SHA-256 checksum file
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
with:
name: ${{ steps.archive.outputs.name }}.sha256
path: ${{ steps.archive.outputs.name }}.sha256
name: ${{ steps.artifact.outputs.name }}.sha256
path: ${{ steps.artifact.outputs.name }}.sha256
if-no-files-found: error
retention-days: 7
combine-hashes:
combine-checksums:
needs: [build]
runs-on: ubuntu-latest
outputs:
hashes: ${{ steps.hashes.outputs.hashes }}
checksums: ${{ steps.checksums.outputs.combined }}
env:
HASHES: ${{ toJSON(needs.build.outputs) }}
CHECKSUMS: ${{ toJSON(needs.build.outputs) }}
steps:
- id: hashes
- id: checksums
run: |
echo "$HASHES" | jq -r 'with_entries(select(.key | match("hash-.*-.*")))[] | @base64d' | sed "/^$/d" > hashes.txt
echo "hashes=$(cat hashes.txt | base64 -w0)" >> "$GITHUB_OUTPUT"
set -euo pipefail
echo "${CHECKSUMS}" | jq -r 'with_entries(select(.key | match("sha256-checksum-.*-.*")))[] | @base64d' | sed "/^$/d" > checksums.txt
echo "combined=$(cat checksums.txt | base64 -w0)" >> "${GITHUB_OUTPUT}"
provenance:
needs: [build, combine-hashes]
needs: [build, combine-checksums]
permissions:
actions: read
id-token: write
contents: write
uses: slsa-framework/slsa-github-generator/.github/workflows/[email protected] # Must specify version tag; see https://github.com/slsa-framework/slsa-verifier/issues/12
with:
base64-subjects: ${{ needs.combine-hashes.outputs.hashes }}
provenance-name: flog.multiple.intoto.jsonl
base64-subjects: ${{ needs.combine-checksums.outputs.checksums }}
provenance-name: flog-${{ github.ref_name }}.intoto.jsonl
upload-assets: ${{ startsWith(github.ref, 'refs/tags/v') }}
release:
needs: [build, combine-hashes, provenance]
needs: [build, combine-checksums, provenance]
permissions:
contents: write
runs-on: ubuntu-latest
Expand All @@ -111,24 +107,24 @@ jobs:
- name: Download x86_64 build artifact
uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
with:
name: ${{ needs.build.outputs.archive-darwin-x86_64 }}
name: ${{ needs.build.outputs.artifact-filename-darwin-x86_64 }}
- name: Download x86_64 SHA-256 checksum file
uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
with:
name: ${{ needs.build.outputs.checksum-darwin-x86_64 }}
name: ${{ needs.build.outputs.sha256-filename-darwin-x86_64 }}
- name: Download arm64 build artifact
uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
with:
name: ${{ needs.build.outputs.archive-darwin-arm64 }}
name: ${{ needs.build.outputs.artifact-filename-darwin-arm64 }}
- name: Download arm64 SHA-256 checksum file
uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
with:
name: ${{ needs.build.outputs.checksum-darwin-arm64 }}
name: ${{ needs.build.outputs.sha256-filename-darwin-arm64 }}
- name: Upload release assets
uses: softprops/action-gh-release@9d7c94cfd0a1f3ed45544c887983e9fa900f0564 # v2.0.4
with:
files: |
${{ needs.build.outputs.archive-darwin-x86_64 }}
${{ needs.build.outputs.checksum-darwin-x86_64 }}
${{ needs.build.outputs.archive-darwin-arm64 }}
${{ needs.build.outputs.checksum-darwin-arm64 }}
${{ needs.build.outputs.artifact-filename-darwin-x86_64 }}
${{ needs.build.outputs.sha256-filename-darwin-x86_64 }}
${{ needs.build.outputs.artifact-filename-darwin-arm64 }}
${{ needs.build.outputs.sha256-filename-darwin-arm64 }}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
build/
codeql-database/
codeql-analysis.sarif
man/flog.1
8 changes: 3 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,9 @@ set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
find_package(PkgConfig REQUIRED)
pkg_check_modules(POPT REQUIRED popt>=1.19)

if (NOT UNIT_TESTING)
message(STATUS "Building program target")
add_subdirectory(src)
else()
message(STATUS "Building unit test targets")
add_subdirectory(src bin)

if (UNIT_TESTING)
enable_testing()
add_subdirectory(test)
endif()
70 changes: 70 additions & 0 deletions Justfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
arch := `uname -m`
build_dir := "build"
debug_dir := build_dir / "debug"
release_dir := build_dir / "release"
debug_target := debug_dir / "bin" / "flog"
release_target := release_dir / "bin" / "flog"
man_dir := "man"
man_source := man_dir / "flog.1.md"
man_target := man_dir / "flog.1"

# generate build artifacts and run unit tests
@all: build test

# generate debug build
@build:
#!/usr/bin/env bash
set -euo pipefail
if [[ ! -d "{{debug_dir}}" ]]; then
cmake -S . -B "{{debug_dir}}" -DCMAKE_BUILD_TYPE=Debug -DUNIT_TESTING=on
fi
cmake --build "{{debug_dir}}"
# generate release build
@build-release:
#!/usr/bin/env bash
set -euo pipefail
if [[ ! -d "{{release_dir}}" ]]; then
cmake -S . -B "{{release_dir}}" -DCMAKE_BUILD_TYPE=Release -DUNIT_TESTING=on
fi
cmake --build "{{release_dir}}"
# run debug build unit tests
@test: build
ctest -V --test-dir "{{debug_dir}}/test"

# run release build unit tests
@test-release: build-release
ctest -V --test-dir "{{release_dir}}/test"

# remove build directories and artifacts
@clean:
rm -rf "{{build_dir}}" "{{man_target}}" *.xz

# build the man page
@man:
pandoc --standalone -f markdown -t man "{{man_source}}" > "{{man_target}}"

# build and show the man page
@show-man: man
man "{{man_target}}"

# generate release package
@package version: build-release test-release man
#!/bin/bash
set -euo pipefail
echo "Packaging with version number: {{version}} for architecture: {{arch}}"

tmp_dir=$(mktemp -d)
tar_dir="flog-{{version}}"
tar_file="flog-{{version}}-darwin-{{arch}}.tar.xz"

mkdir -p "${tmp_dir}/${tar_dir}/bin"
mkdir -p "${tmp_dir}/${tar_dir}/usr/share/man/man1"

cp "{{release_target}}" "${tmp_dir}/${tar_dir}/bin/"
cp "{{man_target}}" "${tmp_dir}/${tar_dir}/usr/share/man/man1/"

tar -C "${tmp_dir}" -cvJf "${tar_file}" "${tar_dir}"

echo "Generated release package: ${tar_file}"
87 changes: 0 additions & 87 deletions man/flog.1

This file was deleted.

4 changes: 2 additions & 2 deletions man/flog.md → man/flog.1.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
% flog(1) Version 1.4.0 | Flog User's Guide
% flog(1) Version v1.5.0 | Flog User's Guide

NAME
====

**flog** write log messages to the unified logging system
**flog** - write log messages to the unified logging system

SYNOPSIS
========
Expand Down
4 changes: 0 additions & 4 deletions man/gen-doc

This file was deleted.

2 changes: 1 addition & 1 deletion src/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
*/

#define PROGRAM_NAME "flog"
#define PROGRAM_VERSION "1.4.0"
#define PROGRAM_VERSION "v1.5.0"

/*! \brief An enumerated type representing error conditions. */
typedef enum FlogErrorData {
Expand Down
2 changes: 0 additions & 2 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
include(CTest)

pkg_check_modules(CMOCKA REQUIRED cmocka>=1.1.7)

include(add_cmocka_test)
Expand Down

0 comments on commit 0569e2c

Please sign in to comment.