Publii同步覆盖GitHub后,如何实现Azure静态网站自动部署?
静态HTML仓库自动部署最优方案
针对Publii全量覆盖GitHub仓库导致部署工作流丢失的问题,以下是几个可行的解决方案,按推荐优先级排序:
方案一:双仓库分离架构(最推荐)
通过两个仓库分别存储静态内容和部署配置,彻底避免覆盖冲突:
- 仓库A(静态文件库):仅用于接收Publii推送的静态HTML内容,无需任何配置文件。
- 仓库B(部署配置库):专门存放Azure静态Web Apps的部署工作流文件,独立于静态内容更新。
操作步骤
- 创建新的GitHub仓库A,作为静态文件的专属存储库。
- 在Publii中配置同步目标为仓库A,确保仅推送
public/rendered目录下的内容。 - 在仓库B中创建部署工作流文件
.github/workflows/azure-deploy.yml,示例内容如下:
name: Deploy to Azure Static Web Apps on: # 监听仓库A的推送事件,需通过仓库A的推送触发该工作流 repository_dispatch: types: [publii-published] # 可选:允许手动触发部署 workflow_dispatch: jobs: deploy: runs-on: ubuntu-latest steps: - name: 拉取静态文件仓库内容 uses: actions/checkout@v4 with: repository: 你的用户名/仓库A名称 path: static-files token: ${{ secrets.GH_PAT }} # 需提前创建拥有仓库A读取权限的GitHub PAT - name: 部署到Azure静态Web Apps uses: Azure/static-web-apps-deploy@v1 with: azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }} repo_token: ${{ secrets.GITHUB_TOKEN }} action: "upload" app_location: "./static-files" # 指向仓库A的静态文件目录
- 配置仓库A的推送触发:由于Publii会覆盖仓库A的所有文件,无法直接在仓库A中配置Actions,可通过Publii的自定义脚本功能,在推送完成后调用GitHub API向仓库B发送
repository_dispatch事件,触发部署工作流。
方案二:单仓库双分支策略
在同一个仓库中用两个分支分离静态内容和部署配置:
content分支:仅接收Publii推送的静态内容,无任何配置文件。main分支:存放Azure部署工作流及其他需要保留的配置文件,不受Publii更新影响。
操作步骤
- 在现有仓库中创建
content分支,初始可复制当前静态文件内容。 - 在Publii中配置同步目标为该仓库的
content分支,确保仅推送public/rendered目录内容。 - 切换到
main分支,创建部署工作流文件.github/workflows/azure-deploy.yml,示例内容:
name: Deploy to Azure Static Web Apps on: # 监听content分支的推送事件 push: branches: [content] # 可选:允许手动触发 workflow_dispatch: jobs: deploy: runs-on: ubuntu-latest steps: - name: 拉取content分支的静态内容 uses: actions/checkout@v4 with: ref: content - name: 部署到Azure静态Web Apps uses: Azure/static-web-apps-deploy@v1 with: azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }} repo_token: ${{ secrets.GITHUB_TOKEN }} action: "upload" app_location: "." # 静态文件位于当前目录
- 配置Azure静态Web Apps的部署源为
main分支的工作流,后续每次Publii推送到content分支时,都会自动触发部署。
方案三:本地Git钩子恢复工作流
通过本地Git的post-push钩子,在Publii推送完成后自动恢复被覆盖的工作流文件:
- 找到本地Publii网站项目的
.git/hooks目录(需显示隐藏文件)。 - 创建
post-push文件(无后缀),添加以下脚本:
#!/bin/bash # 拉取最新仓库内容避免冲突 git pull origin main # 从本地备份目录复制工作流文件到仓库 cp /本地备份路径/deploy.yml .github/workflows/deploy.yml # 提交并推送恢复的工作流文件 git add .github/workflows/deploy.yml git commit -m "恢复部署工作流文件" git push origin main
- 给
post-push文件添加可执行权限:chmod +x post-push
该方案依赖本地环境,仅适合单人开发场景,换设备需重新配置。
内容的提问来源于stack exchange,提问作者Steven Vanden Broucke
相关产品推荐
相关产品推荐

