目录

我已经有什么

使用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网站相关推荐

  1. Vue项目自动部署【精简版】NuxtJS + GitHub Actions + Linux 自动部署学习(包含阿里云Linux ECS购买过程、传统部署流程、pm2、Github Actions)

    购买阿里云Linux服务器 如果已有服务器请直接跳转到[传统部署方式] 登录阿里云,访问 云服务器 ECS 购买地址:https://ecs-buy.aliyun.com/ 也可从首页导航菜单进入. ...

  2. vuepress-theme-reco + Github Actions 构建静态博客,部署到第三方服务器

    最新博客链接 Github链接 查看此文档前应先了解,vuepress基本操作 参考官方文档进行配置: vuepress-theme-reco VuePress SamKirkland / FTP-D ...

  3. GitHub Actions构建镜像并部署服务

    目的 通过GitHub的Actions来(白嫖)部署.Net服务到阿里云服务器. 环境准备 需要一个阿里云服务器并且该服务器还安装了docker环境,如果环境安装不清楚可以查看之前的文章. 创建镜像仓 ...

  4. 使用Github Actions构建、发布和部署NuGet软件包

    介绍 在DevOps的现代时代,自动化已变得越来越流行,而创建/上传软件包已成为过去.而且,软件包的数量在开发人员的生活中日益增加.因此,在NuGet.org上手动构建.发布和部署所有软件包并不容易. ...

  5. 使用 GitHub Actions 来构建应用程序

    使用 GitHub Actions 构建应用程序 写在前面 开始 Action 环境变量/加密密码 默认环境变量 自定义环境变量 使用环境变量 其他类型变量 加密密码 创建加密密码 使用加密密码 学完 ...

  6. 使用内网云+GitHub Pages免费部署动态网站

    目录 一.失败的经历 1.花生壳 2. nat123 3. 网云穿 4. cpolar 5. ngrok 6.金万维快解析 7.神卓互联 8.内网云(neiwangyun.net) 9.localho ...

  7. GitHub Actions 入门教程

    https://jiangren.com.au/blog/github-actions 一.GitHub Actions 是什么? 大家知道,持续集成由很多操作组成,比如抓取代码.运行测试.登录远程服 ...

  8. 如何能在git bash中使用mvn命令_使用Github Actions完成CI/CD工作

    在本文中,我们将介绍如何使用 Github Actions 自动化开发部署工作流,使版本控制和 CI/CD 平台在同一个地方完成. 自2019年开始,github便提供了CI/CD工具,对于publi ...

  9. 在 Kubernetes 上执行 GitHub Actions 流水线作业

    GitHub Actions 是一个功能强大."免费" 的 CI(持续集成)工具. 与之前介绍的 Tekton 类似,GitHub Actions 的核心也是 Pipeline a ...

最新文章

  1. python3.7安装-Linux安装python3.7
  2. github文件上传全流程-新手入门系列
  3. [转]Intellij idea创建javaWeb以及Servlet简单实现
  4. 这10道springboot常见面试题你需要了解下 1
  5. java override 用法_Java中@Override的作用
  6. activiti流程变量
  7. 面试云计算岗位时这些面试题不能错过
  8. django开发个人博客系统
  9. 光有想法怎么开技术公司?
  10. 层次低的人有什么特点
  11. 更新后的微信新功能,你知道吗?
  12. 被小伙伴要出来的文章[0]:英语学习
  13. 计算机拨打比赛策划书,电脑打字擂台赛活动策划书
  14. 实测百度如流:精致又豪横! AI协同办公应有的样貌
  15. Process finished with exit code 135 (interrupted by signal 7: SIGEMT)
  16. 2013年节假日安排公布 春节假期2月9日至15日
  17. 交通计算机专业硕士论文,基于强化学习的交通拥堵控制方法研究-计算机技术专业论文.docx...
  18. Mysql中find_in_set()函数与in()函数的用法
  19. 运筹说 第63期|论文速读之无人机车辆路径问题
  20. Python 阶梯电价

热门文章

  1. gitlab php自动化测试,自动化发布-GitLab WEB Hooks 配置
  2. 分散mysql的写入压力_缓解MySQL写入压力和主从延迟的尝试
  3. python min函数时间复杂度_作为Python程序员,你真的会用max()和min()函数吗?
  4. UI设计灵感|精美的登录页让你对这些网站好感倍生!
  5. 时尚高端电商网页设计素材
  6. 关于秋收秋季的丰收插画素材,收获满足
  7. linux显卡驱动未加载,Linux下无显卡驱动的解决办法
  8. svn增量打包部署_超详细的jenkins持续集成工作原理、功能、部署方式等介绍
  9. C++ 虚函数 纯虚函数 抽象类 代码示例
  10. CUDA中的复数定义、开内存空间以及运算