验证私有库发布文章
相信已经成功使用github建站的朋友们肯定会有一个想法, 就是可不可以将文章仓库私有也能实现建站的功能呢?
答案是可以的, 本文就是一个将一个公共仓库站点私有化后的例子. 并将过程总结一下, 方便大家参考使用.
站点私有化过程的的变与不变
首先,使用github pages建站, 项目名就固定死了,必然是<用户名>.github.io 其次,如果有域名的话,像域名配置等一些配置也是需要放到 外露站点下的.用户名>
除此之外, 其他的内容就就是可以变的了.因为github.io站点最终暴露的就是一个编译好的web静态网站. 至于源码是不是在这里,无所谓的.之所以源码与静态站点放到一起,核心还是方便github的 action自动编译.
好了, 了解了这些核心要素, 我们可以操作的部分也就有了. 就像我们正常的开发流程一样,我们可以把整个网站的发布流程拆分为两部分: 打包 与 发布.
其中打包可以在我们的私有仓库中进行, 然后将打包后的静态网站 发布到github.io公仓中. 这里就用到了github的 action 自动编译功能. 其会在我们提交代码的时候触发一个操作, 调用一段脚本命令执行.
而这段脚本的核心就是通过git 将编译后的静态站点push 到github.io公仓中.
流程如下:
操作步骤
- 先在github上创建一个私有仓库: private_repo.
- 将github.io的源码迁移到新的仓库中.
- 准备github跨仓库git 提交代码权限, 参考下一节github申请person token
- 在private_repo 的action 中创建打包脚本, 脚本内容参考附录1
github申请person token
第一步, 获取token
- 个人设置里找到入口
- 找到开发者设置
- 创建token
这一步一定要记住创建好的token, 因为后面要用,而且这个页面刷新后就没了.
其实有过使用ssh经验的朋友们应该已经意识到了, 这一步其实就是一个创建ssh公钥的过程. 只不过这个公钥是放到github服务器上了.
第二步, 私有库配置
有了token, 正常来说就能提交代码了. 但是要知道这个东西是放到脚本里的, 明文暴露还是不太安全. 所以我们要在私有库里将这个token配置成一个环境变量,通过环境变量引用的方式使用,这样就安全多了.
- 找到private_repo, 配置token环境变量
- 配置完后, 我们就可以在脚本里通过环境变量来使用token了.
${ { secrets.YOUR_REPO_SECRET_NAME } }
最后
可以尝试在私有库private_repo里提交文章了.
同时你会发现, github.io公仓里的内部全部被静态网站内容覆盖了. 不用担心,这是正常的.
附录1 : 完整脚本
# 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 "$"
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 Actions 实现私有仓库的免费 Github Pages 部署
文档信息
- 本文作者:寒澈
- 本文链接:https://www.hancher.top/2022/09/13/github_repo_private/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)