Skip to content

u-boot-ingenic

u-boot-ingenic #674

Workflow file for this run

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 }}