通过GitHub Actions构建和部署Jekyll网站
目录
我已经有什么
使用Github动作创建相同的内容
a)构建Jekyll站点
b)通过SSH连接到我的服务器并部署
奖励:在页脚中显示提交ID/内部版本号
在本文中,您将学习如何构建Jekyll站点并通过SSH连接到我的服务器并进行部署。您将看到完整的解决方案,作为奖励,您将学习如何在页脚中显示“提交ID/内部版本号”。
直到现在,我博客的源代码都在Bitbucket上,并且在每次提交时,该站点是使用Jekyll构建的,然后通过SSH上的rsync部署到我的webspace,所有这些都使用了Bitbucket管道。
最近,我将存储库移至GitHub…,因为它位于Mercurial存储库中,而Bitbucket将在几周内放弃对Mercurial的支持。我决定将存储库移至GitHub,并了解如何使用GitHub Actions设置相同的构建/部署。
我已经有什么
构建和部署该站点的大多数“逻辑”已经在两个shell脚本中。它是这样的:
- ci-build.sh(源代码):
- 在CI服务器上运行
- 执行Jekyll来构建站点(并期望在具有预先可用的Jekyll安装的环境中运行!)
- 将结果保存到.tar.gz存档
- CI服务器通过SSH 通过rsync将存档复制到我的Webspace上的temp文件夹中
- ci-deploy.sh(源代码):
- 由CI服务器通过SSH直接在我的Web空间(不是在CI服务器上!)执行
- 将档案解压缩到另一个临时文件夹中,并将其rsync到我的域指向的文件夹中
有关更详尽的解释(以及解释各行功能的脚本的带注释版本),请阅读此篇文章。
存在shell脚本,以便我在切换CI提供程序时可以重新使用它们...因此,为了迁移到GitHub Actions,我根本不需要更改它们,我只需要替换特定于提供程序的设置文件,该文件“调用”脚本。
Bitbucket的现有YAML文件非常简单:
步骤1:使用jekyll/builder Docker镜像运行ci-build.sh并将构建目录另存为工件。
步骤2:将工件从步骤1 同步到Web服务器,然后在服务器上执行ci-deploy.sh。
这两部分都很短,因为Bitbucket Pipelines在后台做了很多工作:
- 对于Docker,我只需要提供镜像名称
- 对于SSH,我根本不需要设置任何东西,只需将我的密钥保存在Bitbucket的UI中——其他所有内容都会在后台自动处理。
使用Github动作创建相同的内容
最后,我开始使用它了——但是与Bitbucket Pipelines相比,在GitHub Actions中执行相同的步骤感觉“不完善”(稍后会详细介绍)。
a)构建Jekyll站点
这是相当简单的,除了GH Actions不只是让你指定任何Docker镜像的名字,然后执行构建…只有“默认”Windows/Linux/Mac虚拟机可用。
我不想在该计算机上手动编写Jekyll的安装脚本,因此我搜索了jekyll/builder Docker镜像的示例,并在GH Actions的启动程序工作流程存储库中找到了解决方案:
steps:
- uses: actions/checkout@v2
- name: Build the site in the jekyll/builder containerrun: |docker run \-v $:/srv/jekyll -v $/_site:/srv/jekyll/_site \jekyll/builder:latest /bin/bash -c "chmod 777 /srv/jekyll && jekyll build --future"
我只需要将调用添加到ci-build.sh并选择正确的Jekyll版本,所以就这样更改了docker运行行:
run: |docker run \-v $:/srv/jekyll -v $/_site:/srv/jekyll/_site \jekyll/builder:3.2.1 /bin/bash -c "chmod +x ci-build.sh && ./ci-build.sh"
(注意:3.2.1 对我来说是正确的Jekyll版本,因为它与我在Windows计算机上本地使用的可移植Jekyll版本匹配。)
这看起来比它的Bitbucket复杂得多……但是,另一方面,我不必自己调用,我在Bitbucket和GitHub的两种情况下都复制并粘贴了结果。
b)通过SSH连接到我的服务器并部署
这花了我很长时间,也拉了很多头发。我不是SSH专家,如上所述,Bitbucket Pipelines保护了我免受大多数攻击,尤其是在构建计算机上正确设置了密钥。
对于GH操作,也有很多的由社区制作的actions是关于SSH的 。
我尝试了所有这些,但什么都没做,我总是收到“主机密钥验证失败 ”错误。
最后,我找到了这个解决方案:
- name: "Prepare SSH key and known hosts"run: |mkdir -p ~/.sshecho "$" > ~/.ssh/id_rsachmod 600 ~/.ssh/id_rsassh-keyscan github.com >> ~/.ssh/known_hostsssh-keyscan git.eu.s5y.io >> ~/.ssh/known_hosts
我尝试了其他类似的“手动”解决方案,将密钥保存在文件中并执行ssh-keyscan …,但是语法和/或命令始终略有不同,因此这个最终对我有用。这是我根据此修改的步骤:
- name: "Prepare SSH key and known hosts"run: |mkdir -p ~/.sshecho "$" > ~/.ssh/id_rsachmod 600 ~/.ssh/id_rsassh-keyscan $ >> ~/.ssh/known_hosts
- name: Run deploy scriptrun: |rsync -rSlh --stats build/ $@$:$/tarssh -o StrictHostKeyChecking=yes $@$ 'bash -s' -- < build/ci-deploy.sh $
当然,必须将某些变量保存在存储库的secrets中(https://github.com/USER/REPO/settings/secrets):
- KEY:我的私人SSH密钥
- HOST:christianspecht.de (实际上,这不是秘密……)
- USERNAME:我的网站空间上的SSH用户名
- WEBPATH:网站空间的完整路径,例如/www/htdocs/MY_ACCOUNT_NAME/blog
完整的解决方案
就这样_完整的工作ci.yml:
name: Jekyll site CIon:push:branches: - master jobs:build_job:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Build siterun: |docker run \-v $:/srv/jekyll -v $/_site:/srv/jekyll/_site \jekyll/builder:3.2.1 /bin/bash -c "chmod +x ci-build.sh && ./ci-build.sh"- name: Upload artifactuses: actions/upload-artifact@v1with:name: buildpath: builddeploy:runs-on: ubuntu-latestneeds: build_jobsteps:- uses: actions/download-artifact@v1with:name: build- name: "Prepare SSH key and known hosts"# https://github.com/symfony/cli/issues/227#issuecomment-601680974run: |mkdir -p ~/.sshecho "$" > ~/.ssh/id_rsachmod 600 ~/.ssh/id_rsassh-keyscan $ >> ~/.ssh/known_hosts- name: Run deploy scriptrun: |rsync -rSlh --stats build/ $@$:$/tarssh -o StrictHostKeyChecking=yes $@$ 'bash -s' -- < build/ci-deploy.sh $
奖励:在页脚中显示提交ID/内部版本号
一切正常后,我决定在网站的页脚中添加“从具有构建号123的提交xyz构建”行。
从Jekyll的角度来看,这很容易。只是:
- 在主_config.yml中为提交ID(带有虚拟值)添加新的网站变量,并在网站上的某处显示其内容
- 在构建时,动态创建具有实际提交ID 的附加_config-github.yml,并将其传递到原始配置文件之后的Jekyll调用(因此,提交ID会覆盖主配置文件中的ID)
- 实际的提交ID来自构建运行器设置的环境变量,对于GitHub Actions,它是$ GITHUB_SHA,其中包含提交ID。
这是这些更改的提交 ——但它不能按原样工作。构建成功,但是完成站点中的提交ID为空。
原来,罪魁祸首是我在Docker容器中运行构建的事实。实际的GitHub Actions“运行程序 ” (运行整个操作的虚拟Ubuntu计算机)知道环境变量,但是它不会自动将它们传递给我正在使用的Docker容器(实际上是在构建Jekyll站点)。
解决方案是将变量直接传递到我执行Docker的那一行中的ci-build.sh中。
通过GitHub Actions构建和部署Jekyll网站相关推荐
- Vue项目自动部署【精简版】NuxtJS + GitHub Actions + Linux 自动部署学习(包含阿里云Linux ECS购买过程、传统部署流程、pm2、Github Actions)
购买阿里云Linux服务器 如果已有服务器请直接跳转到[传统部署方式] 登录阿里云,访问 云服务器 ECS 购买地址:https://ecs-buy.aliyun.com/ 也可从首页导航菜单进入. ...
- vuepress-theme-reco + Github Actions 构建静态博客,部署到第三方服务器
最新博客链接 Github链接 查看此文档前应先了解,vuepress基本操作 参考官方文档进行配置: vuepress-theme-reco VuePress SamKirkland / FTP-D ...
- GitHub Actions构建镜像并部署服务
目的 通过GitHub的Actions来(白嫖)部署.Net服务到阿里云服务器. 环境准备 需要一个阿里云服务器并且该服务器还安装了docker环境,如果环境安装不清楚可以查看之前的文章. 创建镜像仓 ...
- 使用Github Actions构建、发布和部署NuGet软件包
介绍 在DevOps的现代时代,自动化已变得越来越流行,而创建/上传软件包已成为过去.而且,软件包的数量在开发人员的生活中日益增加.因此,在NuGet.org上手动构建.发布和部署所有软件包并不容易. ...
- 使用 GitHub Actions 来构建应用程序
使用 GitHub Actions 构建应用程序 写在前面 开始 Action 环境变量/加密密码 默认环境变量 自定义环境变量 使用环境变量 其他类型变量 加密密码 创建加密密码 使用加密密码 学完 ...
- 使用内网云+GitHub Pages免费部署动态网站
目录 一.失败的经历 1.花生壳 2. nat123 3. 网云穿 4. cpolar 5. ngrok 6.金万维快解析 7.神卓互联 8.内网云(neiwangyun.net) 9.localho ...
- GitHub Actions 入门教程
https://jiangren.com.au/blog/github-actions 一.GitHub Actions 是什么? 大家知道,持续集成由很多操作组成,比如抓取代码.运行测试.登录远程服 ...
- 如何能在git bash中使用mvn命令_使用Github Actions完成CI/CD工作
在本文中,我们将介绍如何使用 Github Actions 自动化开发部署工作流,使版本控制和 CI/CD 平台在同一个地方完成. 自2019年开始,github便提供了CI/CD工具,对于publi ...
- 在 Kubernetes 上执行 GitHub Actions 流水线作业
GitHub Actions 是一个功能强大."免费" 的 CI(持续集成)工具. 与之前介绍的 Tekton 类似,GitHub Actions 的核心也是 Pipeline a ...
最新文章
- python3.7安装-Linux安装python3.7
- github文件上传全流程-新手入门系列
- [转]Intellij idea创建javaWeb以及Servlet简单实现
- 这10道springboot常见面试题你需要了解下 1
- java override 用法_Java中@Override的作用
- activiti流程变量
- 面试云计算岗位时这些面试题不能错过
- django开发个人博客系统
- 光有想法怎么开技术公司?
- 层次低的人有什么特点
- 更新后的微信新功能,你知道吗?
- 被小伙伴要出来的文章[0]:英语学习
- 计算机拨打比赛策划书,电脑打字擂台赛活动策划书
- 实测百度如流:精致又豪横! AI协同办公应有的样貌
- Process finished with exit code 135 (interrupted by signal 7: SIGEMT)
- 2013年节假日安排公布 春节假期2月9日至15日
- 交通计算机专业硕士论文,基于强化学习的交通拥堵控制方法研究-计算机技术专业论文.docx...
- Mysql中find_in_set()函数与in()函数的用法
- 运筹说 第63期|论文速读之无人机车辆路径问题
- Python 阶梯电价
热门文章
- gitlab php自动化测试,自动化发布-GitLab WEB Hooks 配置
- 分散mysql的写入压力_缓解MySQL写入压力和主从延迟的尝试
- python min函数时间复杂度_作为Python程序员,你真的会用max()和min()函数吗?
- UI设计灵感|精美的登录页让你对这些网站好感倍生!
- 时尚高端电商网页设计素材
- 关于秋收秋季的丰收插画素材,收获满足
- linux显卡驱动未加载,Linux下无显卡驱动的解决办法
- svn增量打包部署_超详细的jenkins持续集成工作原理、功能、部署方式等介绍
- C++ 虚函数 纯虚函数 抽象类 代码示例
- CUDA中的复数定义、开内存空间以及运算