Skip to content
Merged

Test #19

Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
258 changes: 152 additions & 106 deletions .github/workflows/Build IPQ-60xx.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
name: Build IPQ-60xx

on:
schedule:
- cron: '0 16 */6 * *' # 统一的定时任务,每6天的16点执行
# schedule:
# - cron: '0 16 */6 * *'
repository_dispatch:
workflow_dispatch:
inputs:
Expand All @@ -23,21 +23,18 @@ env:
REPO_URL_IMM: https://github.com/m0eak/libwrt.git
REPO_BRANCH: 24.10-6.12
FEEDS_CONF: feeds.conf.default
CONFIG_FILE_DOCKER: ./config/docker.config
CONFIG_FILE_ISTORE: ./config/istore.config
DIY_P1_SH: ./sh/scripts-part1.sh
DIY_P2_SH: ./sh/scripts-part2.sh
DEFAULT_SETTING: ./default-settings-m0eak
UPLOAD_BIN_DIR: true
UPLOAD_FIRMWARE: true
UPLOAD_RELEASE: true
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
Expand All @@ -46,10 +43,9 @@ jobs:
- device: JDC-AX6600
config_file: './config/jdcax6600.config'
workflow_name: 'JDC-AX6600'
name: Build ${{ matrix.device }}


steps:
- name: Checkout
- name: 检出仓库代码
uses: actions/checkout@main

- name: 查看运行环境配置
Expand All @@ -74,182 +70,232 @@ jobs:
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: 初始化环境
- name: 初始化编译环境
env:
DEBIAN_FRONTEND: noninteractive
run: |
sudo rm -rf /usr/share/dotnet /etc/apt/sources.list.d /usr/local/lib/android $AGENT_TOOLSDIRECTORY
sudo -E apt-get -y purge azure-cli ghc* zulu* llvm* firefox google* dotnet* powershell openjdk* mongodb* moby* || true
sudo -E apt-get -y update
# 移除与编译无关的预装包
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 systemctl daemon-reload
sudo -E apt-get -y autoremove --purge
sudo -E apt-get -y clean
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: 克隆源代码
- name: 克隆固件源代码
working-directory: /workdir
run: |
df -hT $PWD
REPO_URL=$REPO_URL_IMM
git clone $REPO_URL --single-branch --depth 1 openwrt
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}"
# GitHub Action 移除国内下载源
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: 加载自定义源
- name: 加载 Feeds 和自定义脚本 (Part 1)
run: |
cat $GITHUB_ENV
[ -e $FEEDS_CONF ] && mv $FEEDS_CONF openwrt/feeds.conf.default
chmod +x $DIY_P1_SH
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

# run: cd openwrt && ./scripts/feeds update -a

- name: 安装源
- name: 安装 Feeds
run: cd openwrt && ./scripts/feeds install -a

