chore(workflows): update asset generation
This commit is contained in:
parent
6d4c7c35fa
commit
9e5616df60
2 changed files with 371 additions and 13 deletions
356
.github/scripts/semver2.sh
vendored
Executable file
356
.github/scripts/semver2.sh
vendored
Executable file
|
@ -0,0 +1,356 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# POSIX SH portable semver 2.0 comparison tool.
|
||||||
|
|
||||||
|
# This bash script compares pre-releases alphabetically as well (number < lowerCaseLetter < upperCaseLetter)
|
||||||
|
#
|
||||||
|
# returns 1 when A greater than B
|
||||||
|
# returns 0 when A equals B
|
||||||
|
# returns -1 when A lower than B
|
||||||
|
#
|
||||||
|
# Usage
|
||||||
|
# chmod +x semver2.sh
|
||||||
|
# ./semver2.sh 1.0.0-rc.0.a+metadata v1.0.0-rc.0+metadata
|
||||||
|
# --> 1
|
||||||
|
#
|
||||||
|
|
||||||
|
# This software was built with the help of the following sources:
|
||||||
|
# https://stackoverflow.com/a/58067270
|
||||||
|
# https://www.unix.com/man-page/posix/1posix/cut/
|
||||||
|
# https://stackoverflow.com/questions/51052475/how-to-iterate-over-the-characters-of-a-string-in-a-posix-shell-script
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
debug() {
|
||||||
|
if [ "$debug" = "debug" ]; then printf "DEBUG: %s$1 \n"; fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# params char
|
||||||
|
# returns Integer
|
||||||
|
ord() {
|
||||||
|
printf '%d' "'$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
isNumber() {
|
||||||
|
string=$1
|
||||||
|
char=""
|
||||||
|
while true; do
|
||||||
|
substract="${string#?}" # All but the first character of the string
|
||||||
|
char="${string%"$substract"}" # Remove $rest, and you're left with the first character
|
||||||
|
string="$substract"
|
||||||
|
# no more chars to compare then success
|
||||||
|
if [ -z "$char" ]; then
|
||||||
|
printf "true"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
# break if some of the chars is not a number
|
||||||
|
if [ "$(ord "$char")" -lt 48 ] || [ "$(ord "$char")" -gt 57 ]; then
|
||||||
|
printf "false"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# params string {String}, Index {Number}
|
||||||
|
# returns char
|
||||||
|
getChar() {
|
||||||
|
string=$1
|
||||||
|
index=$2
|
||||||
|
cursor=-1
|
||||||
|
char=""
|
||||||
|
while [ "$cursor" != "$index" ]; do
|
||||||
|
substract="${string#?}" # All but the first character of the string
|
||||||
|
char="${string%"$substract"}" # Remove $rest, and you're left with the first character
|
||||||
|
string="$substract"
|
||||||
|
cursor=$((cursor + 1))
|
||||||
|
done
|
||||||
|
printf "%s$char"
|
||||||
|
}
|
||||||
|
|
||||||
|
outcome() {
|
||||||
|
result=$1
|
||||||
|
printf "%s$result\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
compareNumber() {
|
||||||
|
if [ -z "$1" ] && [ -z "$2" ]; then
|
||||||
|
printf "%s" "0"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ $(($2 - $1)) -gt 0 ] && printf "%s" "-1"
|
||||||
|
[ $(($2 - $1)) -lt 0 ] && printf "1"
|
||||||
|
[ $(($2 - $1)) = 0 ] && printf "0"
|
||||||
|
}
|
||||||
|
|
||||||
|
compareString() {
|
||||||
|
result=false
|
||||||
|
index=0
|
||||||
|
while true
|
||||||
|
do
|
||||||
|
a=$(getChar "$1" $index)
|
||||||
|
b=$(getChar "$2" $index)
|
||||||
|
|
||||||
|
if [ -z "$a" ] && [ -z "$b" ]
|
||||||
|
then
|
||||||
|
printf "0"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
ord_a=$(ord "$a")
|
||||||
|
ord_b=$(ord "$b")
|
||||||
|
|
||||||
|
if [ "$(compareNumber "$ord_a" "$ord_b")" != "0" ]; then
|
||||||
|
printf "%s" "$(compareNumber "$ord_a" "$ord_b")"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
index=$((index + 1))
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
includesString() {
|
||||||
|
string="$1"
|
||||||
|
substring="$2"
|
||||||
|
if [ "${string#*"$substring"}" != "$string" ]
|
||||||
|
then
|
||||||
|
printf "1"
|
||||||
|
return 1 # $substring is in $string
|
||||||
|
fi
|
||||||
|
printf "0"
|
||||||
|
return 0 # $substring is not in $string
|
||||||
|
}
|
||||||
|
|
||||||
|
removeLeadingV() {
|
||||||
|
printf "%s${1#v}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# https://github.com/Ariel-Rodriguez/sh-semversion-2/pull/2
|
||||||
|
# Spec #2 https://semver.org/#spec-item-2
|
||||||
|
# MUST NOT contain leading zeroes
|
||||||
|
normalizeZero() {
|
||||||
|
next=$(printf %s "${1#0}")
|
||||||
|
if [ -z "$next" ]; then
|
||||||
|
printf %s "$1"
|
||||||
|
fi
|
||||||
|
printf %s "$next"
|
||||||
|
}
|
||||||
|
|
||||||
|
semver_compare() {
|
||||||
|
firstParam=$1 #1.2.4-alpha.beta+METADATA
|
||||||
|
secondParam=$2 #1.2.4-alpha.beta.2+METADATA
|
||||||
|
debug=${3:-1}
|
||||||
|
verbose=${4:-1}
|
||||||
|
|
||||||
|
[ "$verbose" = "verbose" ] && set -x
|
||||||
|
|
||||||
|
version_a=$(printf %s "$firstParam" | cut -d'+' -f 1)
|
||||||
|
version_a=$(removeLeadingV "$version_a")
|
||||||
|
version_b=$(printf %s "$secondParam" | cut -d'+' -f 1)
|
||||||
|
version_b=$(removeLeadingV "$version_b")
|
||||||
|
|
||||||
|
a_major=$(printf %s "$version_a" | cut -d'.' -f 1)
|
||||||
|
a_minor=$(printf %s "$version_a" | cut -d'.' -f 2)
|
||||||
|
a_patch=$(printf %s "$version_a" | cut -d'.' -f 3 | cut -d'-' -f 1)
|
||||||
|
a_pre=""
|
||||||
|
if [ "$(includesString "$version_a" -)" = 1 ]; then
|
||||||
|
a_pre=$(printf %s"${version_a#"$a_major.$a_minor.$a_patch-"}")
|
||||||
|
fi
|
||||||
|
|
||||||
|
b_major=$(printf %s "$version_b" | cut -d'.' -f 1)
|
||||||
|
b_minor=$(printf %s "$version_b" | cut -d'.' -f 2)
|
||||||
|
b_patch=$(printf %s "$version_b" | cut -d'.' -f 3 | cut -d'-' -f 1)
|
||||||
|
b_pre=""
|
||||||
|
if [ "$(includesString "$version_b" -)" = 1 ]; then
|
||||||
|
b_pre=$(printf %s"${version_b#"$b_major.$b_minor.$b_patch-"}")
|
||||||
|
fi
|
||||||
|
|
||||||
|
a_major=$(normalizeZero "$a_major")
|
||||||
|
a_minor=$(normalizeZero "$a_minor")
|
||||||
|
a_patch=$(normalizeZero "$a_patch")
|
||||||
|
b_major=$(normalizeZero "$b_major")
|
||||||
|
b_minor=$(normalizeZero "$b_minor")
|
||||||
|
b_patch=$(normalizeZero "$b_patch")
|
||||||
|
|
||||||
|
unit_types="MAJOR MINOR PATCH"
|
||||||
|
a_normalized="$a_major $a_minor $a_patch"
|
||||||
|
b_normalized="$b_major $b_minor $b_patch"
|
||||||
|
|
||||||
|
debug "Detected: $a_major $a_minor $a_patch identifiers: $a_pre"
|
||||||
|
debug "Detected: $b_major $b_minor $b_patch identifiers: $b_pre"
|
||||||
|
|
||||||
|
#####
|
||||||
|
#
|
||||||
|
# Find difference between Major Minor or Patch
|
||||||
|
#
|
||||||
|
|
||||||
|
cursor=1
|
||||||
|
while [ "$cursor" -lt 4 ]
|
||||||
|
do
|
||||||
|
a=$(printf %s "$a_normalized" | cut -d' ' -f $cursor)
|
||||||
|
b=$(printf %s "$b_normalized" | cut -d' ' -f $cursor)
|
||||||
|
if [ "$a" != "$b" ]
|
||||||
|
then
|
||||||
|
debug "$(printf %s "$unit_types" | cut -d' ' -f $cursor) is different"
|
||||||
|
outcome "$(compareNumber "$a" "$b")"
|
||||||
|
return
|
||||||
|
fi;
|
||||||
|
debug "$(printf "%s" "$unit_types" | cut -d' ' -f $cursor) are equal"
|
||||||
|
cursor=$((cursor + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
#####
|
||||||
|
#
|
||||||
|
# Find difference between pre release identifiers
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ -z "$a_pre" ] && [ -z "$b_pre" ]; then
|
||||||
|
debug "Because both are equals"
|
||||||
|
outcome "0"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Spec 11.3 a pre-release version has lower precedence than a normal version:
|
||||||
|
# 1.0.0 < 1.0.0-alpha
|
||||||
|
if [ -z "$a_pre" ]; then
|
||||||
|
debug "Because A is the stable release. Pre-release version has lower precedence than a released version"
|
||||||
|
outcome "1"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
# 1.0.0-alpha < 1.0.0
|
||||||
|
if [ -z "$b_pre" ]; then
|
||||||
|
debug "Because B is the stable release. Pre-release version has lower precedence than a released version"
|
||||||
|
outcome "-1"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
isSingleIdentifier() {
|
||||||
|
substract="${2#?}"
|
||||||
|
if [ "${1%"$2"}" = "" ]; then
|
||||||
|
printf "true"
|
||||||
|
return 1;
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
cursor=1
|
||||||
|
while [ $cursor -lt 5 ]
|
||||||
|
do
|
||||||
|
a=$(printf %s "$a_pre" | cut -d'.' -f $cursor)
|
||||||
|
b=$(printf %s "$b_pre" | cut -d'.' -f $cursor)
|
||||||
|
|
||||||
|
debug "Comparing identifier $a with $b"
|
||||||
|
|
||||||
|
# Exit when there is nothing else to compare.
|
||||||
|
# Most likely because they are equals
|
||||||
|
if [ -z "$a" ] && [ -z "$b" ]
|
||||||
|
then
|
||||||
|
debug "are equals"
|
||||||
|
outcome "0"
|
||||||
|
return
|
||||||
|
fi;
|
||||||
|
|
||||||
|
# Spec #11 https://semver.org/#spec-item-11
|
||||||
|
# Precedence for two pre-release versions with the same major, minor, and patch version
|
||||||
|
# MUST be determined by comparing each dot separated identifier from left to right until a difference is found
|
||||||
|
|
||||||
|
# Spec 11.4.4: A larger set of pre-release fields has a higher precedence than a smaller set, if all of the preceding identifiers are equal.
|
||||||
|
|
||||||
|
if [ -n "$a" ] && [ -z "$b" ]; then
|
||||||
|
# When A is larger than B and preidentifiers are 1+n
|
||||||
|
# 1.0.0-alpha.beta.1 1.0.0-alpha.beta
|
||||||
|
# 1.0.0-alpha.beta.1.2 1.0.0-alpha.beta.1
|
||||||
|
debug "Because A has larger set of pre-identifiers"
|
||||||
|
outcome "1"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# When A is shorter than B and preidentifiers are 1+n
|
||||||
|
# 1.0.0-alpha.beta 1.0.0-alpha.beta.d
|
||||||
|
# 1.0.0-alpha.beta 1.0.0-alpha.beta.1.2
|
||||||
|
if [ -z "$a" ] && [ -n "$b" ]; then
|
||||||
|
debug "Because B has larger set of pre-identifiers"
|
||||||
|
outcome "-1"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Spec #11.4.1
|
||||||
|
# Identifiers consisting of only digits are compared numerically.
|
||||||
|
if [ "$(isNumber "$a")" = "true" ] || [ "$(isNumber "$b")" = "true" ]; then
|
||||||
|
|
||||||
|
# if both identifiers are numbers, then compare and proceed
|
||||||
|
# 1.0.0-beta.3 1.0.0-beta.2
|
||||||
|
if [ "$(isNumber "$a")" = "true" ] && [ "$(isNumber "$b")" = "true" ]; then
|
||||||
|
if [ "$(compareNumber "$a" "$b")" != "0" ]; then
|
||||||
|
debug "Number is not equal $(compareNumber "$a" "$b")"
|
||||||
|
outcome "$(compareNumber "$a" "$b")"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Spec 11.4.3
|
||||||
|
# 1.0.0-alpha.1 1.0.0-alpha.beta.d
|
||||||
|
# 1.0.0-beta.3 1.0.0-1.2
|
||||||
|
if [ "$(isNumber "$a")" = "false" ]; then
|
||||||
|
debug "Because Numeric identifiers always have lower precedence than non-numeric identifiers."
|
||||||
|
outcome "1"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
# 1.0.0-alpha.d 1.0.0-alpha.beta.1
|
||||||
|
# 1.0.0-1.1 1.0.0-beta.1.2
|
||||||
|
if [ "$(isNumber "$b")" = "false" ]; then
|
||||||
|
debug "Because Numeric identifiers always have lower precedence than non-numeric identifiers."
|
||||||
|
outcome "-1"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Spec 11.4.2
|
||||||
|
# Identifiers with letters or hyphens are compared lexically in ASCII sort order.
|
||||||
|
# 1.0.0-alpha 1.0.0-beta.alpha
|
||||||
|
if [ "$(compareString "$a" "$b")" != "0" ]; then
|
||||||
|
debug "cardinal is not equal $(compareString a b)"
|
||||||
|
outcome "$(compareString "$a" "$b")"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Edge case when there is single identifier exaple: x.y.z-beta
|
||||||
|
if [ "$cursor" = 1 ]; then
|
||||||
|
|
||||||
|
# When both versions are single return equals
|
||||||
|
# 1.0.0-alpha 1.0.0-alpha
|
||||||
|
if [ -n "$(isSingleIdentifier "$b_pre" "$b")" ] && [ -n "$(isSingleIdentifier "$a_pre" "$a")" ]; then
|
||||||
|
debug "Because both have single identifier"
|
||||||
|
outcome "0"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Return greater when has more identifiers
|
||||||
|
# Spec 11.4.4: A larger set of pre-release fields has a higher precedence than a smaller set, if all of the preceding identifiers are equal.
|
||||||
|
|
||||||
|
# When A is larger than B
|
||||||
|
# 1.0.0-alpha.beta 1.0.0-alpha
|
||||||
|
if [ -n "$(isSingleIdentifier "$b_pre" "$b")" ] && [ -z "$(isSingleIdentifier "$a_pre" "$a")" ]; then
|
||||||
|
debug "Because of single identifier, A has more pre-identifiers"
|
||||||
|
outcome "1"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# When A is shorter than B
|
||||||
|
# 1.0.0-alpha 1.0.0-alpha.beta
|
||||||
|
if [ -z "$(isSingleIdentifier "$b_pre" "$b")" ] && [ -n "$(isSingleIdentifier "$a_pre" "$a")" ]; then
|
||||||
|
debug "Because of single identifier, B has more pre-identifiers"
|
||||||
|
outcome "-1"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Proceed to the next identifier because previous comparition was equal.
|
||||||
|
cursor=$((cursor + 1))
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
printf "%s$(semver_compare "$@")\n"
|
|
@ -27,6 +27,11 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Fetch Talos release version
|
- name: Fetch Talos release version
|
||||||
id: talos-release
|
id: talos-release
|
||||||
run: |
|
run: |
|
||||||
|
@ -37,14 +42,7 @@ jobs:
|
||||||
fi
|
fi
|
||||||
echo "talos_release_tag=$talos_release_tag" >> $GITHUB_OUTPUT
|
echo "talos_release_tag=$talos_release_tag" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Fetch Talos release body
|
- name: Fetch latest Boot Assets release version
|
||||||
id: talos-release-body
|
|
||||||
run: |
|
|
||||||
echo 'talos_release_body<<EOF' >> $GITHUB_OUTPUT
|
|
||||||
curl -sL https://api.github.com/repos/siderolabs/talos/releases/tags/${{ steps.talos-release.outputs.talos_release_tag }} | jq -r ".body" >> $GITHUB_OUTPUT
|
|
||||||
echo EOF >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Fetch latest Boot Asset release version
|
|
||||||
id: boot-asset-release
|
id: boot-asset-release
|
||||||
run: |
|
run: |
|
||||||
boot_assets_release_tag=$(curl -sL https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r ".tag_name")
|
boot_assets_release_tag=$(curl -sL https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r ".tag_name")
|
||||||
|
@ -54,9 +52,7 @@ jobs:
|
||||||
if: steps.talos-release.outputs.talos_release_tag != steps.boot-asset-release.outputs.boot_assets_release_tag
|
if: steps.talos-release.outputs.talos_release_tag != steps.boot-asset-release.outputs.boot_assets_release_tag
|
||||||
id: compare-releases
|
id: compare-releases
|
||||||
run: |
|
run: |
|
||||||
curl https://raw.githubusercontent.com/Ariel-Rodriguez/sh-semversion-2/main/semver2.sh -o /tmp/semver2.sh
|
compare_result=$(./.github/scripts/semver2.sh \
|
||||||
chmod +x /tmp/semver2.sh
|
|
||||||
compare_result=$(/tmp/semver2.sh \
|
|
||||||
${{ steps.talos-release.outputs.talos_release_tag }} \
|
${{ steps.talos-release.outputs.talos_release_tag }} \
|
||||||
${{ steps.boot-asset-release.outputs.boot_assets_release_tag }})
|
${{ steps.boot-asset-release.outputs.boot_assets_release_tag }})
|
||||||
echo "compare_result=$compare_result" >> $GITHUB_OUTPUT
|
echo "compare_result=$compare_result" >> $GITHUB_OUTPUT
|
||||||
|
@ -64,7 +60,6 @@ jobs:
|
||||||
outputs:
|
outputs:
|
||||||
newTalosReleaseFound: ${{ steps.compare-releases.outputs.compare_result }}
|
newTalosReleaseFound: ${{ steps.compare-releases.outputs.compare_result }}
|
||||||
talosReleaseTag: ${{ steps.talos-release.outputs.talos_release_tag }}
|
talosReleaseTag: ${{ steps.talos-release.outputs.talos_release_tag }}
|
||||||
talosReleaseBody: ${{ steps.talos-release-body.outputs.talos_release_body }}
|
|
||||||
|
|
||||||
build-kernel:
|
build-kernel:
|
||||||
needs: [ check-releases ]
|
needs: [ check-releases ]
|
||||||
|
@ -265,8 +260,15 @@ jobs:
|
||||||
contents: write
|
contents: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
- name: Fetch Talos release body
|
||||||
|
id: talos-release-body
|
||||||
|
run: |
|
||||||
|
echo 'talos_release_body<<EOF' >> $GITHUB_OUTPUT
|
||||||
|
curl -sL https://api.github.com/repos/siderolabs/talos/releases/tags/${{ needs.check-releases.outputs.talosReleaseTag }} | jq -r ".body" >> $GITHUB_OUTPUT
|
||||||
|
echo EOF >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Create a new release
|
- name: Create a new release
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
with:
|
with:
|
||||||
tag_name: ${{ needs.check-releases.outputs.talosReleaseTag }}
|
tag_name: ${{ needs.check-releases.outputs.talosReleaseTag }}
|
||||||
body: ${{ needs.check-releases.outputs.talosReleaseBody }}
|
body: ${{ steps.talos-release-body.outputs.talos_release_body }}
|
Loading…
Reference in a new issue