如何强制执行GitHub Pages构建?

140

每个GitHub仓库都可以拥有或者成为)一个GitHub Pages网站,可以使用Jekyll构建。每次推送新提交时,GitHub都会构建该网站。
是否有一种方法可以在不推送新提交的情况下强制刷新Github Pages网站?


也许这符合他们的缓存策略?(https://dev59.com/N2cs5IYBdhLWcg3w0HOz#13106972) - VonC
2
实际上,您可以联系GitHub支持以获得确认,并在此处发布答案。这可能会帮助其他人。 - VonC
3
根据文档,GitHub Pages 每小时有最多10次构建的限制。根据我的经验,如果超出了这个限制,即使您提交了新的更改,也不会触发新的构建。 - Jakub Kukul
12个回答

185

来自GitHub支持,2014-06-07:

目前尚不能手动触发重建,除非将提交推送到相应的分支。


编辑:

如评论中Andy所指出的那样,您可以使用以下命令推送空提交:

git commit -m 'rebuild pages' --allow-empty
git push origin <branch-name>

编辑2:

由于 GitHub Actions 的支持,触发每日发布变得相当容易:https://dev59.com/82Af5IYBdhLWcg3w9mps#61706020


3
如果你和我一样幸运,也要检查Github的状态,因为它们可能会出现故障或在后台作业/构建方面出现问题。 - f01
tl,dr git log - nilon

26

如果您需要快速的脚本解决方案,请看这里。只需完成以下任务一次,然后在想要重建GitHub页面时运行脚本即可。

1. 为命令行创建个人访问令牌:

  • 按照官方帮助文档(点击此处)创建一个个人访问令牌。基本上,您需要登录GitHub账户并前往:设置 > 开发者设置 > 个人访问令牌 > 生成新令牌
  • 勾选repo范围。
  • 复制该令牌。

2. 创建以下脚本:

  • 创建名为RebuildPage.sh的文件,并添加以下行:

    #!/bin/bash
    curl -u yourname:yourtoken -X POST https://api.github.com/repos/yourname/yourrepo/pages/builds
    

    在此处:

    • yourname替换为您的GitHub用户名。
    • yourtoken替换为您复制的个人访问令牌。
    • yourrepo替换为您的存储库名称。

3.运行脚本:

  • 如果您使用Windows 10:

    • 如果尚未这样做,您需要设置Windows Subsystem for Linux。请按照此处进行操作。
    • 从脚本中删除第一行(#!/bin/bash)并将脚本另存为RebuildPage.bat。(即,将脚本文件名中的.sh替换为.bat
    • 上述步骤的替代方案:获取双击运行.sh文件的功能:

      • bash.exe设置为.sh文件的默认程序。
      • 打开regedit.exe并编辑HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open\command。 将(Default)值设置为:

        "C:\Windows\System32\bash.exe" -c " \"./$(grep -oE '[^\\]+$' <<< '%L')\";"
        
    • 现在,每当您想要重新构建GitHub页面时,双击该脚本即可。完成!

  • 如果您使用Linux/Mac,则运行该脚本与运行其他脚本相同。完成!

解决方案的附加说明:

此解决方案利用GitHub REST API v3的API。 这里 是该API的官方文档。


非常感谢您的回复,GH文档并没有明确说明页面需要触发构建的权限,所以您的回复帮了我很大的忙。祝好! - Mauricio Klein

18

现在有了 GitHub Actions,这变得轻而易举:

# File: .github/workflows/refresh.yml
name: Refresh

on:
  schedule:
    - cron:  '0 3 * * *' # Runs every day at 3am

jobs:
  refresh:
    runs-on: ubuntu-latest
    steps:
      - name: Trigger GitHub pages rebuild
        run: |
          curl --fail --request POST \
            --url https://api.github.com/repos/${{ github.repository }}/pages/builds \
            --header "Authorization: Bearer $USER_TOKEN"
        env:
          # You must create a personal token with repo access as GitHub does
          # not yet support server-to-server page builds.
          USER_TOKEN: ${{ secrets.USER_TOKEN }}

示例仓库: https://github.com/SUPERCILEX/personal-website/actions

Pages API: https://developer.github.com/v3/repos/pages/#request-a-page-build


用户令牌不是被添加到构建分支中吗?当我使用React应用程序构建时,它会自动删除,因为它会在gh-pages分支中添加静态chuck js。 - asing177

8

我有一个问题困扰了我一段时间,即使将工作推送到主分支,也不会在myapp.github.io上更改任何内容,原因有两个:

1 - 构建

无论我尝试多少次将我的工作推送到主分支,构建都不会启动。我通过修改Github在线编辑器中的文件来找到了解决方法(打开您的index.html并在Github网站上进行编辑,然后提交)。

2 - 缓存问题

即使成功构建后,在myapp.github.io上仍会看到完全相同的页面,使用Ctrl + Shift + R进行硬刷新也无法解决。如果使用Chrome浏览器,请检查您的页面,进入应用程序选项卡,在左侧菜单中选择“清除存储”,并在菜单底部单击“清除站点数据”。


7
即使我把更改推到GitHub存储库,今天我仍然无法看到更改。然后我检查了我的存储库设置以获取更多信息,在那里我可以看到,所有这些时间构建都失败了,这就是我无法看到更改的原因。

enter image description here

你可能会看到一条信息,内容为“您的网站正在遇到构建问题:无法构建页面。请稍后再试。”
然后我检查了我的最近提交,并试图找出导致这个问题的原因。最终我成功解决了这个问题。

enter image description here

标签中多了一个逗号(,),导致出现了这个问题。

enter image description here

如果您的.md文件存在任何问题,您将无法获得相关的错误消息。如果您遇到相同的问题,我建议您检查构建状态并比较更改。


7

1
看起来文档已经移动到此网址: https://docs.github.com/en/rest/reference/pages#request-a-github-pages-build - iamkroot

5

空提交对我不起作用,但基于@benett的回答,这个方法对我有用:

打开Postman,在此URL中创建一个新的请求:https://api.github.com/repos/[user_name]/[repo_name]/pages/builds (替换为您的用户名和仓库名),并选择POST方法。

在运行之前,转到 "header" 选项卡,并添加一个新的键 "Accept",其值为 "application/vnd.github.mister-fantastic-preview+json"。

现在可以运行它并再次访问您的页面。


这对我不起作用,我得到了{"message": "Not Found", "documentation_url": "https://developer.github.com/v3/repos/pages/#request-a-page-build"}。也许是因为我的存储库是私有的? - Cobertos
我也遇到了“未找到”问题,但我的仓库是公开的。 - Tim Daubenschütz

4
我刷新网页时遇到了麻烦,但我的 Github Actions 显示我的站点已经部署。
对我来说,切换发布源是个好办法。我将发布源从 master 切换到 content,然后再切换回 master。您可以在此处查看如何更改分支的发布源 how to change the publishing source of the branch here

2
我遇到了同样的问题,为了解决它,我开发了一个可以与调度程序一起使用并支持同时更新多个gh-pages的githu操作。

https://github.com/marketplace/actions/jekyll-update-github-pages-without-new-commit,这个操作可以在不生成新提交的情况下更新gh-pages。

name: Update all github pages

on:
  schedule:
    - cron: "30 0 * * *"

jobs:
  github-pages:
    runs-on: ubuntu-latest
    name: Update Github Pages Initiatives
    steps:
    - name: Jekyll update github pages without new commit
      uses: DP6/jekyll-update-pages-action@v1.0.1
      with:
        DEPLOY_TOKEN: ${{ secrets.GH_PAGES_DEPLOY_TOKEN }}
        USER: ${{ secrets.GH_PAGES_USER }}
        FILTER:  'is%3Apublic%20org%3Adp6'

记录操作


0

替代方案

您可能会收到来自GitHub的电子邮件,告诉您在将其推送到gh-pages时Jekyll未能成功构建您的网站。如果是这种情况,您可以尝试强制推送以触发另一个构建。

如果您使用了专用文件夹作为最终网站,比如一个public文件夹,您可以尝试重新构建该文件夹并将其添加到已提交的更改中。之后,您需要将这些文件分割到您的gh-pages分支中,并强制它们触发另一个构建,即使这些文件根本没有更改。下面的其他代码只是为了方便而删除了public文件夹的提交,并将其从本地文件系统中删除。

代码

git add public
git commit -am ":bug: triggering another jekyll build"
git push origin $(git subtree split --prefix public master):gh-pages --force
git reset HEAD~1
rm -rf public

提示

如果有未提交的更改不属于最终网站,您可以使用以下命令将它们存储。

git stash

接着运行上述命令手动强制执行Jekyll构建并取消存储。

git stash pop

参考资料


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接