Skip to content

Commit

Permalink
chore(build): add new matrix workflow (mainsail-crew#253)
Browse files Browse the repository at this point in the history
* chore(build): add new matrix workflow

This adds a new behavior of buildcheck and release workflow.
The previous generated array for the matrix step,
will now be generated from `setup_matrix.py`, this script
reads `.github/workflow_config.yml` and generates the array
according to it's setup.

This allows an easy to maintain entrypoint to choose which
SBC will be build on test builds and releases.

It also includes version bump from `action/checkout@v3` to
`action/checkout@v4`

Signed-off-by: Stephan Wendel <[email protected]>

---------

Signed-off-by: Stephan Wendel <[email protected]>
  • Loading branch information
KwadFan authored and miklschmidt committed Feb 25, 2024
1 parent 9251a94 commit 0f4c4e5
Show file tree
Hide file tree
Showing 4 changed files with 151 additions and 10 deletions.
94 changes: 94 additions & 0 deletions .github/scripts/setup_matrix.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
#!/usr/bin/env python3
# Generate matrix string from workflow_config.yml
####
# Written by Stephan Wendel aka KwadFan <[email protected]>
# Copyright 2023 - till today
# https://github.com/mainsail-crew/MainsailOS
####
# This File is distributed under GPLv3
####

import os
import sys
import yaml

from pathlib import Path
from argparse import ArgumentParser, RawTextHelpFormatter


def main():
# Parse args
parser = ArgumentParser(
description='Returns list for setup matrix',
formatter_class=RawTextHelpFormatter)
parser.add_argument('-c', '--config',
help='Specify the /path/to/configuration/file',
required=True)
parser.add_argument('-g', '--group',
help='Specify group in your configuration file.\
\nFor example \'-g buildtest\'',
required=True)
parser.add_argument('--git',
action='store_true',
help='Push output to git environment variables')
args = parser.parse_args()
# Split Namespaces
config_file, setup_group = args.config, args.group
if args.git:
try:
with open(config_file, 'r') as config:
data = yaml.safe_load(config)
# Check if group is present
if not setup_group in data:
with open(os.environ['GITHUB_STEP_SUMMARY'], 'a') as gitsum:
gitsum_header_msg(gitsum)
gitsum_err_msg(
f"The given group '{setup_group}' doesn't exist!",
gitsum)
sys.exit(1)
else:
with open(os.environ['GITHUB_OUTPUT'], 'a') as gitout:
print(f'matrix={data[setup_group]}', file=gitout)
with open(os.environ['GITHUB_STEP_SUMMARY'], 'a') as gitsum:
gitsum_header_msg(gitsum)
print(f'## Build images for these SBC\'s:', file=gitsum)
for sbc in data[setup_group]:
print(f"- {sbc}", file=gitsum)
except Exception as e:
with open(os.environ['GITHUB_STEP_SUMMARY'], 'a') as gitsum:
gitsum_err_msg(e, gitsum)
sys.exit(1)
else:
try:
# Checks if file exists, else raises error.
with open(config_file, 'r') as config:
data = yaml.safe_load(config)
# Check if group is present
if not setup_group in data:
raise Exception(
f"The given group '{setup_group}' doesn't exist!"
)
else:
print(data[setup_group])
except Exception as e:
err_msg(e)
sys.exit(1)


def err_msg(err):
name = Path(__file__).stem
print(f'{name}: OOOPS, something went wrong!\n{err}')


def gitsum_header_msg(env_var):
print(f'# Setup Matrix:', file=env_var)


def gitsum_err_msg(err, env_var):
gitsum_header_msg(env_var)
print(f'## Error:\n{err}')


# MAIN
if __name__ == "__main__":
main()
39 changes: 39 additions & 0 deletions .github/workflow_config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#### Configure workflow matrix
####
#### Written by Stephan Wendel aka KwadFan <[email protected]>
#### Copyright 2023 - till today
#### https://github.com/mainsail-crew/MainsailOS
####
#### This File is distributed under GPLv3
####

#### NOTE: Use entries according to their directory/file structure in 'config'
#### e.g. raspberry/rpi32 armbian/orangepi3lts ...

# Use this categorie to configure behaviour on pushes/pull requests against
# develop branch
# Each entry will be used in setup matrix

buildtest:
# armbian based images
- armbian/bananapim2zero
- armbian/orangepi3lts
- armbian/orangepi4lts
# Orange Pi OS based images
- orangepi/orangepi_zero2
# Raspberry Pi OS based images
- raspberry/rpi32
- raspberry/rpi64

# This is used to setup release build chain.
# Each entry will be used in setup matrix for releases

release:
# armbian based images
- armbian/orangepi3lts
- armbian/orangepi4lts
# Orange Pi OS based images
- orangepi/orangepi_zero2
# Raspberry Pi OS based images
- raspberry/rpi32
- raspberry/rpi64
12 changes: 9 additions & 3 deletions .github/workflows/BuildImages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ on:
- "src/build_dist"
- "config/**"
- ".github/workflows/BuildImages.yml"
- ".github/workflow_config.yml"
- ".github/scripts/setup_matrix.py"
tags-ignore:
- "**"
pull_request:
Expand All @@ -16,6 +18,8 @@ on:
- "src/**"
- "config/**"
- ".github/workflows/BuildImages.yml"
- ".github/scripts/setup_matrix.py"
- ".github/workflow_config.yml"

workflow_dispatch:

Expand All @@ -31,13 +35,15 @@ jobs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Create Matrix
id: set-matrix
run: |
ARRAY=$(find ${{ github.workspace }}/config -type f -printf '%P\n' | sed '/default/d' | sort | jq -R -s -c 'split("\n")[:-1]')
echo "matrix=${ARRAY}" >> $GITHUB_OUTPUT
PY_INT=$(command -v python3)
CONFIG="${{ github.workspace }}/.github/workflow_config.yml"
GROUP="buildtest"
$PY_INT ${{ github.workspace }}/.github/scripts/setup_matrix.py -c $CONFIG -g $GROUP --git
build:
needs: setup
Expand Down
16 changes: 9 additions & 7 deletions .github/workflows/Release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Clone develop repository
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
ref: "v2.x"
token: ${{ secrets.PAT }}
ref: "develop"

- name: Get current version
id: current-version
Expand Down Expand Up @@ -50,7 +50,7 @@ jobs:
date: ${{ steps.base-name.outputs.date }}
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
ref: "v2.x"
fetch-depth: 0
Expand Down Expand Up @@ -94,15 +94,17 @@ jobs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
ref: v2.x

- name: Create Matrix
id: set-matrix
run: |
ARRAY=$(find ${{ github.workspace }}/config -type f -printf '%P\n' | sed '/default/d' | sort | jq -R -s -c 'split("\n")[:-1]')
echo "matrix=${ARRAY}" >> $GITHUB_OUTPUT
PY_INT=$(command -v python3)
CONFIG="${{ github.workspace }}/.github/workflow_config.yml"
GROUP="release"
$PY_INT ${{ github.workspace }}/.github/scripts/setup_matrix.py -c $CONFIG -g $GROUP --git
build:
needs: [release, matrix]
Expand Down

0 comments on commit 0f4c4e5

Please sign in to comment.