使用私有仓库发布 GitHub Pages

验证私有库发布文章

相信已经成功使用github建站的朋友们肯定会有一个想法, 就是可不可以将文章仓库私有也能实现建站的功能呢?

答案是可以的, 本文就是一个将一个公共仓库站点私有化后的例子. 并将过程总结一下, 方便大家参考使用.

站点私有化过程的的变与不变

首先,使用github pages建站, 项目名就固定死了,必然是<用户名>.github.io
其次,如果有域名的话,像域名配置等一些配置也是需要放到 外露站点下的.

除此之外, 其他的内容就就是可以变的了.因为github.io站点最终暴露的就是一个编译好的web静态网站.
至于源码是不是在这里,无所谓的.之所以源码与静态站点放到一起,核心还是方便github的 action自动编译.

好了, 了解了这些核心要素, 我们可以操作的部分也就有了.
就像我们正常的开发流程一样,我们可以把整个网站的发布流程拆分为两部分: 打包发布.

其中打包可以在我们的私有仓库中进行, 然后将打包后的静态网站 发布到github.io公仓中.
这里就用到了github的 action 自动编译功能. 其会在我们提交代码的时候触发一个操作,
调用一段脚本命令执行.

而这段脚本的核心就是通过git 将编译后的静态站点push 到github.io公仓中.

流程如下:
发布流程图

操作步骤

  1. 先在github上创建一个私有仓库: private_repo.
  2. 将github.io的源码迁移到新的仓库中.
  3. 准备github跨仓库git 提交代码权限, 参考下一节github申请person token
  4. 在private_repo 的action 中创建打包脚本, 脚本内容参考附录1
    创建新action

github申请person token

第一步, 获取token

  1. 个人设置里找到入口
    person token 1
  2. 找到开发者设置
    person token 2
  3. 创建token
    person token 3

这一步一定要记住创建好的token, 因为后面要用,而且这个页面刷新后就没了.

其实有过使用ssh经验的朋友们应该已经意识到了, 这一步其实就是一个创建ssh公钥的过程. 只不过这个公钥是放到github服务器上了.

第二步, 私有库配置

有了token, 正常来说就能提交代码了. 但是要知道这个东西是放到脚本里的, 明文暴露还是不太安全.
所以我们要在私有库里将这个token配置成一个环境变量,通过环境变量引用的方式使用,这样就安全多了.

  1. 找到private_repo, 配置token环境变量
    person token 4
    person token 5
  2. 配置完后, 我们就可以在脚本里通过环境变量来使用token了.
1
${ { secrets.YOUR_REPO_SECRET_NAME } }

最后

可以尝试在私有库private_repo里提交文章了.

同时你会发现, github.io公仓里的内部全部被静态网站内容覆盖了. 不用担心,这是正常的.

附录1 : 完整脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# ci name
# ci 脚本名称
name: Deploy Jekyll site to public github repos

on:
# Runs on pushes targeting the default branch
# 当代码 push 到 main 分支时, 执行该脚本
push:
branches: ["main"]

# Allows you to run this workflow manually from the Actions tab
# 允许你 手动执行 这个脚本
workflow_dispatch:

# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
# GITHUB_TOKEN 的操作权限
permissions:
contents: read
pages: write
id-token: write

# Allow one concurrent deployment
concurrency:
group: "pages"
cancel-in-progress: true

# job 执行任务, 可以有多个, 默认并行运行, 可以通过 needs 关键字来设置依赖的其他 jobs
# step : 任务下的执行步骤, 一个job 会有多个步骤
# 操作: 一个step 下可以执行多个操作, 通常一行脚本为一个操作
jobs:
# Build job
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
# 准备ruby 环境
- name: Setup Ruby
uses: ruby/setup-ruby@0a29871fe2b0200a17a4497bae54fe5df0d973aa # v1.115.3
with:
ruby-version: '3.0' # Not needed with a .ruby-version file
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
cache-version: 0 # Increment this number if you need to re-download cached gems
# - name: Setup Pages
# id: pages
# uses: actions/configure-pages@v2
# 打包 jekyll
- name: Build with Jekyll
# Outputs to the './_site' directory by default
# run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}"
run: bundle exec jekyll build --verbose
env:
JEKYLL_ENV: production
# 更新 打tar包
# - name: Upload artifact
# # Automatically uploads an artifact from the './_site' directory by default
# uses: actions/upload-pages-artifact@v1

- name: 增加外露github文件
working-directory: ./_site # jekyll 默认 build 到 _site 目录,因此设置命令执行的目录为 ./_site
run: | # run 后面加个 ‘|’ 然后换行可以同时执行多个命令,每行一个
cp ../README.md .

- name: 部署_site到博客网站仓库
working-directory: ./_site
run: |
git init
git checkout -b main
git add -A
git -c user.name='your_name' -c user.email='your_email' commit -m 'anything'
git push "https://${ { github.actor } }:${ { secrets.YOUR_REPO_SECRET_NAME } }@github.com/YOUR_GITHUB_IO_REPO" HEAD:main -f -q
  • 将上面的your_name,your_email,anything 替换成自己的内容
  • YOUR_REPO_SECRET_NAME 替换成privat_repo的secret_token_name
  • YOUR_GITHUB_IO_REPO 替换成自己的github.io公仓

附录2 : github action 脚本简介

在github的action模块里创建了一个脚本后, 就会在项目的.github/workflows里创建一个对应的文件.

通过workflow 大致可以理解这个模块的功能, 就是一个工作流.
在一些操作执行(通常是提交代码)后, 触发一系列的后续自动化操作, 这些操作可以是并行的,也可以是串行的.

而这些后续操作是通过一些action脚本组织起来的. 整体上看,一个action由以下部分组成.

  • jobs: 任务. 最大的逻辑单元. 可以有多个. jobs 默认是并行运行,可以通过 needs 关键字来设置依赖的其他 jobs。
  • steps: 步骤. job的执行步骤. 顺序执行. 可以job可以有多个步骤.
  • runs: 操作. 也可以理解为指令(bash命令等). 通常一行脚本就是一个操作. 并非所有步骤都会运行操作,但是操作都是在步骤中运行的

无论是job,还是step, 都可以理解一组指令集合. 他们都是可以配置id的. 可以通过id来互相依赖, 互相调用.

其他的可以参考里的官方文档.

参考

常见脚本

github action 官方文档

免费使用私有仓库发布 GitHub Pages

通过 GitHub Actions 实现私有仓库的免费 Github Pages 部署


使用私有仓库发布 GitHub Pages
https://www.hancher.top/2022/09/13/site-github-repo-private/
作者
寒澈
发布于
2022年9月13日
许可协议