通过Github Action打包部署博客站点到云服务器

最近想重新开始写博客了,于是基于Astro搭建博客系统,开始只是将博客发布到github.io,后来自己申请了域名,就有了通过Github Actions将博客部署到云服务器的需求。

由于之前没有经验,在这个过程中遇到了一些问题,所以在这里记录一下这些问题及解决过程。

一、部署过程

整个部署交互时序图如下:

部署过程一共经过五个步骤:

  1. 推送代码: 开发人员将代码推送到github
  2. 触发构建: Github Actions服务被push事件触发,并开始执行时间定义的工作流(.github/workflows/*.yml
  3. 执行构建:yml文件中定义的工作流任务被执行,包括拉取镜像、拉取代码、安装依赖、构建等
  4. 执行部署: 当构建完成后,通过yml文件中声明的部署步骤,将资源部署到云服务器
  5. 查看变更: 当以上四步都完成了,我们打开博客站点,就可以看到最新的页面
  • 对应上面的过程,我们的yml文件如下:
yml 复制代码
name: Deploy to mysite
on:
  push:
    branches:
      - main
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout the repository using git
        uses: actions/checkout@v3
      - name: Install Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
      - uses: pnpm/action-setup@v3
        name: Install pnpm
        with:
          version: 8
          run_install: true
      - name: Install dependencies
        run: pnpm install
      - name: Build
        run: pnpm run build:mysite
      - name: Deploy to Server
        uses: easingthemes/ssh-deploy@main
        with:
          # 本地.ssh文件下的私钥id_rsa,存在secrets的PRIVATE_KEY中
          SSH_PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
          # 复制操作的参数。"-avzr --delete"意味部署时清空服务器目标目录下的文件
          ARGS: "-avz --delete"
          # 源目录
          SOURCE: "./dist/"
          # 部署目标主机
          REMOTE_HOST: ${{ secrets.HOST }}
          # 部署目标主机端口
          REMOTE_PORT: ${{ secrets.PORT }}
          # 登录用户
          REMOTE_USER: ${{ secrets.USER }}
          # 部署目标目录
          TARGET: ${{ secrets.TARGET }}

上面文件中的${{ secrets.PRIVATE_KEY }}代码,表示引用一个Github仓库中的一个密码配置,每个Github仓库都有这个配置项,可以自定义多个配置,下文会详细介绍如何配置。

二、用到的工具库和遇到的问题

序号 工具名称 工具类型 问题及原因
1 github 代码托管平台 不知道ssh key和环境变量在哪配
2 easingthemes/ssh-deploy SSH文件上传 SSH登录失败,配置的私钥格式不对
3 ssh & ssh-keygen Linux远程登录 生成的秘钥对格式不对

上面列举了我在配置的过程中遇到的一些问题,接下来我们就一个一个地解决上述问题。

三、SSH免密登录

由于部署过程我们需要让运行Github Action的服务器能够将文件上传到云服务器,需要通过SSHscprsync都是基于SSH进行数据传输的 )进行数据传输。

为了保障云服务器安全,我们不能直接将密码暴露给Github Action,因此我们需要实现SSH免密登录。

(一) SSH免密登录原理

  • SSH免密登录原理图

可以看出,SSH免密登录共分为六个步骤,其中前两个步骤是我们需要关注 ,而后面的四步SSH协议的内部实现,我们不用太关注。

(二)SSH秘钥对生成(坑点

  • 官方文档中给的生成方式(免密登录会失败,对应问题序号3)如下:
bash 复制代码
ssh-keygen -m PEM -t rsa -b 4096
  • 后来在issue中找到的成功的生成方式
bash 复制代码
ssh-keygen -t rsa -b 4096

执行完上面的命令,会生成两个文件,分别为~/.ssh/id_rsa(私钥)和~/.ssh/id_rsa.pub(公钥)。

(三)秘钥部署和验证

  1. 服务端部署: 我们将公钥拷贝到服务器上,并存到~/.ssh/authorized_keys文件中。
  2. 验证: 我们通过ssh命令登录对应服务器,不再需要密码,则SSH免密登录已成功启用了。

四、秘钥配置

现在,云服务器已经配置好了,接下来我们需要将生成秘钥以及部署到云服务器的相关配置配到Github上。

  1. 找到配置页面(位于Repository --> Settings --> Secrets And Variables --> Actions页面中),如下图:
  1. 点击New Secret按钮,进入新增页,填写并新增即可新增一个键值对,如下图:
  1. 坑点 :配置公钥的时候,公钥内容必须在最后添加回车换行,否则授权会失败(对应问题序号2

我们通过这个步骤配置的键值对,可以在我们的yml文件中通过${{ secrets.SOME_KEY }}来引用名为SOME_KEY的值,且这个值在yml中无法打印,如果尝试打印则看到的是***,以保障我们秘钥的安全。

总结

至此,我们的Github Action打包并部署到云服务之旅就圆满结束啦,在这个过程中我的主要收获:

  1. 学会了Github Action的基本使用
  2. 掌握了Github Action工作流配置文件(yml)访问密码键值对的配置及代码写法
  3. 了解了SSH免密登录的工作原理和实践知识
  4. 学会通过查阅github issue找到对应工具坑点及解决方案

由于笔者的水平所限,文章可能存在不足和谬误,恳请不吝指正^_^

相关推荐
王解8 小时前
Jest项目实战(4):将工具库顺利迁移到GitHub的完整指南
单元测试·github
油泼辣子多加8 小时前
2024年11月4日Github流行趋势
github
梓羽玩Python9 小时前
推荐一款用了5年的全能下载神器:Motrix!全平台支持,不限速下载网盘文件就靠它!
程序员·开源·github
小牛itbull16 小时前
ReactPress:重塑内容管理的未来
react.js·github·reactpress
鱼满满记1 天前
1.6K+ Star!GenAIScript:一个可自动化的GenAI脚本环境
人工智能·ai·github
IT-民工211101 天前
CI/CD 实践总结
运维·ci/cd·自动化
梦魇梦狸º1 天前
腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
docker·容器·github
Huazie1 天前
一篇搞定 Hexo Diversity 主题接入!支持多主题自由切换!
javascript·github·hexo
蚊子不吸吸2 天前
DevOps开发运维简述
linux·运维·ci/cd·oracle·kubernetes·gitlab·devops