Skip to content

Build IPQ-60xx

Build IPQ-60xx #21

Workflow file for this run

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