u-boot-ingenic #674
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: u-boot-ingenic | |
on: | |
schedule: | |
# 00:15 PST / Nightly | |
- cron: '00 7 * * *' | |
workflow_dispatch: | |
inputs: | |
tg_disabled: | |
type: boolean | |
description: 'Disable Telegram notifications' | |
required: false | |
default: false | |
tg_scratch: | |
type: boolean | |
description: 'Use TG scratch channel' | |
required: false | |
default: false | |
t31x_only: | |
type: boolean | |
description: 'Only build T31X profile ' | |
required: false | |
default: false | |
debug_enabled: | |
type: boolean | |
description: 'Debug: Generate dummy image files' | |
required: false | |
default: false | |
env: | |
TAG_NAME: uboot-xb1 | |
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
TERM: linux | |
TG_TOKEN: ${{secrets.TELEGRAM_TOKEN_BOT_THINGINO}} | |
TG_CHANNEL: ${{secrets.TELEGRAM_CHANNEL_THINGINO_BUILD}} | |
TG_TOPIC: ${{secrets.TELEGRAM_TOPIC_THINGINO_BUILD}} | |
TG_CHANNEL_SCRATCH: ${{secrets.TELEGRAM_CHANNEL_THINGINO_SCRATCH}} | |
TZ: America/Los_Angeles | |
jobs: | |
notify-begin: | |
runs-on: ubuntu-24.04 | |
outputs: | |
start_time: ${{ steps.set_output.outputs.time }} | |
tg_disabled: ${{ steps.set_env.outputs.tg_disabled }} | |
steps: | |
- name: Set timezone | |
run: | | |
sudo timedatectl set-timezone ${{ env.TZ }} | |
- name: Save workflow start time to ENV | |
id: set_output | |
run: echo "time=$(date +%s)" >> $GITHUB_OUTPUT | |
- name: Configure Environment Variables | |
run: | | |
echo "TG_DISABLED=${{ github.event.inputs.tg_disabled || 'false' }}" >> $GITHUB_ENV | |
echo "tg_disabled=${{ github.event.inputs.tg_disabled || 'false' }}" >> $GITHUB_OUTPUT | |
TAG_NAME="$TAG_NAME-$(date +'%Y-%m-%d')" | |
echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
ref: "master" | |
fetch-depth: "1" | |
- name: Create release tag | |
continue-on-error: true | |
run: | | |
TAG_NAME="${{ env.TAG_NAME }}" | |
if ! gh api repos/${{ github.repository }}/git/ref/tags/$TAG_NAME &>/dev/null; then | |
git tag "$TAG_NAME" | |
git push origin "$TAG_NAME" | |
else | |
echo "Tag $TAG_NAME already exists." | |
fi | |
- name: Create release | |
continue-on-error: true | |
run: | | |
TAG_NAME="${{ env.TAG_NAME }}" | |
if ! gh release view "$TAG_NAME" --repo "${{ github.repository }}" &>/dev/null; then | |
echo "Release $TAG_NAME does not exist. Creating pre-release." | |
gh release create "$TAG_NAME" --repo "${{ github.repository }}" --title "$TAG_NAME" --notes "pre-release: \`\`\`$TAG_NAME\`\`\` is currently being built, please wait..." --prerelease | |
else | |
echo "Release $TAG_NAME already exists." | |
fi | |
- name: Download TG-Notify script | |
run: | | |
curl -o .github/scripts/tg-notify.sh https://raw.githubusercontent.com/themactep/thingino-firmware/master/.github/scripts/tg-notify.sh | |
chmod +x .github/scripts/tg-notify.sh | |
- name: Send build start notifcation via Telegram | |
if: env.TG_DISABLED == 'false' | |
run: | | |
if [[ "${{ github.event.inputs.tg_scratch }}" == 'true' ]]; then | |
TG_CHANNEL=${{ env.TG_CHANNEL_SCRATCH }} | |
export TG_TOPIC="" | |
fi | |
.github/scripts/tg-notify.sh -s $TG_TOKEN $TG_CHANNEL $TG_TOPIC start ${{ github.workflow }} ${{ github.run_id }} ${{ github.repository }} | |
generate-matrix: | |
runs-on: ubuntu-24.04 | |
outputs: | |
matrix: ${{ steps.set-matrix.outputs.matrix }} | |
steps: | |
- name: Set timezone | |
run: | | |
sudo timedatectl set-timezone ${{ env.TZ }} | |
- name: Configure GH workspace | |
run: git config --global --add safe.directory "$GITHUB_WORKSPACE" | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
ref: "master" | |
fetch-depth: "1" | |
- name: Generate device matrix | |
id: set-matrix | |
run: | | |
if [[ "${{ github.event.inputs.t31x_only }}" == 'true' ]]; then | |
CONFIGS=$(cat boards.cfg | grep isvp | awk '{print $1}' | grep isvp_t31_sfcnor_ddr128M) | |
else | |
CONFIGS=$(cat boards.cfg | grep isvp | awk '{print $1}' | grep -v -e nand) | |
fi | |
JSON_MATRIX="{\"u-boot-version\": [" | |
for CONFIG in $CONFIGS; do | |
JSON_MATRIX+="\"${CONFIG}\"," | |
done | |
JSON_MATRIX="${JSON_MATRIX%,}]}" | |
echo "Matrix: $JSON_MATRIX" | |
echo "matrix=$JSON_MATRIX" >> $GITHUB_OUTPUT | |
build: | |
name: ${{ matrix.u-boot-version }} | |
needs: [generate-matrix, notify-begin] | |
runs-on: ubuntu-24.04 | |
outputs: | |
# Feed the hash of the commit we are building into the notify-completion release-notes step | |
GIT_HASH: ${{ steps.env.outputs.git_hash }} | |
TAG_NAME: ${{ steps.env.outputs.tag_name }} | |
defaults: | |
run: | |
shell: bash | |
container: | |
image: debian:bookworm | |
strategy: | |
fail-fast: false | |
matrix: ${{fromJson(needs.generate-matrix.outputs.matrix)}} | |
steps: | |
- name: Install GitHub CLI to container | |
run: | | |
apt-get update | |
apt-get install -y curl | |
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg | |
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null | |
- name: Update package manager sources | |
run: | | |
apt-get update | |
- name: Install build dependencies | |
run: | | |
apt-get install -y --no-install-recommends --no-install-suggests 7zip build-essential bc ccache cpio curl ca-certificates file git gh jq make gawk lzop procps rsync tzdata u-boot-tools unzip wget | |
- name: Set timezone | |
run: | | |
ln -sf /usr/share/zoneinfo/${{ env.TZ }} /etc/localtime | |
echo ${{ env.TZ }} > /etc/timezone | |
DEBIAN_FRONTEND=noninteractive dpkg-reconfigure -f noninteractive tzdata | |
- name: Setup gh workspace to container | |
run: git config --global --add safe.directory "$GITHUB_WORKSPACE" | |
- name: Checkout repository source | |
uses: actions/checkout@v4 | |
with: | |
ref: "master" | |
fetch-depth: "1" | |
- name: Configure environment variables | |
id: env | |
run: | | |
echo "WEEK_NUMBER=$(date +%U)" >> $GITHUB_ENV | |
echo "CURRENT_YEAR=$(date +%Y)" >> $GITHUB_ENV | |
echo "GIT_HASH=$(git rev-parse --short ${GITHUB_SHA})" >> $GITHUB_ENV | |
echo "GIT_BRANCH=${GITHUB_REF_NAME}" >> $GITHUB_ENV | |
echo "TG_DISABLED=${{ github.event.inputs.tg_disabled || 'false' }}" >> $GITHUB_ENV | |
TAG_NAME="$TAG_NAME-$(date +'%Y-%m-%d')" | |
echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV | |
echo "GIT_HASH=$(git rev-parse --short ${GITHUB_SHA})" >> $GITHUB_OUTPUT | |
echo "TAG_NAME=${TAG_NAME}" >> $GITHUB_OUTPUT | |
- name: Download TG-Notify script | |
run: | | |
curl -o .github/scripts/tg-notify.sh https://raw.githubusercontent.com/themactep/thingino-firmware/master/.github/scripts/tg-notify.sh | |
chmod +x .github/scripts/tg-notify.sh | |
- name: Setup cache directories | |
run: | | |
mkdir -p ~/.ccache | |
- name: Restore build cache | |
uses: actions/cache@v4 | |
if: always() | |
with: | |
path: ~/.ccache | |
key: ${{ runner.os }}-ccache-${{ github.sha }} | |
restore-keys: | | |
${{ runner.os }}-ccache-$- | |
- name: Download toolchain | |
run: | | |
wget https://github.com/themactep/thingino-firmware/releases/download/toolchain/thingino-toolchain_xburst1_musl_gcc14-linux-mipsel.tar.gz -O ~/thingino-toolchain_xburst1_musl_gcc14-linux-mipsel.tar.gz | |
tar -xf ~/thingino-toolchain_xburst1_musl_gcc14-linux-mipsel.tar.gz -C ~/ | |
- name: u-boot-ingenic Build | |
if: ${{ github.event.inputs.debug_enabled != 'true' }} | |
shell: bash | |
run: | | |
CROSS_COMPILE=~/mipsel-thingino-linux-musl_sdk-buildroot/bin/mipsel-linux- bash build.sh ${{ matrix.u-boot-version }} | |
TIME=$(date -d @${SECONDS} +%M:%S) | |
echo "TIME=${TIME}" >> ${GITHUB_ENV} | |
- name: Generate debug dummy uboot for workflow testing | |
if: ${{ github.event.inputs.debug_enabled == 'true' }} | |
run: | | |
mkdir -p ./uboot_build | |
echo "debug" > ./uboot_build/u-boot-${{ matrix.u-boot-version }}.bin | |
echo "TIME=7:77" >> ${GITHUB_ENV} | |
- name: Check if compiled u-boot exists | |
run: | | |
FILE=./uboot_build/u-boot-${{ matrix.u-boot-version }}.bin | |
if [ ! -f "$FILE" ]; then | |
echo "File not found exit" | |
exit 1 | |
fi | |
echo "Found file: $FILE" | |
echo "UBOOTFW=$FILE" >> $GITHUB_ENV | |
- name: Generate checksum file | |
run: | | |
sha256sum "${{ env.UBOOTFW }}" | awk -v filename="$(basename "${{ env.UBOOTFW }}")" '{print $1, filename}' > ./uboot_build/u-boot-${{ matrix.u-boot-version }}.bin.sha256sum | |
echo "UBOOTFW_SHA=./uboot_build/u-boot-${{ matrix.u-boot-version }}.bin.sha256sum" >> $GITHUB_ENV | |
- name: Upload firmware as artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: u-boot-${{ matrix.u-boot-version }}.bin | |
path: | | |
${{ env.UBOOTFW }} | |
${{ env.UBOOTFW_SHA }} | |
- name: Upload ${{ matrix.u-boot-version }} to release | |
uses: softprops/action-gh-release@v2.1.0 | |
with: | |
tag_name: ${{ env.TAG_NAME }} | |
make_latest: false | |
prerelease: true | |
files: | | |
${{ env.UBOOTFW }} | |
${{ env.UBOOTFW_SHA }} | |
- name: Package binaries for notify | |
run: | | |
7zz a -t7z -mx=9 -mmt=on /tmp/u-boot-${{ matrix.u-boot-version }}.7z ${{ env.UBOOTFW }} ${{ env.UBOOTFW_SHA }} | |
- name: Send uboot completion notifications with attachment | |
if: ${{ env.TG_DISABLED == 'false' && (env.UBOOTFW) }} | |
run: | | |
if [[ "${{ github.event.inputs.tg_scratch }}" == 'true' ]]; then | |
TG_CHANNEL=${{ env.TG_CHANNEL_SCRATCH }} | |
export TG_TOPIC="" | |
fi | |
if [ -n "${{ env.UBOOTFW }}" ]; then | |
.github/scripts/tg-notify.sh -s $TG_TOKEN $TG_CHANNEL $TG_TOPIC completed $TAG_NAME ${{ github.run_id }} ${{ github.repository }} ${GIT_HASH} ${GIT_BRANCH} ${TAG_NAME} ${TIME} ${{ matrix.u-boot-version }} /tmp/u-boot-${{ matrix.u-boot-version }}.7z | |
fi | |
- name: Send error notification | |
if: ${{ env.TG_DISABLED == 'false' && failure() }} | |
run: | | |
if [[ "${{ github.event.inputs.tg_scratch }}" == 'true' ]]; then | |
TG_CHANNEL=${{ env.TG_CHANNEL_SCRATCH }} | |
export TG_TOPIC="" | |
fi | |
.github/scripts/tg-notify.sh -s $TG_TOKEN $TG_CHANNEL $TG_TOPIC error $TAG_NAME ${{ github.run_id }} ${{ github.repository }} | |
notify-completion: | |
needs: [build, notify-begin] | |
runs-on: ubuntu-24.04 | |
if: always() | |
steps: | |
- name: Set timezone | |
run: | | |
sudo timedatectl set-timezone ${{ env.TZ }} | |
- name: Configure Environment | |
run: | | |
echo "TG_DISABLED=${{ github.event.inputs.tg_disabled || 'false' }}" >> $GITHUB_ENV | |
echo "GIT_HASH=${{ needs.build.outputs.git_hash }}" >> $GITHUB_ENV | |
echo "TAG_NAME=${{ needs.build.outputs.tag_name }}" >> $GITHUB_ENV | |
- name: Checkout repository source | |
uses: actions/checkout@v4 | |
with: | |
submodules: 'false' | |
ref: "master" | |
- name: Download TG-Notify script | |
run: | | |
curl -o .github/scripts/tg-notify.sh https://raw.githubusercontent.com/themactep/thingino-firmware/master/.github/scripts/tg-notify.sh | |
chmod +x .github/scripts/tg-notify.sh | |
- name: Generate release notes | |
id: release_notes | |
run: | | |
LAST_RELEASE_TAG=$(gh release list --limit 2 --json tagName -q '.[1].tagName') | |
if [ -z "$LAST_RELEASE_TAG" ]; then | |
echo "No previous release found. Skipping release notes generation." | |
echo "RELEASE_NOTES_FILE=$(pwd)/release_notes.md" >> $GITHUB_ENV | |
exit 0 | |
else | |
echo "Latest release so far is $LAST_RELEASE_TAG" | |
fi | |
COMMITS=$(gh api \ | |
-H "Accept: application/vnd.github.v3+json" \ | |
/repos/${{ github.repository }}/compare/$LAST_RELEASE_TAG...$GIT_HASH \ | |
-q '.commits | sort_by(.commit.author.date) | reverse | .[] | "\(.sha[0:7]) \(.commit.message | gsub("\n"; " "))"') | |
RELEASE_NOTES="### Changes in this release:\n" | |
while IFS= read -r commit; do | |
if [ -n "$commit" ]; then | |
RELEASE_NOTES="${RELEASE_NOTES}- ${commit}\n" | |
fi | |
done <<< "$COMMITS" | |
echo -e "$RELEASE_NOTES" > release_notes.md | |
echo "RELEASE_NOTES_FILE=$(pwd)/release_notes.md" >> $GITHUB_ENV | |
- name: Get release ID and Mark as Latest | |
run: | | |
echo "Environment variables:" | |
echo "TAG_NAME: ${{ env.TAG_NAME }}" | |
echo "Checking GH authentication status..." | |
gh auth status | |
echo "Attempting to fetch release URL for tag ${TAG_NAME}..." | |
RELEASE_URL=$(gh release view ${{ env.TAG_NAME }} --json url -q ".url") | |
echo "RELEASE_URL: $RELEASE_URL" | |
if [[ -n "$RELEASE_URL" ]]; then | |
echo "Release URL found, attempting to mark as latest..." | |
if [[ -f "${{ env.RELEASE_NOTES_FILE }}" ]]; then | |
echo "Release notes file exists, including --notes-file..." | |
gh release edit ${{ env.TAG_NAME }} --latest --prerelease=false --notes-file "${{ env.RELEASE_NOTES_FILE }}" | |
else | |
echo "Release notes file does not exist, skipping --notes-file..." | |
gh release edit ${{ env.TAG_NAME }} --latest --prerelease=false --notes "" | |
fi | |
echo "Release marked as latest" | |
else | |
echo "Release not found, skipping latest release update" | |
fi | |
- name: Send notify completion summary | |
if: ${{ env.TG_DISABLED == 'false' }} | |
run: | | |
if [[ "${{ github.event.inputs.tg_scratch }}" == 'true' ]]; then | |
TG_CHANNEL=${{ env.TG_CHANNEL_SCRATCH }} | |
export TG_TOPIC="" | |
fi | |
START_TIME=${{ needs.notify-begin.outputs.start_time }} | |
END_TIME=$(date -u +%s) | |
ELAPSED=$((END_TIME - START_TIME)) | |
ELAPSED_MIN=$((ELAPSED / 60)) | |
ELAPSED_SEC=$((ELAPSED % 60)) | |
.github/scripts/tg-notify.sh -s $TG_TOKEN $TG_CHANNEL $TG_TOPIC finish ${{ github.workflow }} "${ELAPSED_MIN}m ${ELAPSED_SEC}s" ${{ github.run_id }} ${{ github.repository }} |