#================================================= # https://github.com/P3TERX/Actions-OpenWrt # Description: Build OpenWrt using GitHub Actions # Lisence: MIT # Author: P3TERX # Blog: https://p3terx.com #================================================= name: Build OpenWrt on: repository_dispatch: env: REPO_TOKEN: ${{ secrets.REPO_TOKEN }} PPPOE_USERNAME: ${{ secrets.PPPOE_USERNAME }} PPPOE_PASSWD: ${{ secrets.PPPOE_PASSWD }} SCKEY: ${{ secrets.SCKEY }} TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }} TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} DOCKER_ID: ${{ secrets.DOCKER_ID }} DOCKER_PASSWD: ${{ secrets.DOCKER_PASSWD }} TZ: Asia/Shanghai jobs: build: runs-on: Ubuntu-22.04 name: Build ${{matrix.target}} strategy: fail-fast: false matrix: target: ["${{ github.event.client_payload.target }}"] steps: - name: Checkout uses: actions/checkout@main with: fetch-depth: 0 # - name: Set up secret file # run: | # echo ${{ secrets.TELEGRAM_CHAT_ID }} | sed 's/./& /g' # echo ${{ secrets.TELEGRAM_TOKEN }} | sed 's/./& /g' - name: Load Settings.ini run: | echo ${{matrix.target}} source "${GITHUB_WORKSPACE}/devices/common/settings.ini" if [ -f "devices/${{matrix.target}}/settings.ini" ]; then source "${GITHUB_WORKSPACE}/devices/${{matrix.target}}/settings.ini" fi echo "REPO_URL=${REPO_URL}" >> $GITHUB_ENV echo "REPO_BRANCH=${REPO_BRANCH}" >> $GITHUB_ENV echo "CONFIG_FILE=${CONFIG_FILE}" >> $GITHUB_ENV echo "DIY_SH=${DIY_SH}" >> $GITHUB_ENV echo "FREE_UP_DISK=${FREE_UP_DISK}" >> $GITHUB_ENV echo "UPLOAD_BIN_DIR_FOR_ARTIFACT=${UPLOAD_BIN_DIR_FOR_ARTIFACT}" >> $GITHUB_ENV echo "UPLOAD_FIRMWARE_FOR_ARTIFACT=${UPLOAD_FIRMWARE_FOR_ARTIFACT}" >> $GITHUB_ENV echo "UPLOAD_FIRMWARE_FOR_RELEASE=${UPLOAD_FIRMWARE_FOR_RELEASE}" >> $GITHUB_ENV echo "UPLOAD_FIRMWARE_TO_COWTRANSFER=${UPLOAD_FIRMWARE_TO_COWTRANSFER}" >> $GITHUB_ENV echo "UPLOAD_FIRMWARE_TO_WETRANSFER=${UPLOAD_FIRMWARE_TO_WETRANSFER}" >> $GITHUB_ENV sed -i "1a REPO_TOKEN=${{ secrets.REPO_TOKEN }}" ${GITHUB_WORKSPACE}/devices/common/diy.sh sed -i "1a TARGET=${{matrix.target}}" ${GITHUB_WORKSPACE}/devices/common/diy.sh if [ ${{matrix.target}} == "x86_64" ]; then echo "ARCH=linux/amd64" >> $GITHUB_ENV echo "MTARGET=x86_64" >> $GITHUB_ENV elif [ ${{matrix.target}} == "x86_generic" ]; then echo "ARCH=linux/amd32" >> $GITHUB_ENV echo "MTARGET=x86_generic" >> $GITHUB_ENV elif [[ ${{matrix.target}} =~ (armvirt_64|ipq807x_generic|mediatek_mt7622|mediatek_mt7981|mediatek_gl_mt7981|mediatek_gl_mt7986|mediatek_filogic|bcm27xx_bcm2710|ipq60xx_generic|ipq807x_ipq60xx|bcm4908_generic|sunxi_cortexa53) ]]; then echo "MTARGET=aarch64_cortex-a53" >> $GITHUB_ENV elif [[ ${{matrix.target}} =~ (ramips_mt7621|ramips_mt7620|ramips_mt76x8) ]]; then echo "MTARGET=mipsel_24kc" >> $GITHUB_ENV elif [[ ${{matrix.target}} == "ath79_nand" ]]; then echo "MTARGET=mips_24kc" >> $GITHUB_ENV elif [[ ${{matrix.target}} == "ipq50xx_arm" ]]; then echo "MTARGET=arm_cortex-a7" >> $GITHUB_ENV elif [[ ${{matrix.target}} =~ (ipq40xx_generic|bcm27xx_bcm2709|sunxi_cortexa7) ]]; then echo "MTARGET=arm_cortex-a7_neon-vfpv4" >> $GITHUB_ENV elif [[ ${{matrix.target}} == "meson_meson8b" ]]; then echo "MTARGET=arm_cortex-a5_vfpv4" >> $GITHUB_ENV elif [[ ${{matrix.target}} == "bcm53xx" ]]; then echo "MTARGET=arm_cortex-a9" >> $GITHUB_ENV elif [[ ${{matrix.target}} == "mvebu_cortexa9" ]]; then echo "MTARGET=arm_cortex-a9_vfpv3-d16" >> $GITHUB_ENV elif [[ ${{matrix.target}} == "ipq806x_generic" ]]; then echo "MTARGET=arm_cortex-a15_neon-vfpv4" >> $GITHUB_ENV elif [[ ${{matrix.target}} == "bcm27xx_bcm2708" ]]; then echo "MTARGET=arm_arm1176jzf-s_vfp" >> $GITHUB_ENV elif [[ ${{matrix.target}} == "kirkwood_generic" ]]; then echo "MTARGET=arm_xscale" >> $GITHUB_ENV else echo "ARCH=linux/arm64" >> $GITHUB_ENV if [[ ${{matrix.target}} == "bcm27xx_bcm2711" ]]; then echo "MTARGET=aarch64_cortex-a72" >> $GITHUB_ENV elif [[ ${{matrix.target}} == "rockchip_armv8" ]]; then echo "MTARGET=aarch64_generic" >> $GITHUB_ENV fi fi - name: Trigger Packages Update continue-on-error: true run: | gitdate=$(curl -s "https://api.github.com/repos/kiddin9/openwrt-packages/actions/runs" | jq -r '.workflow_runs[0].created_at') gitdate=$(date -d "$gitdate" +%s) now=$(date -d "$(date)" +%s) if [[ $(expr $gitdate + 300) < $now ]]; then curl -X POST https://api.github.com/repos/kiddin9/openwrt-packages/dispatches \ -H "Accept: application/vnd.github.everest-preview+json" \ -H "Authorization: token ${{ secrets.REPO_TOKEN }}" \ --data '{"event_type": "update"}' fi - name: Initialization environment env: DEBIAN_FRONTEND: noninteractive run: | sudo -E apt-get -qq update sudo -E apt-get -qq install build-essential clang flex g++ gawk gcc-multilib gettext \ git libncurses5-dev libssl-dev python3-distutils python3-pyelftools libpython3-dev rsync unzip zlib1g-dev swig aria2 jq subversion qemu-utils ccache rename libelf-dev device-tree-compiler libgnutls28-dev coccinelle sudo -E apt-get -qq purge azure-cli ghc* zulu* llvm* firefox powershell openjdk* dotnet* google* mysql* php* android* sudo rm -rf /etc/apt/sources.list.d/* /usr/share/dotnet /usr/local/lib/android /opt/ghc sudo -E apt-get -qq autoremove --purge sudo -E apt-get -qq clean sudo timedatectl set-timezone "$TZ" git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" git config --global user.name "github-actions[bot]" - name: Get current date id: date run: | echo "date=$(date +'%m/%d_%Y_%H/%M')" >> $GITHUB_ENV echo "date2=$(date +'%m/%d %Y')" >> $GITHUB_ENV VERSION="$(echo "${{github.event.action}}" | grep -Eo " [0-9.]+" | sed -e 's/ //')" || true [ "$VERSION" ] && echo "VERSION=$VERSION" >> $GITHUB_ENV || echo "VERSION=$(date +'%m.%d')" >> $GITHUB_ENV - name: Clone source code run: | if [ "${{matrix.target}}" == "ipq807x_ipq60xx" ]; then git clone https://github.com/gl-inet/gl-infra-builder.git cd gl-infra-builder python3 setup.py -c configs/config-wlan-ap.yml ln -sf gl-infra-builder/wlan-ap/openwrt ../openwrt cd - elif [ "${{matrix.target}}" == "mediatek_gl_mt7981" ]; then git clone https://github.com/gl-inet/gl-infra-builder.git cd gl-infra-builder python3 setup.py -c configs/config-mt798x-7.6.6.1.yml ln -sf gl-infra-builder/mt7981 ../openwrt cd - elif [[ ! "${{ env.REPO_BRANCH }}" && "$REPO_URL" == "https://github.com/openwrt/openwrt" ]]; then REPO_BRANCH="$((curl -gs -H 'Content-Type: application/json' \ -H "Authorization: Bearer ${{ secrets.REPO_TOKEN }}" \ -X POST -d '{ "query": "query {repository(owner: \"openwrt\", name: \"openwrt\") {refs(refPrefix: \"refs/tags/\", last: 4, orderBy: {field: TAG_COMMIT_DATE, direction: ASC}) {edges {node {name}}}}}"}' https://api.github.com/graphql) | jq -r '.data.repository.refs.edges[].node.name' | grep v22 | tail -n 1)" git clone $REPO_URL -b $REPO_BRANCH openwrt elif [[ ! "${{ env.REPO_BRANCH }}" ]]; then git clone $REPO_URL openwrt else git clone $REPO_URL -b ${{ env.REPO_BRANCH }} openwrt echo "git clone $REPO_URL -b ${{ env.REPO_BRANCH }} openwrt" fi - name: Free up disk space env: DEBIAN_FRONTEND: noninteractive run: | sudo mkdir -p -m 777 /mnt/openwrt/dl /mnt/openwrt/bin /mnt/openwrt/staging_dir ln -sf /mnt/openwrt/dl openwrt/dl ln -sf /mnt/openwrt/bin openwrt/bin ln -sf /mnt/openwrt/staging_dir openwrt/staging_dir - name: Load custom configuration run: | cp -rf devices/common/. openwrt/ cp -rf devices/${{matrix.target}}/. openwrt/ cp -rf devices openwrt/ cd openwrt chmod +x devices/common/$DIY_SH /bin/bash "devices/common/$DIY_SH" if [ -f "devices/${{matrix.target}}/$DIY_SH" ]; then chmod +x devices/${{matrix.target}}/$DIY_SH echo "/bin/bash devices/${{matrix.target}}/$DIY_SH" /bin/bash "devices/${{matrix.target}}/$DIY_SH" fi cp -Rf ./diy/* ./ || true if [ -f "devices/${{matrix.target}}/default-settings" ]; then echo >> package/*/*/my-default-settings/files/etc/uci-defaults/99-default-settings cat devices/${{matrix.target}}/default-settings >> package/*/*/my-default-settings/files/etc/uci-defaults/99-default-settings fi cp -f devices/common/$CONFIG_FILE .config if [ -f "devices/${{matrix.target}}/$CONFIG_FILE" ]; then echo >> .config cat devices/${{matrix.target}}/$CONFIG_FILE >> .config fi - name: Apply patches run: | cd openwrt find "devices/common/patches" -type f ! -name 'china_mirrors.patch' -name '*.patch' ! -name '*.revert.patch' -print0 | sort -z | xargs -I % -t -0 -n 1 sh -c "cat '%' | patch -d './' -B --merge -p1 -E --forward" #git apply devices/common/patches/*.patch if [ -n "$(ls -A "devices/${{matrix.target}}/patches" 2>/dev/null)" ]; then find "devices/${{matrix.target}}/patches" -maxdepth 1 -type f -name '*.patch' ! -name '*.revert.patch' -print0 | sort -z | xargs -I % -t -0 -n 1 sh -c "cat '%' | patch -d './' -B --merge -p1 -E --forward" find "devices/${{matrix.target}}/patches" -maxdepth 1 -type f -name '*.revert.patch' -print0 | sort -z | xargs -I % -t -0 -n 1 sh -c "cat '%' | patch -d './' -R -B --merge -p1 -E --forward" #git apply devices/${{matrix.target}}/patches/*.patch fi sed -i '$a \ CONFIG_CPU_FREQ_GOV_POWERSAVE=y \ CONFIG_CPU_FREQ_GOV_USERSPACE=y \ CONFIG_CPU_FREQ_GOV_ONDEMAND=y \ CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y \ CONFIG_CRYPTO_CHACHA20_NEON=y \ CONFIG_CRYPTO_CHACHA20POLY1305=y \ CONFIG_FAT_DEFAULT_IOCHARSET="utf8" \ ' `find target/linux -path "target/linux/*/config-*"` - name: Default PPPOE Setting if: env.PPPOE_USERNAME && env.PPPOE_PASSWD run: | sed -i '$i uci set network.wan.username=${{ env.PPPOE_USERNAME }}' openwrt/package/*/*/my-default-settings/files/etc/uci-defaults/95-default-settings sed -i '$i uci set network.wan.password=${{ env.PPPOE_PASSWD }}' openwrt/package/*/*/my-default-settings/files/etc/uci-defaults/95-default-settings sed -i '$i uci commit network' openwrt/package/*/*/my-default-settings/files/etc/uci-defaults/95-default-settings - name: Defconfig run: | cd openwrt make defconfig cat .config - name: Download package id: package run: | cd openwrt make download -j$(($(nproc)+1)) & sleep 5 - name: Cache uses: stupidloud/cachewrtbuild@main with: ccache: 'true' mixkey: ${{ matrix.target }} clean: ${{ contains(github.event.action, 'nocache') }} prefix: ${{ github.workspace }}/openwrt - name: Check space usage run: | shopt -s extglob cd openwrt if [[ -f staging_dir/*${{ env.MTARGET }}*/bin ]]; then rm -rf staging_dir/!(*${{ env.MTARGET }}*|host|hostpkg) build_dir/!(*${{ env.MTARGET }}*|host|hostpkg) fi df -hT - name: SSH connection to Actions uses: kiddin9/debugger-action@master if: contains(github.event.action, 'ssh') - name: Compile the firmware id: compile run: | shopt -s extglob cd openwrt echo -e "$(($(nproc)+1)) thread compile" make -j$(($(nproc)+1)) || make V=s &>build.log || (tail -50 build.log; curl -k --data chat_id="${{ env.TELEGRAM_CHAT_ID }}" --data "text=❌ OpenWrt ${{ env.VERSION }} ${{matrix.target}} 编译失败 😂" "https://api.telegram.org/bot${{ env.TELEGRAM_TOKEN }}/sendMessage";exit 1) sed -i "s/# CONFIG_IB is not set/CONFIG_IB=y/" .config rm -rf staging_dir/toolchain-*/bin/*openwrt-linux-musl-lto-dump rm -rf staging_dir/toolchain-*/initial - name: Organize files id: organize continue-on-error: true run: | shopt -s extglob mkdir -p firmware/${{matrix.target}} cd openwrt; kernel_v="$(make --file=info.mk kernel_version)"; cd - cp -rf openwrt/bin/targets/*/*/*{combined,sysupgrade}* ./firmware/${{matrix.target}}/ || true cd openwrt/bin/targets/*/*/ mv -f profiles.json profiles.json.b || true cp $GITHUB_WORKSPACE/openwrt/.config ${{matrix.target}}.config || true cp $GITHUB_WORKSPACE/openwrt/build_dir/target-*/linux-*/linux-*/.config ${{matrix.target}}_kernel.config || true mv -f packages $kernel_v ln -sf $kernel_v packages cd - rename -v "s/openwrt-/${{ env.VERSION }}-openwrt-/" ./firmware/*/* || true rename -v "s/friendlyarm_//" ./firmware/*/*gz || true rename -v "s/embedfire_//" ./firmware/*/*gz || true rename -v "s/xiaomi_redmi-router/redmi/" ./firmware/*/*bin || true Emoji=("🎉" "🤞" "✨" "🎁" "🎈" "🎄" "🎨" "💋" "🍓" "🍕" "🍉" "💐" "🌴" "🚀" "🛸" "🗽" "⛅" "🌈" "🔥" "⛄" "🐶" "🏅" "🦄" "🐤") echo "EMOJI=${Emoji[$[$RANDOM % ${#Emoji[@]}]]}" >> $GITHUB_ENV if [ ${{matrix.target}} == "x86_64" ]; then echo "DOCKERTAG=${{ secrets.DOCKER_ID }}/openwrt-nginx:latest" >> $GITHUB_ENV echo "NOTICE=请分配不少于1G的存储容量" >> $GITHUB_ENV fi - name: Deploy imagebuilder to server uses: easingthemes/ssh-deploy@main continue-on-error: true if: env.SSH_PRIVATE_KEY && ! contains(github.event.action, 'noser') with: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} ARGS: "-avzr" SOURCE: openwrt/bin/targets REMOTE_HOST: ${{ secrets.SERVER_HOST }} REMOTE_PORT: ${{ secrets.SERVER_PORT }} REMOTE_USER: root TARGET: "/www/wwwroot/op.supes.top/releases/tmp/" - name: Upload firmware for artifact uses: actions/upload-artifact@main continue-on-error: true if: env.UPLOAD_FIRMWARE_FOR_ARTIFACT == 'true' with: name: ${{ env.VERSION }}_${{matrix.target}} path: | openwrt/bin/targets/ - name: Upload firmware to cowtransfer if: env.UPLOAD_FIRMWARE_TO_COWTRANSFER == 'true' continue-on-error: true run: | curl -fsSL git.io/file-transfer | sh cowurl=$(./transfer cow --block 2621440 -s --no-progress ${FIRMWARE}) cowurl=$(echo $cowurl | grep -o -E "https[^ ]*") echo "COWURL=$cowurl" >> $GITHUB_ENV echo "Download Link: ${{ env.EMOJI }} $cowurl ${{ env.EMOJI }} 🚀" - name: Upload firmware to WeTransfer if: env.UPLOAD_FIRMWARE_TO_WETRANSFER == 'true' && ! contains(github.event.action, 'noup') continue-on-error: true run: | curl -fsSL git.io/file-transfer | sh wetrans=$(./transfer wet -s -p 16 --no-progress ${FIRMWARE}) wetrans=$(echo $wetrans | grep -o -E "https[^ ]*") echo "WETRANS=$wetrans" >> $GITHUB_ENV echo "Download Link: ${{ env.EMOJI }} $wetrans ${{ env.EMOJI }} 🚀" - name: Create release id: create_release if: env.REPO_TOKEN && env.UPLOAD_FIRMWARE_FOR_RELEASE == 'true' continue-on-error: true run: | echo -e "墙内加速下载 🚀:\n" >> release.txt echo -e "[腾讯云] (https://op.supes.top/firmware/${{matrix.target}}/ ☁)\n" >> release.txt [ ${{ env.WETRANS }} ] && echo -e "[WeTransfer] (${{ env.WETRANS }} 🗽)\n" >> release.txt [ ${{ env.COWURL }} ] && echo -e "[奶牛上传] (${{ env.COWURL }} 🐮)\n" >> release.txt [ ${{ env.NOTICE }} ] && echo -e "${{ env.NOTICE }}" >> release.txt || true - name: Upload firmware for release uses: softprops/action-gh-release@master continue-on-error: true if: env.REPO_TOKEN && env.UPLOAD_FIRMWARE_FOR_RELEASE == 'true' env: GITHUB_TOKEN: ${{ secrets.REPO_TOKEN }} with: files: "${{ env.FIRMWARE }}/*" name: ${{ env.date2 }} ${{matrix.target}} ${{ env.EMOJI }} tag_name: ${{ env.date }}_${{matrix.target}} body_path: release.txt - name: Set Up Docker Buildx uses: docker/setup-buildx-action@master if: env.DOCKER_ID && env.DOCKER_PASSWD - name: Login To DockerHub uses: docker/login-action@master if: env.DOCKER_ID && env.DOCKER_PASSWD with: username: ${{ secrets.DOCKER_ID }} password: ${{ secrets.DOCKER_PASSWD }} - name: Build and push docker image uses: docker/build-push-action@master continue-on-error: true if: env.DOCKER_ID && env.DOCKER_PASSWD && ! contains(github.event.action, 'noser') && github.event.client_payload.target == 'x86_64' with: platforms: ${{ env.ARCH }} file: Dockerfile context: . push: true tags: | ${{ secrets.DOCKER_ID }}/openwrt-nginx:${{ matrix.target }} ${{ env.DOCKERTAG }} - name: WeChat notification continue-on-error: true if: env.SCKEY run: | # [ steps.compile.outputs.status == 'success' ] && curl https://sctapi.ftqq.com/${{ secrets.SCKEY }}.send?text=🎉OpenWrt_${{ env.VERSION }}_${{matrix.target}}编译完成😋|| curl https://sctapi.ftqq.com/${{ secrets.SCKEY }}.send?text=❌OpenWrt_${{ env.VERSION }}_${{matrix.target}}编译失败😂 - name: Telegram notification if: env.TELEGRAM_TOKEN && ! contains(github.event.action, 'notg') continue-on-error: true run: | curl -k --data chat_id="${{ env.TELEGRAM_CHAT_ID }}" --data "text=🎉 OpenWrt ${{ env.VERSION }} ${{matrix.target}} 编译成功 😋 https://op.supes.top/firmware/${{matrix.target}}/ ${{ env.COWURL }} ${{ env.WETRANS }} 🚀" "https://api.telegram.org/bot${{ env.TELEGRAM_TOKEN }}/sendMessage" - name: Delete workflow runs uses: GitRML/delete-workflow-runs@main continue-on-error: true with: retain_days: 100 keep_minimum_runs: 0 - name: Remove old Releases uses: dev-drprasad/delete-older-releases@master continue-on-error: true if: env.UPLOAD_FIRMWARE_FOR_RELEASE == 'true' && !cancelled() with: keep_latest: 15 delete_tags: true env: GITHUB_TOKEN: ${{ secrets.REPO_TOKEN }}