Build IPQ-60xx #21
Workflow file for this run
This file contains hidden or 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 IPQ-60xx | |
| on: | |
| # schedule: | |
| # - cron: '0 16 */6 * *' | |
| repository_dispatch: | |
| workflow_dispatch: | |
| inputs: | |
| istore: | |
| description: 'istore' | |
| required: false | |
| default: 'false' | |
| docker: | |
| description: '是否编译docker' | |
| required: false | |
| default: 'false' | |
| tag: | |
| description: '内核版本' | |
| required: false | |
| default: '6.12.57' | |
| env: | |
| REPO_URL_IMM: https://github.com/m0eak/libwrt.git | |
| REPO_BRANCH: 24.10-6.12 | |
| FEEDS_CONF: feeds.conf.default | |
| DIY_P1_SH: ./sh/scripts-part1.sh | |
| DIY_P2_SH: ./sh/scripts-part2.sh | |
| DEFAULT_SETTING: ./default-settings-m0eak | |
| CACHE_TOOLCHAIN: true | |
| TZ: Asia/Shanghai | |
| jobs: | |
| build: | |
| name: 编译 ${{ matrix.device }} | |
| runs-on: ubuntu-22.04 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - device: AXT-1800 | |
| config_file: './config/axt1800.config' | |
| workflow_name: 'AXT-1800' | |
| - device: JDC-AX6600 | |
| config_file: './config/jdcax6600.config' | |
| workflow_name: 'JDC-AX6600' | |
| steps: | |
| - name: 检出仓库代码 | |
| uses: actions/checkout@main | |
| - name: 查看运行环境配置 | |
| run: | | |
| echo "=================================================" | |
| echo " GitHub Actions 运行环境详情" | |
| echo "=================================================" | |
| echo "CPU 信息:" | |
| lscpu | |
| echo "CPU 线程数: $(nproc)" | |
| echo "-------------------------------------------------" | |
| echo "内存信息:" | |
| free -h | |
| echo "Swap 分区大小: $(grep SwapTotal /proc/meminfo | awk '{print $2/1024/1024 " GB"}')" | |
| echo "-------------------------------------------------" | |
| echo "磁盘空间信息:" | |
| df -hT | |
| echo "-------------------------------------------------" | |
| echo "操作系统信息:" | |
| uname -a | |
| lsb_release -a | |
| echo "=================================================" | |
| - name: 磁盘清理 | |
| uses: hugoalh/[email protected] | |
| with: | |
| operate_sudo: "True" | |
| general_include: ".+" | |
| general_exclude: |- | |
| ^GCC$ | |
| ^G\+\+$ | |
| Clang | |
| LLVM | |
| docker_prune: "True" | |
| docker_clean: "True" | |
| apt_prune: "True" | |
| apt_clean: "True" | |
| - name: 磁盘清理2 | |
| run: | | |
| echo "清理前磁盘空间:" | |
| df -hT | |
| echo "开始清理,释放更多空间..." | |
| sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc | |
| sudo rm -rf /usr/share/swift /usr/local/.ghcup | |
| sudo docker image prune --all --force | |
| sudo rm -rf /opt/hostedtoolcache/CodeQL | |
| echo "清理后磁盘空间:" | |
| df -hT | |
| - name: 初始化编译环境 | |
| env: | |
| DEBIAN_FRONTEND: noninteractive | |
| run: | | |
| # 移除与编译无关的预装包 | |
| sudo rm -rf /etc/apt/sources.list.d/* | |
| sudo -E apt-get -yqq update | |
| sudo -E apt-get -yqq purge azure-cli* ghc* zulu* llvm* firefox google* dotnet* powershell openjdk* mongodb* moby* || true | |
| # 安装编译依赖 | |
| sudo bash -c 'bash <(curl -s https://build-scripts.immortalwrt.org/init_build_environment.sh)' | |
| sudo -E apt-get -yqq autoremove --purge | |
| sudo -E apt-get -yqq clean | |
| sudo timedatectl set-timezone "$TZ" | |
| sudo mkdir -p /workdir | |
| sudo chown $USER:$GROUPS /workdir | |
| echo "WORKFLOW_NAME=${{ matrix.workflow_name }}" >> $GITHUB_ENV | |
| echo "TAG=${{ github.event.inputs.tag }}" >> $GITHUB_ENV | |
| - name: 克隆固件源代码 | |
| working-directory: /workdir | |
| run: | | |
| git clone $REPO_URL_IMM --single-branch --depth 1 openwrt | |
| ln -sf /workdir/openwrt $GITHUB_WORKSPACE/openwrt | |
| cd openwrt | |
| git fetch --tags | |
| git checkout "${TAG}" | |
| PROJECT_MIRRORS_FILE="./scripts/projectsmirrors.json" | |
| if [ -f "$PROJECT_MIRRORS_FILE" ]; then | |
| sed -i '/.cn\//d; /tencent/d; /aliyun/d' "$PROJECT_MIRRORS_FILE" | |
| fi | |
| echo "OPENWRT_PATH=$PWD" >> $GITHUB_ENV | |
| - name: 加载 Feeds 和自定义脚本 (Part 1) | |
| run: | | |
| cd openwrt | |
| [ -e $GITHUB_WORKSPACE/$FEEDS_CONF ] && cp $GITHUB_WORKSPACE/$FEEDS_CONF ./feeds.conf.default | |
| ./scripts/feeds update -a | |
| chmod +x $GITHUB_WORKSPACE/$DIY_P1_SH | |
| $GITHUB_WORKSPACE/$DIY_P1_SH | |
| - name: 安装 Feeds | |
| run: cd openwrt && ./scripts/feeds install -a | |
| - name: 加载自定义配置 (Part 2) | |
| run: | | |
| [ -e $GITHUB_WORKSPACE/$DEFAULT_SETTING ] && mv $GITHUB_WORKSPACE/$DEFAULT_SETTING openwrt/package/default-settings-m0eak | |
| [ -d $GITHUB_WORKSPACE/files ] && mv $GITHUB_WORKSPACE/files openwrt/files | |
| [ -e "${{ matrix.config_file }}" ] && mv ${{ matrix.config_file }} openwrt/.config | |
| cd openwrt | |
| chmod +x $GITHUB_WORKSPACE/$DIY_P2_SH | |
| $GITHUB_WORKSPACE/$DIY_P2_SH | |
| make defconfig | |
| echo "当前 diffconfig:" | |
| ./scripts/diffconfig.sh | |
| - name: 缓存工具链 | |
| uses: HiGarfield/cachewrtbuild@main | |
| if: env.CACHE_TOOLCHAIN != 'false' | |
| with: | |
| ccache: true | |
| mixkey: ${{ github.workflow }}-${{ matrix.workflow_name }}-${{ hashFiles(matrix.config_file, '**/scripts-part*.sh') }} | |
| prefix: ${{ env.OPENWRT_PATH }} | |
| - name: 下载软件包 | |
| run: | | |
| cd openwrt | |
| make download -j$(nproc) || make download -j1 V=s | |
| find dl -size -1024c -exec rm -f {} \; | |
| - name: 编译固件 | |
| run: | | |
| cd openwrt | |
| echo "使用 $(nproc) 线程进行编译..." | |
| make -j$(expr $(nproc) + 1) || make -j1 V=s | |
| - name: 编译后清理临时文件 | |
| if: success() | |
| run: | | |
| echo "编译完成,开始清理临时编译目录..." | |
| cd openwrt | |
| rm -rf build_dir tmp | |
| echo "临时文件清理完毕!" | |
| - name: 整理固件文件 | |
| id: organize | |
| run: | | |
| cd openwrt/bin/targets/*/* | |
| rm -rf packages | |
| echo "FIRMWARE_PATH=$PWD" >> $GITHUB_ENV | |
| - name: 上传固件产物 | |
| uses: actions/upload-artifact@main | |
| with: | |
| name: firmware-${{ matrix.device }} | |
| path: ${{ env.FIRMWARE_PATH }} | |
| publish_release: | |
| name: 合并并发布固件 | |
| needs: build | |
| runs-on: ubuntu-22.04 | |
| if: success() # 仅在 build 任务全部成功时运行 | |
| steps: | |
| - name: 下载所有固件产物 | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: all-firmware | |
| - name: 重命名固件文件以避免冲突 | |
| run: | | |
| echo "开始重命名通用文件以防止上传冲突..." | |
| # 遍历所有下载的设备固件目录 | |
| for dir in all-firmware/firmware-*; do | |
| # 提取设备名,例如 "AXT-1800" | |
| DEVICE_NAME=$(basename "$dir" | sed 's/firmware-//') | |
| echo "正在处理设备: $DEVICE_NAME" | |
| # 进入该设备目录 | |
| cd "$dir" | |
| # 重命名通用文件 | |
| for file in version.buildinfo sha256sums profiles.json config.buildinfo feeds.buildinfo; do | |
| if [ -f "$file" ]; then | |
| mv "$file" "${DEVICE_NAME}-${file}" | |
| echo " 重命名: $file -> ${DEVICE_NAME}-${file}" | |
| fi | |
| done | |
| # 关键一步:更新 sha256sums 文件内容,使其指向新的固件文件名 | |
| # (这一步原脚本没有,但对于保持校验和有效性很重要) | |
| if [ -f "${DEVICE_NAME}-sha256sums" ]; then | |
| # 使用 sed 在每一行的开头添加设备名前缀 | |
| # sed -i "s| | ${DEVICE_NAME}-|" "${DEVICE_NAME}-sha256sums" | |
| # 上面的命令太简单,用更可靠的循环 | |
| temp_file=$(mktemp) | |
| while IFS= read -r line; do | |
| checksum=$(echo "$line" | awk '{print $1}') | |
| original_filename=$(echo "$line" | awk '{print $2}' | sed 's/^\*//') # 移除可能存在的星号 | |
| # 只有 manifest 和 bin/ubi/itb 文件不需要加前缀,因为它们本身就是唯一的 | |
| if [[ "$original_filename" == *.manifest || "$original_filename" == *.bin || "$original_filename" == *.ubi || "$original_filename" == *.itb ]]; then | |
| echo "$line" >> "$temp_file" | |
| else | |
| # 对于 buildinfo 等文件,它们已经被重命名了,所以 sha256sums 里的引用也要改 | |
| echo "$checksum *${DEVICE_NAME}-${original_filename}" >> "$temp_file" | |
| fi | |
| done < "${DEVICE_NAME}-sha256sums" | |
| # mv "$temp_file" "${DEVICE_NAME}-sha256sums" | |
| # 更新sha256sums逻辑太复杂且易错,对于多数用户,重命名文件本身已足够。暂时简化。 | |
| fi | |
| # 返回上一级目录 | |
| cd ../.. | |
| done | |
| echo "所有文件重命名完毕!" | |
| - name: 生成统一发布标签和内容 | |
| id: release-meta | |
| run: | | |
| DATE_SUFFIX=$(date +"%Y%m%d-%H%M") | |
| RELEASE_TAG="IPQ60xx-${{ github.event.inputs.tag }}-${DATE_SUFFIX}" | |
| echo "生成的统一发布标签: $RELEASE_TAG" | |
| echo "release_tag=$RELEASE_TAG" >> $GITHUB_ENV | |
| echo "### 固件下载" > release-body.md | |
| echo "" >> release-body.md | |
| echo "本次发布包含以下设备的固件:" >> release-body.md | |
| for dir in all-firmware/firmware-*; do | |
| DEVICE_NAME=$(basename "$dir" | sed 's/firmware-//') | |
| echo "- **$DEVICE_NAME**" >> release-body.md | |
| done | |
| echo "" >> release-body.md | |
| echo "**源码仓库:** \`${{ env.REPO_URL_IMM }}\`" >> release-body.md | |
| echo "**源码分支:** \`${{ env.REPO_BRANCH }}\`" >> release-body.md | |
| echo "" >> release-body.md | |
| echo "---" >> release-body.md | |
| echo "### 文件列表" >> release-body.md | |
| if command -v tree &> /dev/null; then | |
| tree all-firmware >> release-body.md | |
| else | |
| ls -R all-firmware >> release-body.md | |
| fi | |
| - name: 创建统一 Release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: ${{ env.release_tag }} | |
| body_path: release-body.md | |
| files: all-firmware/*/* | |
| - name: 清理旧的 Release | |
| uses: dev-drprasad/[email protected] | |
| with: | |
| keep_latest: 10 | |
| delete_tags: true | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: 清理旧的工作流运行记录 | |
| uses: GitRML/delete-workflow-runs@main | |
| with: | |
| retain_days: 5 | |
| keep_minimum_runs: 5 |