Build immortalwrt Firmware 23.05 #4
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
# | |
# Copyright (c) 2022-2023 Curious <https://www.curious.host> | |
# | |
# This is free software, licensed under the MIT License. | |
# See /LICENSE for more information. | |
# | |
# https://github.com/Curious-r/OpenWrtBuildWorkflows | |
# Description: Automatically check OpenWrt source code update and build it. No additional keys are | |
# required. | |
# | |
# Some features come from https://github.com/P3TERX/Actions-OpenWrt, visit the repository to get its | |
# copyright information. | |
#------------------------------------------------------------------------------------------------------- | |
# Workflow name which is showed in GitHub Actions. | |
name: Build immortalwrt Firmware 23.05 | |
on: | |
workflow_dispatch: | |
inputs: | |
force-build: | |
description: "Build new firmware anyway" | |
required: false | |
default: "true" | |
ssh: | |
description: "SSH connection to Actions" | |
required: false | |
default: "false" | |
# Uncomment the following to run regularly. Note that the cron expression here does not contain seconds. | |
# schedule: | |
# - cron: 0 */18 * * * | |
env: | |
# REPO means the OpenWrt repo you want to build from in this workflow. | |
# You can modify the REPO_NAME to any name you want, but remember not to let it have the same name in | |
# other workflows. | |
REPO_NAME: ImmortalWrt | |
REPO_URL: https://github.com/immortalwrt/immortalwrt.git | |
REPO_BRANCH: master | |
BUILD_DEPENDS: "ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \ | |
bzip2 ccache clang cmake cpio curl device-tree-compiler ecj fastjar flex gawk gettext gcc-multilib \ | |
g++-multilib git gnutls-dev gperf haveged help2man intltool lib32gcc-s1 libc6-dev-i386 libelf-dev \ | |
libglib2.0-dev libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5 \ | |
libncursesw5-dev libpython3-dev libreadline-dev libssl-dev libtool lld llvm lrzsz mkisofs msmtp \ | |
nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip python3-ply \ | |
python3-docutils python3-pyelftools qemu-utils re2c rsync scons squashfs-tools subversion swig \ | |
texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev zstd jq" | |
# CONFIG_FILE is the name of your own config files for compiling, you should upload these files into the root | |
# directory of your workflow repo. | |
CONFIG_FILE: ./build/immortalwrt/.config | |
# CUSTOM_SCRIPT_1 is the name of extra bash script you want to execute before feeds update&install. | |
# CUSTOM_SCRIPT_2 is the name of extra bash script you want to execute after feeds update&install. | |
# You can modify the initial settings of your firmware through these two scripts. If this is what you need, | |
# please upload your scripts to the root directory of your workflow repo. | |
CUSTOM_SCRIPT_1: ./build/immortalwrt/before.sh | |
CUSTOM_SCRIPT_2: ./build/immortalwrt/after22.04.sh | |
# STORE_PRODUCTS determine whether to upload all compilation products to workflow artifacts. | |
# Not only firmwires, all compiled packages will be here, including compiled but not solidified into firmware. | |
STORE_PRODUCTS: false | |
# STORE_FIRMWARE determine whether to upload firmwares to workflow artifacts. | |
STORE_FIRMWARE: true | |
# The following are options of where the firmware needs to be transfered. | |
COWTRANSFER_FIRMWARE: false | |
WETRANSFER_FIRMWARE: false | |
RELEASE_FIRMWARE: false | |
# Change the following to your time zone. | |
TIME_ZONE: Asia/Shanghai | |
jobs: | |
check: | |
name: Check for source code updates | |
runs-on: ubuntu-latest | |
outputs: | |
cache-hit: ${{ steps.cache-hash.outputs.cache-hit }} | |
steps: | |
- name: Get Commit Hash | |
id: get-hash | |
run: | | |
git clone -b openwrt-23.05 --depth 1 --branch $REPO_BRANCH --single-branch $REPO_URL ./ | |
echo "commit-hash=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT | |
- name: Compare Commit Hash | |
id: cache-hash | |
uses: actions/cache@main | |
with: | |
path: .${{ env.REPO_NAME }}-${{ env.REPO_BRANCH }}-commit-hash | |
key: HEAD-${{ steps.get-hash.outputs.commit-hash }} | |
- name: Save New Commit Hash | |
if: steps.cache-hash.outputs.cache-hit != 'true' | |
run: | | |
echo ${{ steps.get-hash.outputs.commit-hash }} | | |
tee .$REPO_NAME-$REPO_BRANCH-commit-hash | |
build: | |
name: Build firmware | |
runs-on: ubuntu-latest | |
needs: check | |
permissions: | |
contents: write | |
if: needs.check.outputs.cache-hit != 'true' || github.event.inputs.force-build == 'true' | |
steps: | |
- name: Checkout | |
uses: actions/checkout@main | |
- name: Free disk space | |
uses: jlumbroso/free-disk-space@main | |
with: | |
tool-cache: false | |
android: true | |
dotnet: true | |
haskell: true | |
large-packages: true | |
docker-images: true | |
swap-storage: false | |
- name: Initialization environment | |
env: | |
DEBIAN_FRONTEND: noninteractive | |
run: | | |
sudo rm -rf /etc/apt/sources.list.d/* | |
sudo -E apt-get -qq update | |
sudo -E apt-get -qq install $BUILD_DEPENDS | |
sudo -E apt-get -qq autoremove --purge | |
sudo -E apt-get -qq clean | |
sudo timedatectl set-timezone $TIME_ZONE | |
sudo mkdir -p /workdir/ | |
sudo chown $USER:$GROUPS /workdir/ | |
- name: Clone source code | |
working-directory: /workdir | |
run: | | |
df -hT $PWD | |
git clone --depth 1 --branch $REPO_BRANCH --single-branch $REPO_URL openwrt/ | |
ln -sf /workdir/openwrt $GITHUB_WORKSPACE/openwrt | |
- name: Run custom-script-1 | |
run: | | |
chmod +x $CUSTOM_SCRIPT_1 | |
cd openwrt/ | |
$GITHUB_WORKSPACE/$CUSTOM_SCRIPT_1 | |
- name: Update feeds | |
run: cd openwrt/ && ./scripts/feeds update -a | |
- name: Install feeds | |
run: cd openwrt/ && ./scripts/feeds install -a | |
- name: Load custom configuration | |
run: | | |
[ -e files ] && mv files/ openwrt/files/ | |
[ -e $CONFIG_FILE ] && mv $CONFIG_FILE openwrt/.config | |
- name: Run custom-script-2 | |
run: | | |
chmod +x $CUSTOM_SCRIPT_2 | |
cd openwrt/ | |
$GITHUB_WORKSPACE/$CUSTOM_SCRIPT_2 | |
- name: SSH connection to Actions | |
uses: P3TERX/ssh2actions@main | |
if: github.event.inputs.ssh == 'true' || contains(github.event.action, 'ssh') | |
env: | |
TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} | |
TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} | |
- name: Download packages | |
id: download-packages | |
run: | | |
cd openwrt/ | |
make defconfig | |
make download -j8 | |
find dl -size -1024c -exec ls -l {} \; | |
find dl -size -1024c -exec rm -f {} \; | |
- name: Compile the firmware | |
id: compile | |
run: | | |
cd openwrt/ | |
echo -e "$(nproc) thread compile" | |
make -j$(nproc) || make -j1 || make -j1 V=s | |
echo "status=success" >> $GITHUB_OUTPUT | |
grep '^CONFIG_TARGET.*DEVICE.*=y' .config | sed -r 's/.*DEVICE_(.*)=y/\1/' > DEVICE_NAME | |
[ -s DEVICE_NAME ] && echo "DEVICE_NAME=_$(cat DEVICE_NAME)" >> $GITHUB_ENV | |
echo "FILE_DATE=_$(date +"%Y%m%d%H%M")" >> $GITHUB_ENV | |
- name: Check space usage | |
if: (!cancelled()) | |
run: df -hT | |
- name: Upload all compilation products | |
uses: actions/upload-artifact@main | |
if: steps.compile.outputs.status == 'success' && env.STORE_PRODUCTS == 'true' | |
with: | |
name: OpenWrt_bin${{ env.DEVICE_NAME }}${{ env.FILE_DATE }} | |
path: openwrt/bin/ | |
- name: Organize firmware-related files | |
id: organize-files | |
run: | | |
cd openwrt/bin/targets/*/* | |
rm -rf packages/ | |
rm -rf config.buildinfo feeds.buildinfo immortalwrt-x86-64-generic.manifest immortalwrt-x86-64-generic-kernel.bin | |
rm -rf profiles.json sha256sums version.buildinfo immortalwrt-x86-64-generic-squashfs-rootfs.img.gz | |
echo "FIRMWARE=$PWD" >> $GITHUB_ENV | |
echo "status=success" >> $GITHUB_OUTPUT | |
- name: Upload firmware directory | |
uses: actions/upload-artifact@main | |
if: steps.organize-files.outputs.status == 'success' && env.STORE_FIRMWARE == 'true' && !cancelled() | |
with: | |
name: OpenWrt_firmware${{ env.DEVICE_NAME }}${{ env.FILE_DATE }} | |
path: ${{ env.FIRMWARE }} | |
- name: Upload firmware to cowtransfer | |
id: cowtransfer | |
if: steps.organize-files.outputs.status == 'success' && env.COWTRANSFER_FIRMWARE == 'true' && !cancelled() | |
run: | | |
curl -fsSL git.io/file-transfer | sh | |
./transfer cow --block 2621440 -s -p 64 --no-progress ${FIRMWARE} 2>&1 | tee cowtransfer.log | |
echo "::notice file=cowtransfer.com::$(cat cowtransfer.log | grep https)" | |
echo "url=$(cat cowtransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT | |
- name: Upload firmware to WeTransfer | |
id: wetransfer | |
if: steps.organize-files.outputs.status == 'success' && env.WETRANSFER_FIRMWARE == 'true' && !cancelled() | |
run: | | |
curl -fsSL git.io/file-transfer | sh | |
./transfer wet -s -p 16 --no-progress ${FIRMWARE} 2>&1 | tee wetransfer.log | |
echo "::notice file=wetransfer.com::$(cat wetransfer.log | grep https)" | |
echo "url=$(cat wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT | |
- name: Generate release tag | |
id: tag | |
if: env.RELEASE_FIRMWARE == 'true' && !cancelled() | |
run: | | |
echo "release_tag=$(date +"%Y.%m.%d-%H%M")" >> $GITHUB_OUTPUT | |
touch release.txt | |
echo "Build from $REPO_URL $REPO_BRANCH" >> release.txt | |
[ $COWTRANSFER_FIRMWARE = true -o $WETRANSFER_FIRMWARE = true ] && echo 'Products transfer:' >> release.txt | |
[ $COWTRANSFER_FIRMWARE = true ] && echo \ | |
"🔗 [Cowtransfer](${{ steps.cowtransfer.outputs.url }})" >> release.txt | |
[ $WETRANSFER_FIRMWARE = true ] && echo \ | |
"🔗 [WeTransfer](${{ steps.wetransfer.outputs.url }})" >> release.txt | |
echo "status=success" >> $GITHUB_OUTPUT | |
- name: Upload firmware to release | |
uses: softprops/action-gh-release@master | |
if: steps.tag.outputs.status == 'success' && !cancelled() | |
with: | |
tag_name: ${{ steps.tag.outputs.release_tag }} | |
body_path: release.txt | |
files: ${{ env.FIRMWARE }}/* | |
clean: | |
name: Clean up old assets | |
runs-on: ubuntu-latest | |
permissions: | |
actions: write | |
contents: write | |
steps: | |
- name: Delete workflow runs | |
uses: Mattraks/delete-workflow-runs@main | |
with: | |
retain_days: 1 | |
keep_minimum_runs: 1 | |
- name: Remove old Releases | |
uses: dev-drprasad/delete-older-releases@master | |
if: env.RELEASE_FIRMWARE == 'true' && !cancelled() | |
with: | |
keep_latest: 3 | |
delete_tags: true | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |