Build Image #16
Workflow file for this run
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: Build Image | |
on: | |
workflow_dispatch: | |
inputs: | |
version: | |
description: 'Release version' | |
required: true | |
default: '23.05.3' | |
type: string | |
board: | |
description: 'Device board' | |
required: true | |
default: 'x86' | |
type: string | |
subtarget: | |
description: 'Device subtarget' | |
required: true | |
default: '64' | |
type: string | |
profile: | |
description: 'Device profile' | |
required: true | |
default: 'generic' | |
type: string | |
workflow_call: | |
inputs: | |
version: | |
required: true | |
type: string | |
board: | |
required: true | |
type: string | |
subtarget: | |
required: true | |
type: string | |
profile: | |
required: true | |
type: string | |
env: | |
DELETE_USELESS_FILES: false | |
jobs: | |
build_image: | |
name: build_image ${{ inputs.version }}-${{ inputs.board }}-${{ inputs.subtarget }}-${{ inputs.profile }} | |
runs-on: ubuntu-latest | |
env: | |
CONFBRANCH: 'conf' | |
TARGETBRANCH: ${{ inputs.version }}-${{ inputs.board }}-${{ inputs.subtarget }} | |
VERSION: ${{ inputs.version }} | |
BOARD: ${{ inputs.board }} | |
SUBTARGET: ${{ inputs.subtarget }} | |
PROFILE: ${{ inputs.profile }} | |
USIGN_ID: ${{ vars.USIGN_ID }} | |
USIGN_KEY: ${{ secrets[format('USIGN_{0}', vars.USIGN_ID )] }} | |
ROOTFS_SIZE: 256 | |
steps: | |
- name: Check if deployed | |
shell: bash | |
run: | | |
rcode=$(curl -sL -w '%{http_code}' -o /dev/null https://github.com/$GITHUB_REPOSITORY/tree/$TARGETBRANCH) | |
echo rcode: $rcode | |
[ "$rcode" != "404" ] || { >&2 echo Branch $TARGETBRANCH is not deployed, please build world first.; exit 1; } | |
- name: Import keys | |
env: | |
USIGN_PUBKEY_URL: 'https://github.com/${{ github.repository_owner }}/packages/raw/master/keys/usign/${{ env.USIGN_ID }}.pub' | |
shell: bash | |
run: | | |
# usign | |
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) | |
echo "USIGN_PUBKEY<<$EOF" >> $GITHUB_ENV | |
curl -sL "$USIGN_PUBKEY_URL" >> $GITHUB_ENV | |
echo "$EOF" >> $GITHUB_ENV | |
- name: Maximize build space | |
if: env.DELETE_USELESS_FILES == 'true' && !cancelled() | |
uses: easimon/maximize-build-space@master | |
with: | |
root-reserve-mb: 10240 | |
swap-size-mb: 8192 | |
remove-dotnet: 'true' | |
remove-android: 'true' | |
remove-haskell: 'true' | |
- name: Initialize Environment | |
shell: bash | |
run: | | |
sudo apt update | |
sudo apt -y install build-essential ccache clang curl flex bison g++ gawk \ | |
gcc-multilib g++-multilib genisoimage gettext git libdw-dev libelf-dev \ | |
libncurses5-dev libssl-dev locales pv pwgen python3 python3-pip \ | |
python3-setuptools qemu-utils rsync signify-openbsd subversion swig unzip \ | |
zlib1g-dev file wget zstd | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ env.TARGETBRANCH }} | |
- name: Setup Image Builder | |
id: setup | |
shell: bash | |
run: | | |
tar -xf targets/$BOARD/$SUBTARGET/*-imagebuilder-*.* | |
mv *-imagebuilder-* imagebuilder | |
pushd imagebuilder | |
# | |
eval "$(grep CONFIG_TARGET_ARCH_PACKAGES .config)" | |
ARCH_PACKAGES=$CONFIG_TARGET_ARCH_PACKAGES | |
echo "ARCH_PACKAGES=$ARCH_PACKAGES" >> $GITHUB_ENV | |
# key-build | |
echo "$USIGN_KEY" > key-build | |
echo "$USIGN_PUBKEY" > key-build.pub | |
echo "$USIGN_PUBKEY" > keys/${USIGN_ID,,} | |
# core feed | |
sed -i "/src\/gz openwrt_core /{ \ | |
s|https://downloads.openwrt.org/releases/$VERSION|file://$GITHUB_WORKSPACE| \ | |
}" repositories.conf | |
# fantastic feeds | |
n=$[ $(sed -n '/This is the local package repository/=' repositories.conf) -1 ] | |
sed -i "${n}i\ | |
src/gz fantastic_packages_packages https://github.com/$GITHUB_REPOSITORY_OWNER/packages/raw/gh-pages/releases/${VERSION%.*}/packages/$ARCH_PACKAGES/packages\n\ | |
src/gz fantastic_packages_luci https://github.com/$GITHUB_REPOSITORY_OWNER/packages/raw/gh-pages/releases/${VERSION%.*}/packages/$ARCH_PACKAGES/luci" \ | |
repositories.conf | |
# ROOTFS_SIZE | |
sed -i "s|\(\bCONFIG_TARGET_ROOTFS_PARTSIZE\)=.*|\1=$ROOTFS_SIZE|" .config | |
# | |
popd | |
- name: Determine packages be installed | |
shell: bash | |
run: | | |
INSTALLS='' | |
url="https://github.com/$GITHUB_REPOSITORY/raw/$CONFBRANCH/$VERSION/$BOARD/$SUBTARGET/preinstalled \ | |
https://github.com/$GITHUB_REPOSITORY_OWNER/packages/raw/master/.github/workflows/prebuildpackages/generic \ | |
https://github.com/$GITHUB_REPOSITORY_OWNER/packages/raw/master/.github/workflows/prebuildpackages/$ARCH_PACKAGES" | |
for l in $url; do | |
if [ "$(curl -sL -w '%{http_code}' "$l" -o preinstalled)" != "404" ]; then | |
INSTALLS=${INSTALLS:+$INSTALLS }$(cat preinstalled 2>/dev/null | tr '\n' ' ') | |
else | |
>&2 echo URL: $l is not found. | |
fi | |
done | |
echo "Installing $INSTALLS" | |
echo "INSTALLS=$INSTALLS" >> $GITHUB_ENV | |
- name: Build image | |
id: build_image | |
if: ${{ steps.setup.outcome == 'success' }} | |
shell: bash | |
run: | | |
group() { | |
endgroup | |
echo "::group:: $1" | |
GROUP=1 | |
} | |
endgroup() { | |
if [ -n "$GROUP" ]; then | |
echo "::endgroup::" | |
fi | |
GROUP= | |
} | |
trap 'endgroup' ERR | |
sudo chown -R $USER:$GROUPS imagebuilder | |
pushd imagebuilder | |
group "ls -R keys/" | |
ls -R keys/ | |
endgroup | |
# | |
group "repositories.conf" | |
cat repositories.conf | |
endgroup | |
# | |
group "make image" | |
make image \ | |
PROFILE="$PROFILE" \ | |
DISABLED_SERVICES="$DISABLED_SERVICES" \ | |
ADD_LOCAL_KEY="$ADD_LOCAL_KEY" \ | |
PACKAGES="$INSTALLS" | |
endgroup | |
# | |
popd | |
- name: Upload artifact (All) | |
if: ${{ steps.build_image.outcome == 'success' }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: target-${{ env.VERSION }}-${{ env.BOARD }}-${{ env.SUBTARGET }}-${{ inputs.profile }}-all | |
path: | | |
imagebuilder/bin/targets/${{ env.BOARD }}/${{ env.SUBTARGET }}/ |