``` name: Update Main Version run-name: Move ${{ github.event.inputs.major_version }} to ${{ github.event.inputs.target }} permissions: contents: write on: workflow_dispatch: inputs: target: description: The tag or reference to use required: true major_version: type: choice description: The major version to update options: - v1 jobs: tag: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - name: Git config run: | git config user.name github-actions git config user.email github-actions@github.com - name: Tag new target run: git tag -f ${{ github.event.inputs.major_version }} ${{ github.event.inputs.target }} - name: Push new tag run: git push origin ${{ github.event.inputs.major_version }} --force go自动构建发布 GoReleaser Pro:https://nsddd.top/zh/posts/go-release-tools/ 和 https://gitea.com/gitea/act_runner/src/branch/main/.gitea/workflows/release-tag.yml # 日志生成 https://keepachangelog.com/zh-CN/1.1.0/ https://github.com/marketplace/actions/generate-changelog#outputs 这是个非常专业、实际的需求,下面我将以生产实践为你梳理一套完整的流程:**如何标准化 Commit 信息,并借助 GitHub Actions 自动生成高质量的 CHANGELOG,用于 `softprops/action-gh-release@v2` 展示变更内容**。 ``` --- # github日志生成+发布仓库 - name: Conventional Changelog Action id: changelog uses: TriPSs/conventional-changelog-action@v5 with: github-token: ${{ secrets.github_token }} output-file: "false" - name: Create Release uses: actions/create-release@v1 if: ${{ steps.changelog.outputs.skipped == 'false' }} env: GITHUB_TOKEN: ${{ secrets.github_token }} with: tag_name: ${{ steps.changelog.outputs.tag }} release_name: ${{ steps.changelog.outputs.tag }} body: ${{ steps.changelog.outputs.clean_changelog }} # ✅ 最佳实践目标 1. **标准化 Commit Message 格式**(title + body) 2. 使用工具如 [`conventional-changelog`](https://github.com/conventional-changelog/conventional-changelog) 或 [`git-cliff`](https://github.com/orhun/git-cliff) 自动生成 `CHANGELOG.md` 3. 自动将生成的 changelog 设置为 GitHub Release 的描述,配合 `softprops/action-gh-release@v2` --- ## 🧩 一、Commit Message 规范:**Conventional Commits** Conventional Commit 是业界广泛使用的提交信息格式,自动语义化生成版本和变更日志。 ### ✅ 格式: ```text (optional scope): [optional body] [optional footer(s)] ``` ### 🔧 常用 `type` 列表: | 类型 | 含义 | | ---------- | ---------------- | | `feat` | 新功能 | | `fix` | 修复 bug | | `chore` | 构建过程或辅助工具变动 | | `docs` | 仅文档变更 | | `style` | 空格、格式、缺少分号等无意义变动 | | `refactor` | 重构,非修复或功能添加 | | `perf` | 性能优化 | | `test` | 增加测试或测试相关变更 | | `ci` | 与 CI/CD 相关的改动 | ### ✅ 示例: ```text feat(auth): add JWT login support - 用户登录接口增加 JWT 返回 - 新增 `/api/v1/token` 接口 BREAKING CHANGE: `/api/v1/login` 返回结构发生变化 ``` --- ## 🛠️ 二、推荐工具:`conventional-changelog` or `git-cliff` ### 🚀 推荐:使用 [`git-cliff`](https://github.com/orhun/git-cliff) 特点: * 更现代、配置简单 * 支持 emoji、高级分组 * 支持 tag 比对差异、PR 信息、author 等 --- ## 📄 三、GitHub Actions 集成流程(用 `git-cliff`) ### ✅ 1. 安装 `git-cliff`: ```yaml - name: Install git-cliff run: | curl -sSL https://github.com/orhun/git-cliff/releases/download/v1.3.0/git-cliff-x86_64-unknown-linux-musl.tar.gz | tar -xz sudo mv git-cliff /usr/local/bin ``` ### ✅ 2. 配置 `.gitcliff.toml`(放仓库根目录): ```toml [changelog] header = "# 📦 Changelog\n\n" body = """ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | trim }} ({{ commit.id | truncate(length=7) }}) {% endfor %} {% endfor %} """ footer = "\n*Generated on {{ timestamp | date(format='%Y-%m-%d') }}*" [git] conventional_commits = true filter_commits = true tag_pattern = "v[0-9]*" ``` --- ## 📦 四、完整 GitHub Actions:生成 changelog + 发布 release ```yaml name: Release on: push: tags: - "v*" jobs: release: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Install git-cliff run: | curl -sSL https://github.com/orhun/git-cliff/releases/download/v1.3.0/git-cliff-x86_64-unknown-linux-musl.tar.gz | tar -xz sudo mv git-cliff /usr/local/bin - name: Generate CHANGELOG id: changelog run: | git fetch --tags git-cliff -t ${{ github.ref_name }} > CHANGELOG.md echo "CHANGELOG<> $GITHUB_OUTPUT cat CHANGELOG.md >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: tag_name: ${{ github.ref_name }} name: Release ${{ github.ref_name }} body: ${{ steps.changelog.outputs.CHANGELOG }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ``` --- ## ✅ 最终效果 * **Git 提交统一**:`feat:`、`fix:` 等规范命名 * **CHANGELOG.md 自动生成**:包含分组、短 ID、日期 * **GitHub Release 自动发布**:含详细变更描述 --- ## 🎯 建议团队落地操作 1. **启用 Commit 校验钩子**(如 husky + commitlint) 2. **PR 合并统一走 squash + rebase 模式** 3. **Tag 发布统一通过 Actions 管理** 4. **对开发者编写 commit message 做简单规范培训** --- ## 💬 如果你想要: * 自动创建 tag(如 `release-$(date +%Y%m%d)`)+ changelog + Release * 在 monorepo 多模块项目中按模块生成 changelog * 把 changelog 自动更新到 `CHANGELOG.md` 文件 我可以帮你扩展这套 CI 流程。是否继续? 很好!你选择使用: > ✅ [`janheinrichmerker/action-github-changelog-generator@v2.3`](https://github.com/janheinrichmerker/action-github-changelog-generator) 这个 Action 封装了 GitHub 官方的 [github-changelog-generator](https://github.com/github-changelog-generator/github-changelog-generator),可以根据 GitHub 的 Issue、PR、标签、Milestone 自动生成漂亮的 `CHANGELOG.md`。 --- ## 🧩 你当前需求是: > 自动生成 changelog,提取本次 tag 对应的变更内容,用于传给 `softprops/action-gh-release@v2` 的 `body` 参数显示发布详情 ✅。 --- ## ✅ 实现流程概览 | 步骤 | 工具 | | ---------------------- | ---------------------------------------------------------- | | 1. 提交 tag(如 `v1.2.3`) | 手动或自动打 tag | | 2. 生成完整 `CHANGELOG.md` | `janheinrichmerker/action-github-changelog-generator@v2.3` | | 3. 提取本 tag 部分内容 | Shell 脚本 + `awk` / `sed` / `perl` | | 4. 创建 GitHub Release | `softprops/action-gh-release@v2` | --- ## 📄 完整 Workflow 示例:生成并提取当前版本 Changelog ```yaml name: Release with Changelog on: push: tags: - "v*" jobs: release: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Generate full changelog uses: janheinrichmerker/action-github-changelog-generator@v2.3 with: token: ${{ secrets.GITHUB_TOKEN }} user: ${{ github.repository_owner }} project: ${{ github.event.repository.name }} output: CHANGELOG.md - name: Extract current version changelog id: extract run: | TAG_NAME="${GITHUB_REF##*/}" # v1.2.3 # 用 awk 截取当前 tag 的 section 到下一个 tag(或文件末尾) awk -v tag="## ${TAG_NAME}" ' $0 ~ tag {flag=1; next} /^## / && flag {exit} flag {print} ' CHANGELOG.md > current-changelog.md echo "Extracted changelog:" cat current-changelog.md # 保存到 output 供后续 step 使用 echo "BODY<> $GITHUB_OUTPUT cat current-changelog.md >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: Publish GitHub Release uses: softprops/action-gh-release@v2 with: tag_name: ${{ github.ref_name }} name: Release ${{ github.ref_name }} body: ${{ steps.extract.outputs.BODY }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ``` --- ## ✅ 效果示例(`CHANGELOG.md` 结构) ```md # Changelog ## v1.2.3 (2025-07-27) ### Added - ✨ Add user login feature (#42) ### Fixed - 🐛 Fix crash on startup (#45) ## v1.2.2 (2025-07-15) ... ``` 提取结果 `current-changelog.md` 内容将是 `v1.2.3` 的 block(不含标题): ```md ### Added - ✨ Add user login feature (#42) ### Fixed - 🐛 Fix crash on startup (#45) ``` --- ## 🧠 注意事项 | 项目 | 说明 | | ------------------ | -------------------------------------- | | `awk` 提取 tag 区块 | 一定要确保 tag 格式为 `## v1.2.3` | | 不含 `## v1.2.3` 行 | 因为 Release title 会单独写 `Release v1.2.3` | | 如果没有下一个 tag,会提取到末尾 | `awk` 会自动停在下一个 `## ` 开头或文件末尾 | | PR 标题必须规范 | 推荐标准化,如 `feat(xxx): ...` 更清晰 | --- ## ✨ 如果你希望进一步增强: | 功能 | 实现方式 | | ------------------- | ---------------------------------- | | 自动写入 `CHANGELOG.md` | `git add && commit` | | 删除旧 changelog 再生成 | `rm -f CHANGELOG.md` | | nightly 版本支持 | `release-nightly-YYYYMMDD` 自定义 tag | | 多语言 changelog(中英文) | 改 `.erb` 模板或用 `git-cliff` 替代 | | PR message 模板与规范 | 可结合 `semantic-pull-requests` 检查格式 | --- 是否要我帮你补一份 **commit + PR message 编写规范模板(Markdown)**?这样你的项目协作成员都能自动生成正确格式的 changelog,不需要人工修改。 太好了!下面我将为你提供一份**标准化的 Commit Message + PR Template 模板(Markdown 格式)**,适配自动化 Changelog 和 GitHub Release 的需求,广泛适用于企业项目协作。 --- # ✅ 1. `COMMIT_CONVENTION.md`:提交信息规范文档(建议放在项目根目录) ```markdown # ✅ Git Commit 提交信息规范 为了保证自动生成 CHANGELOG、自动发布版本,请遵循 **Conventional Commits** 格式: ## ✅ 格式规范 ``` (): ``` ### 🔑 示例 ``` feat(auth): 添加 JWT 登录支持 用户登录接口新增 token 返回 兼容老版 cookie 登录接口 BREAKING CHANGE: /api/v1/login 响应结构发生变化 ``` --- ## 🎯 type 类型说明 | type | 含义(用于分类) | | -------- | ----------------- | | feat | ✨ 新功能 | | fix | 🐛 修复 bug | | docs | 📚 仅文档修改 | | style | 💅 代码格式(空格、分号等) | | refactor | 🔨 重构代码(无新增功能或修复) | | perf | ⚡️ 性能优化 | | test | ✅ 增加/修改测试代码 | | chore | 🧹 构建过程或工具变更 | | ci | ⚙️ CI/CD 流程相关更改 | --- ## ✏️ scope(可选) 模块、功能或目录名称,例如: * `auth` * `login` * `ui/button` * `api/user` --- ## 🚨 Footer(可选) * `BREAKING CHANGE:` 声明破坏性变更 * `Closes #123` 自动关闭关联 issue --- ## 🚫 不规范示例 ```text update login fix bug modify something ``` 请避免使用这些无语义的提交信息。 --- ```` --- # ✅ 2. `.github/PULL_REQUEST_TEMPLATE.md`:PR 模板(自动弹出填写) ```markdown ## 📌 本次变更概述 - 新增功能/修复内容: - 涉及模块: - 是否有 breaking change(重大兼容性变更): --- ## ✅ 类型 请勾选你本次提交的类型(多选): - [ ] feat(新增功能) - [ ] fix(修复 bug) - [ ] docs(仅文档修改) - [ ] style(代码格式修改,无逻辑变更) - [ ] refactor(重构,无功能变更) - [ ] perf(性能优化) - [ ] test(增加/修改测试) - [ ] chore(构建流程/依赖/脚手架修改) - [ ] ci(CI/CD 配置变更) --- ## 🔗 关联 issue 或需求单 例如: - Fixes #123 - Related to #456 --- ## 🧪 测试说明(如有) - [ ] 已本地验证功能正常 - [ ] 已通过 CI 检查 - [ ] 无新增逻辑,无需测试 --- ## 📎 其他备注(可选) ```` --- # 🚀 配置方法 ### 📁 项目结构建议: ``` . ├── COMMIT_CONVENTION.md ├── .github/ │ ├── PULL_REQUEST_TEMPLATE.md ``` ### ✅ 启用 PR 模板功能 只需将 `PULL_REQUEST_TEMPLATE.md` 放入 `.github/` 目录,GitHub 会自动识别并在新建 PR 时提示填写。 --- # 🔧 Bonus: 本地 commit message 检查(可选) 如果你想强制开发者本地提交前符合规范,可以引入以下工具: | 工具 | 功能 | | ------------ | -------------------- | | `commitlint` | 检查 commit message 格式 | | `husky` | Git Hook 工具,拦截不合规范提交 | > 我可以帮你生成一套 `husky + commitlint` 配置脚本,只需一条命令初始化,是否需要? --- # ✅ 总结 通过以上模板和规范: * 所有提交信息具备一致结构(支持自动解析) * PR 审核人快速了解改动内容 * Changelog 自动生成高质量文档 * GitHub Release 页面完整展示变更 --- 是否还需要: * ✅ `CHANGELOG.md` 自动更新写入提交并 push * ✅ `git-cliff.toml` 适配这些 commit 格式的配置文件 * ✅ `semantic-release` 风格自动打 tag + publish 欢迎继续补充需求,我可以为你生成一个一体化版本发布流水线。 🔍 **简短回答**: > ❌ **`softprops/action-gh-release@v2` 只能用于 GitHub,不支持 Gitea**。 它底层依赖 GitHub 的 REST API(通过 `GITHUB_TOKEN` 环境变量),而 **Gitea 虽然界面类似 GitHub,但 API 与权限模型不兼容**,无法直接复用这个 Action。 --- ## ✅ 为什么你看到“只打了 tag,没有发布内容”? 那是因为你目前只做了 `git tag` + `git push --tags`,这只会: * 在 Gitea 上显示标签 * ❌ 不会创建 Release 页面(除非手动或调用 API) --- ## ✅ 正确做法:Gitea 上自动创建 Release 的两种方式 ### ✅ 方式一:使用 Gitea 的官方 Release API(手动请求) Gitea 提供了 [Create Release 接口](https://try.gitea.io/api/swagger#/repository/repoCreateRelease): ``` POST /repos/{owner}/{repo}/releases ``` 请求体示例: ```json { "tag_name": "v1.2.3", "name": "Release v1.2.3", "body": "更新内容如下:\n- 新增功能\n- 修复 bug", "draft": false, "prerelease": false } ``` 你可以通过 GitHub Actions 的 `curl` 脚本发请求: ```yaml - name: Publish Gitea Release run: | curl -X POST "$GITEA_API_URL/repos/$OWNER/$REPO/releases" \ -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/json" \ -d @- < 🚨 注意:你需要在 Gitea 上创建一个 **访问 Token** 并存入 `GITEA_TOKEN` Secrets。 --- ### ✅ 方式二:使用社区版支持 Gitea 的 GitHub Actions(实验性) 有社区项目如 [`appleboy/gitea-release-action`](https://github.com/appleboy/gitea-release-action),它专门用于 Gitea: ```yaml - uses: appleboy/gitea-release-action@master with: base_url: https://your.gitea.server token: ${{ secrets.GITEA_TOKEN }} owner: your-username repo: your-repo tag: v1.2.3 name: Release v1.2.3 body: | - Feature 1 - Bugfix 2 files: | ./dist/*.zip ``` --- ## 🔐 如何生成 Gitea API Token? 1. 登录 Gitea 账号 2. 进入 `Settings` → `Applications` 3. 创建 `Personal Access Token` 4. 拷贝并存入 GitHub 项目 Secrets,如 `GITEA_TOKEN` --- ## ✅ 总结:Gitea 不支持 `softprops/action-gh-release`,你应该: | 目标 | 推荐方案 | | --------------------- | ------------------------------------------------------------ | | 在 Gitea 上自动创建 Release | 使用 `curl` + Gitea REST API 或 `appleboy/gitea-release-action` | | 上传文件并附加 Release | `files:` 字段支持上传 zip、tar.gz 等构建产物 | | 保留 changelog 作为描述内容 | 自动生成 changelog 再传给 `body:` | --- 如果你希望我帮你封装一份 **适配 Gitea 的完整发布流程 GitHub Actions 模板**,支持: * 自动生成 tag(日期/版本) * 自动生成 changelog * 上传产物并发布到 Gitea 我可以马上生成 YAML 文件,你只需要告诉我: 1. 你的 Gitea 域名 2. 是否需要上传文件到 Release(如 `.zip` 或 `.tar.gz`) 3. 是否希望自动打 tag(如 `release-YYYYMMDD`) 是否继续? ✅ \*\*可以!\*\*你完全可以在 GitHub Actions 中: 1. 使用 `actions/checkout@v4` 拉取当前仓库的代码 2. **配置另一个 GitHub 仓库的身份认证和远程地址** 3. **将代码 push 到那个“另外的 GitHub 仓库”** --- ## 🧩 场景应用举例 * 同步代码到一个“镜像仓库”(mirror) * 自动把当前项目发布到“组织模板仓库” * 提交构建产物或转换后的文件到另一个 repo 的分支(如 `gh-pages`) --- ## ✅ 实战示例:推送到另一个 GitHub 仓库 ### 假设: * 当前仓库为:`origin/source-repo` * 目标仓库为:`target-user/target-repo` * 你已有目标仓库的 `GH_TARGET_TOKEN`(推荐用 [personal access token](https://github.com/settings/tokens) 设置为 secret) --- ### ✅ 工作流程 YAML(核心步骤) ```yaml name: Mirror to Another Repo on: push: branches: - main jobs: sync-to-target: runs-on: ubuntu-latest steps: - name: Checkout current repo uses: actions/checkout@v4 - name: Configure git run: | git config --global user.name "github-actions[bot]" git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - name: Push to another GitHub repo env: TARGET_REPO: target-user/target-repo TARGET_TOKEN: ${{ secrets.GH_TARGET_TOKEN }} run: | # 替换远程地址为目标仓库 git remote add mirror https://x-access-token:${TARGET_TOKEN}@github.com/${TARGET_REPO}.git # 强制推送 main 分支 git push mirror main --force ``` --- ## 🔐 安全注意事项 | 设置项 | 建议说明 | | ----------------- | ------------------------------------ | | `GH_TARGET_TOKEN` | 使用另一个仓库 owner 生成的 token(带 `repo` 权限) | | 目标仓库为空/已有 | 会直接覆盖目标分支(使用 `--force` 时)请谨慎 | | 私有仓库同步 | 目标 repo 可是私有,只要 token 有权限即可 | --- ## 🔄 可选增强功能 | 目标 | 方法 | | --------------------- | ------------------------------------------ | | 只同步某个子目录 | 使用 sparse-checkout 或 `cp -r dir` 后 re-init | | 推送为特定分支(如 `gh-pages`) | `git push mirror HEAD:gh-pages` | | 构建后产物推送(如 `/dist`) | 手动 `git init` + commit + push 到另 repo | | 自动创建 release 并上传文件 | 搭配 `softprops/action-gh-release@v2` | --- ## ✅ 总结 | 操作项 | 是否支持 | 方法说明 | | ---------------- | ---- | ------------------------ | | 拉取本仓库最新代码 | ✅ | `actions/checkout@v4` | | 推送到另一个 GitHub 仓库 | ✅ | 设置远程地址 + token 推送 | | 支持推送构建产物 | ✅ | 可以 push 到目标 repo 的分支 | | 支持 push tag | ✅ | `git push mirror --tags` | --- 如果你希望我根据你的实际场景(如同步哪个目录、推送哪个分支、构建产物自动 commit)**定制一份完整工作流**,只需告诉我目标 repo 和目标用途,我可以直接帮你生成。是否继续? 非常好,这是一个非常实用的需求场景: > ✅ **在 GitHub Actions 中从当前仓库生成一个新 tag(如版本号或日期 tag),然后将代码 + tag 推送到另一个 GitHub 仓库(比如镜像仓库)** --- ## 🧩 应用场景示例 * 自动构建发布版本 → 推送到“发布仓库” * 文档仓库自动构建 → 推送带 tag 到另一个公开仓库 * 多组织协作,主仓库打 tag 后同步代码 + 标签到其他仓库 --- ## ✅ 完整工作流(核心逻辑) ### 假设 * 当前仓库:`you/source-repo` * 目标仓库:`your-org/target-repo` * 你已有目标仓库的 token,存为 `GH_TARGET_TOKEN` secret * 要创建的 tag 格式为:`release-YYYYMMDD-HHmm` --- ### ✅ GitHub Actions Workflow 示例 ```yaml name: Tag and Mirror to Another Repo on: workflow_dispatch: # 手动触发(也可以改成 push、release 等) jobs: tag-and-push: runs-on: ubuntu-latest steps: - name: Checkout source repo uses: actions/checkout@v4 - name: Generate new tag id: tag run: | new_tag="release-$(date +'%Y%m%d-%H%M')" echo "NEW_TAG=$new_tag" >> $GITHUB_ENV echo "tag=$new_tag" >> $GITHUB_OUTPUT - name: Create new git tag run: | git config --global user.name "github-actions[bot]" git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" git tag $NEW_TAG - name: Add remote for target repo and push code + tag env: TARGET_REPO: your-org/target-repo TOKEN: ${{ secrets.GH_TARGET_TOKEN }} run: | git remote add target https://x-access-token:${TOKEN}@github.com/${TARGET_REPO}.git # 推送代码和 tag 到目标仓库 git push target HEAD:main --follow-tags git push target $NEW_TAG ``` --- ## 🧪 效果说明 | 动作 | 说明 | | --------------------------- | ----------------------------------- | | `git tag $NEW_TAG` | 创建新的本地标签(如 `release-20250727-1730`) | | `git push target $NEW_TAG` | 推送该标签到目标仓库 | | `git push target HEAD:main` | 将当前分支代码推送到目标仓库的 `main` 分支 | --- ## ✅ 可选增强(按需添加) | 功能 | 示例方法 | | | ------------------------- | --------------------------------------------- | ---------------------- | | 推送为其他分支(如 `release`) | `git push target HEAD:release` | | | 生成 changelog 或标注到 tag 内容中 | 可用 `git-cliff`、`conventional-changelog` 生成信息 | | | 上传构建产物到目标仓库的 release | 使用 GitHub API 或 `softprops/action-gh-release` | | | 判断 tag 是否已存在,避免重复发布 | 用 \`git tag | grep "\$NEW\_TAG"\` 判断 | --- ## ✅ GITHUB\_TOKEN vs PAT(Personal Access Token) * **你不能用默认的 `${{ secrets.GITHUB_TOKEN }}` 推送到另一个 repo** * **必须用另一个 repo 的 PAT(访问令牌)**,带有至少 `repo` 权限 --- ## 🎯 总结 | 任务 | 是否可行 | 方法关键点 | | --------------------- | ---- | ----------------------------------------- | | 在当前仓库打 tag | ✅ | `git tag $NEW_TAG` | | 推送 tag 到另一个 GitHub 仓库 | ✅ | `git push target $NEW_TAG` | | 同时推送代码和 tag | ✅ | `git push target HEAD:main --follow-tags` | --- 如你还想同步: * 🔄 只推某目录内容(如 `/dist`、`/docs`) * 📁 推送为 gh-pages 或 release 分支 * 📦 推送 Release 附件(zip/tar) 我可以给你写一个增强版本。是否需要我继续定制? 好的,我们来定制一个更**高级实战版 GitHub Actions 工作流**,用于从当前仓库: ### ✅ 构建产物 → 推送到另一个 GitHub 仓库指定目录和分支(如 `release` 或 `gh-pages`),并打上自动生成的 tag。 --- # 🧭 你的需求拆解如下: | 步骤 | 动作 | | ------------------ | ------------------------------ | | ✅ 构建产物 | 例如打包 `dist/` 或构建网站输出 | | ✅ 创建版本 tag | 如 `release-20250727-1810` | | ✅ 初始化目标 repo | 初始化空 Git 仓库,复制构建产物进去 | | ✅ 推送到目标仓库的指定分支 | 如 `gh-pages` 或 `release` | | ✅ 可选:生成 Release 页面 | 用目标 repo token + GitHub API 实现 | --- # ✅ 示例场景设定(你可以修改) * 当前仓库构建出:`dist/` 目录 * 要推送到目标仓库:`your-org/target-repo` * 推送分支:`gh-pages` * Tag 格式:`release-YYYYMMDD-HHmm` * 目标仓库凭据保存在 secret:`GH_TARGET_TOKEN` --- ## 📄 GitHub Actions 工作流(生产级模板) ```yaml name: Build & Deploy to Target Repo on: workflow_dispatch: push: branches: - main jobs: build-and-push: runs-on: ubuntu-latest steps: - name: Checkout source repo uses: actions/checkout@v4 - name: Set up Node (如有构建) uses: actions/setup-node@v4 with: node-version: 20 - name: Build project run: | # 示例构建命令,你可以替换为实际的构建流程 npm ci npm run build # 输出在 dist/ - name: Create new tag id: tag run: | NEW_TAG="release-$(date +'%Y%m%d-%H%M')" echo "NEW_TAG=$NEW_TAG" >> $GITHUB_ENV echo "tag=$NEW_TAG" >> $GITHUB_OUTPUT - name: Push dist/ to target repo branch env: TARGET_REPO: your-org/target-repo TARGET_BRANCH: gh-pages TARGET_TOKEN: ${{ secrets.GH_TARGET_TOKEN }} run: | cd dist git init git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git remote add origin https://x-access-token:${TARGET_TOKEN}@github.com/${TARGET_REPO}.git git checkout -b $TARGET_BRANCH # 提交构建产物 git add . git commit -m "🚀 Deploy from source-repo@$GITHUB_SHA" # 创建 tag git tag $NEW_TAG # 强制推送分支和 tag git push origin $TARGET_BRANCH --force git push origin $NEW_TAG - name: ✅ Done run: echo "✅ 已将 dist/ 推送到 ${TARGET_REPO}:${TARGET_BRANCH} 并创建 tag $NEW_TAG" ``` --- ## ✅ 效果 * `dist/` 目录变成了目标仓库的 `gh-pages` 分支内容 * 创建了一个 tag,如 `release-20250727-1810` * 可用于 GitHub Pages / 发布仓库 / 组件包仓库 等 --- ## 💡 可选增强 ### 1. 推送 zip 文件到目标仓库的 Release 页面 你可以增加一个 job,用 [`softprops/action-gh-release`](https://github.com/softprops/action-gh-release) 或 \[GitHub API + curl] 将 `dist.zip` 作为 Release 附件上传(如果目标仓库也是 GitHub 的话)。 --- ### 2. 使用 `rsync` 同步子目录内容(不是覆盖整个 repo) 适用于目标仓库已有部分内容,只想增量更新。 --- ### 3. 支持多个目标仓库(配置 matrix) ```yaml strategy: matrix: repo: [your-org/repo1, your-org/repo2] ``` --- ## 🧪 Debug & 测试建议 * 先用 `workflow_dispatch` 手动测试,观察构建和 push 日志 * 检查目标 repo 权限:token 必须对其拥有 `write` + `push` 权限 * 使用 `git log --oneline` 确认 tag 是否正常创建 --- ## 📦 如果你需要我帮你: * 改为 Python/Java 项目构建产物流程 * 同步到 Gitea、Gitee 或私有 GitLab 仓库 * 添加 Release Notes、生成 SHA256 文件、通知钉钉/飞书/Slack 我可以继续为你定制补充。是否需要?