如何用GitHub Action追踪其他仓库新版本并自动构建Docker镜像?
实现追踪目标仓库Release并自动构建Docker镜像的方案
一、调整触发条件,监听目标仓库的Release更新
修改你的CI.yml触发规则,除了原有代码提交触发,新增手动触发和外部仓库Release触发的规则,确保能实时追踪目标仓库的版本更新:
name: docker run-name: auto build image on: push: branches: - 'main' workflow_dispatch: # 手动触发,用于测试 repository_dispatch: # 接收目标仓库Release发布的webhook触发 types: [new_release] # 自定义事件类型,需和目标仓库webhook配置对应 jobs: docker: runs-on: ubuntu-latest steps: - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} # 新增步骤:获取目标仓库最新Release的dpkg包下载地址 - name: 获取目标仓库最新dpkg包URL id: get_package run: | # 替换为目标仓库的「用户名/仓库名」格式 TARGET_REPO="target-owner/target-repo" # 调用GitHub API拉取最新正式Release的dpkg包地址(过滤.deb后缀) PACKAGE_URL=$(curl -s "https://api.github.com/repos/$TARGET_REPO/releases/latest" | jq -r '.assets[] | select(.name | endswith(".deb")) | .browser_download_url' | head -n1) echo "package_url=$PACKAGE_URL" >> $GITHUB_OUTPUT - name: Build and push uses: docker/build-push-action@v4 with: push: true tags: leenhawk/hexo_env:latest build-args: - PACKAGE_URL=${{ steps.get_package.outputs.package_url }}
二、修改Dockerfile,支持通过构建参数安装指定dpkg包
将原有的APT安装逻辑替换为从指定URL下载并安装dpkg包,同时保留必要依赖:
FROM debian:unstable-slim # 接收构建时传入的dpkg包URL参数 ARG PACKAGE_URL RUN apt update -y && \ # 安装基础依赖(wget用于下载包,git保留原需求) apt install -y git wget && \ # 下载目标dpkg包到临时目录 wget -O /tmp/target-package.deb "$PACKAGE_URL" && \ # 安装dpkg包,若有依赖缺失自动补全 dpkg -i /tmp/target-package.deb || apt install -f -y && \ # 清理临时文件和APT缓存 rm /tmp/target-package.deb && \ apt clean && rm -rf /var/lib/apt/lists/*
三、配置目标仓库Webhook,触发当前构建
- 打开目标GitHub仓库的「Settings → Webhooks → Add webhook」
- Payload URL填写:
https://api.github.com/repos/你的用户名/你的仓库名/dispatches - Content type选择
application/json - Secret设置一个随机字符串(需在当前仓库的「Settings → Secrets and variables → Actions」中添加同名Secret,值一致)
- 触发事件选择「Releases」
- Payload填写:
{ "event_type": "new_release", "client_payload": {} }
- 保存Webhook,后续目标仓库发布新Release时会自动触发当前构建
补充:适配无latest标记的Release场景
如果目标仓库的Release仅带版本号、无latest标记,可调整获取包地址的命令,拉取所有Release后筛选最新正式版:
PACKAGE_URL=$(curl -s "https://api.github.com/repos/$TARGET_REPO/releases" | jq -r '.[] | select(.prerelease == false) | .assets[] | select(.name | endswith(".deb")) | .browser_download_url' | head -n1)
内容的提问来源于stack exchange,提问作者Leen Hawk
相关产品推荐
相关产品推荐