- name: 加载自定义配置
- name: 加载自定义配置 (Part 2)
run: |
[ -e $DEFAULT_SETTING ] && mv $DEFAULT_SETTING openwrt/package/default-settings-m0eak
ls openwrt/package/
[ -e files ] && mv ./files openwrt/files
[ -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
chmod +x $DIY_P2_SH
cd openwrt
chmod +x $GITHUB_WORKSPACE/$DIY_P2_SH
$GITHUB_WORKSPACE/$DIY_P2_SH
make defconfig
echo "当前diffconfig:"
echo "当前 diffconfig:"
./scripts/diffconfig.sh

- name: Cache Toolchain(缓存工具链)
- name: 缓存工具链
uses: HiGarfield/cachewrtbuild@main
if: env.CACHE_TOOLCHAIN != 'false'
with:
ccache: true
mixkey: ${{ github.workflow }}-${{ env.REPO_BRANCH }}-${{ hashFiles(matrix.config_file, '**/scripts-part*.sh') }}
mixkey: ${{ github.workflow }}-${{ matrix.workflow_name }}-${{ hashFiles(matrix.config_file, '**/scripts-part*.sh') }}
prefix: ${{ env.OPENWRT_PATH }}

- name: 下载软件包
id: package
run: |
cd openwrt
make download -j8
find dl -size -1024c -exec ls -l {} \;
make download -j$(nproc) || make download -j1 V=s
find dl -size -1024c -exec rm -f {} \;

- name: 编译固件
id: compile
run: |
cd openwrt
echo -e "$(nproc) 线程编译"
echo "y" | make -j$(expr $(nproc) + 1) || echo "y" | make -j1 V=s
echo "compile-status=success" >> $GITHUB_ENV
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
echo "compile=success" >> $GITHUB_OUTPUT
if [ -s DEVICE_NAME ]; then
echo "device-name=$(cat DEVICE_NAME)" >> $GITHUB_OUTPUT
fi
echo "file-date=$(date +"%Y%m%d%H%M")" >> $GITHUB_OUTPUT

- name: 检查空间使用情况
if: (!cancelled())
run: df -hT
echo "使用 $(nproc) 线程进行编译..."
make -j$(expr $(nproc) + 1) || make -j1 V=s

- name: 上传 bin 目录
uses: actions/upload-artifact@main
if: steps.compile.outputs.compile == 'success' && env.UPLOAD_BIN_DIR == 'true'
with:
name: OpenWrt_bin_${{ steps.compile.outputs.device-name }}_${{ steps.compile.outputs.file-date }}
path: openwrt/bin
- name: 编译后清理临时文件
if: success()
run: |
echo "编译完成,开始清理临时编译目录..."
cd openwrt
rm -rf build_dir tmp
echo "临时文件清理完毕!"

- name: 整理文件
- name: 整理固件文件
id: organize
if: env.UPLOAD_FIRMWARE == 'true' && !cancelled()
run: |
cd openwrt/bin/targets/*/*
rm -rf packages
echo "FIRMWARE=$PWD" >> $GITHUB_ENV
echo "status=success" >> $GITHUB_ENV
echo "organize=success" >> $GITHUB_OUTPUT
cat $GITHUB_ENV
echo "FIRMWARE_PATH=$PWD" >> $GITHUB_ENV

- name: 上传固件目录
- name: 上传固件产物
uses: actions/upload-artifact@main
if: steps.organize.outputs.organize == 'success' && !cancelled()
with:
name: OpenWrt_firmware${{ env.DEVICE_NAME }}${{ env.FILE_DATE }}
path: ${{ env.FIRMWARE }}
name: firmware-${{ matrix.device }}
path: ${{ env.FIRMWARE_PATH }}

- name: 生成发布标签
id: tag
if: steps.compile.outputs.compile == 'success' && env.UPLOAD_RELEASE == 'true'

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: |
echo "生成发布标签..."
# 直接使用 WORKFLOW_NAME 和输入的 tag 来构建标签,不再需要复杂的清理
# 格式:设备名-内核版本-日期
INPUT_TAG="${{ github.event.inputs.tag }}"
if [ -z "$INPUT_TAG" ]; then
echo "错误:内核版本标签 (tag) 为空!"
exit 1
fi

DATE_SUFFIX=$(date +"%Y%m%d-%H%M")
RELEASE_TAG="$WORKFLOW_NAME-$INPUT_TAG-$DATE_SUFFIX"

echo "生成的发布标签: $RELEASE_TAG"
RELEASE_TAG="IPQ60xx-${{ github.event.inputs.tag }}-${DATE_SUFFIX}"
echo "生成的统一发布标签: $RELEASE_TAG"
echo "release_tag=$RELEASE_TAG" >> $GITHUB_ENV
echo "tag=success" >> $GITHUB_OUTPUT

- name: Release Firmware
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 }}
files: ${{ env.FIRMWARE }}/*
body: |
源码:${{ env.REPO_URL_IMM }}

- name: Delete workflow runs
uses: GitRML/delete-workflow-runs@main
with:
retain_days: 5
keep_minimum_runs: 5
body_path: release-body.md
files: all-firmware/*/*

- name: Remove old Releases
- name: 清理旧的 Release
uses: dev-drprasad/[email protected]
if: env.UPLOAD_RELEASE == 'true' && !cancelled()
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