Luna Tech

Tutorials For Dummies.

使用 GitHub Action 自动部署博客到远程服务器

2020-06-28


1. 背景

我是用一个 GitHub repo 来管理博客的 public folder,在这里先简单介绍一下我的博客管理及推送流程:

  1. 写博客;
  2. git push public folder 到 remote repo
  3. 然后我要 ssh 登录到云服务器,把最新的 public repo pull 下来

今天这篇文章的目的是把第三步直接通过 GitHub Action 来完成。

现在我的工作流是这样的:

  1. 写博客
  2. git push 到 remote repo

没有第三步了,因为 GitHub Action 自动部署,我不需要登录云服务器手动 pull repo。

Blog workflow

查资料

References:

https://frostming.com/2020/04-26/github-actions-deploy 我按照这个教程做出现了 permission denied 的问题。

https://juejin.im/post/5e1c23af6fb9a02ffd6eb495 这篇多了个步骤,要把 public key 加到 deploy key 里面,尝试了还是没用= =

https://juejin.im/post/5e5265026fb9a07ccd518610 总算找到一个和我一样遇到 ssh key 问题的人,根据文中的步骤解决了 permission 问题。

我总结的流程图

重点:

  1. remote server 的 authorized_keys 里面必须有一个【与 GitHub secret private key 相匹配的】public key
  2. 必须把 remote server 的 ssh config 设置正确(然后重启 ssh service)
  3. 修改 ssh folder permission(为了安全)

How to set up GitHub Action


2. 步骤详解 (SSH 部分)

1. 创建一个新的 ssh key pair(任意一台机器都行)

不要设置 passphrase 哦!!!

cd ~/.ssh
ssh-keygen -f github-deploy-key

2. 把 public key 加入到 authorized_keys 里面

如果不加进去的话,会遇到 Permission issue。

cat ~/.ssh/github-deploy-key.pub >> ~/.ssh/authorized_keys

3. 修改 ssh folder 权限

700:只有 owner 拥有读、写、执行权限。

sudo chmod 700 -R ~/.ssh

4. 设置 ssh 配置文件,打开密钥登录功能

sudo nano /etc/ssh/sshd_config

ssh config

我参考的文章 让我设置:

RSAAuthentication yes
PubkeyAuthentication yes

但是我查了下这两者的区别,发现:

也就是说,其实只要设置 PubkeyAuthentication 就行了。

2017 年的这个讨论区 thread 里面明确指出 RSAAuthentication 已经不支持了,让大家更换为 PubkeyAuthentication。

5. 重启 ssh 服务

service sshd restart

6. 复制 private key 到 GitHub repo -> setttings -> secrets

注意复制 private key 的时候要把全部的内容都复制进去!包括–begin 和–end 的部分。

cat ~/.ssh/github-deploy-key

add to secrets

也可以顺便设置 ssh_host 和 ssh_username.


4. 步骤详解(GitHub Action 部分)

1. 在 repo 的根目录创建 .github/workflows/xx.yml 文件

add yml file

这个 yml 文件就是用来配置 GitHub Action 的,下面是我参考的一个教程 里面给的模板。

如果想更进一步了解 GitHub Action Workflow 文件的语法,可以参考这个链接

name: Deploy Site

on:
  push:
    branches:
      - master # only run this workflow when there's a new commit pushed to the master branch

jobs:
  deploy: # job_id
    runs-on: ubuntu-latest # environment: use ubuntu

    steps: # automated steps
      - name: Checkout Repo # 1. checkout repo
        uses: actions/checkout@v2 # Use a third party action (https://github.com/actions/checkout)

      - name: Deploy to Server # 2. deploy to remote server
        uses: AEnterprise/[email protected] # Use a third party action (https://github.com/AEnterprise/rsync-deploy)
        env:
          DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }} # use pre-configured secret (the private key)
          ARGS: -avz --delete # must have this variable
          SERVER_PORT: "22" # SSH port
          FOLDER: ./ # folder to push (./ is the root of current repo)
          SERVER_IP: ${{ secrets.SSH_HOST }} # use pre-configured ssh_host value (e.g., IP or domain.com)
          USERNAME: ${{ secrets.SSH_USERNAME }} # use pre-configured ssh_username value
          SERVER_DESTINATION: /var/www/xxx/ # put your repo files on this directory of the remote server

2. commit change 并且 push 到 remote repo

现在你可以点击 action,然后看到你设置的 workflow。

3. 每次 master branch 有新的 commit,这个 action 就会执行~


5. 结语

有了这个 Action,我就不用每次更新博客 repo 之后再 ssh 登录到服务器去 pull repo 了~

设置好这个工作流之后,又给自己未来更新博客省了不少时间 (^-^)V

如果读者们有类似的需求,不妨跟着我的教程做一遍。

PS: 我们这里把 private key 放在了 GitHub Repo 的 Secret 里面,可能会有安全隐患,如果大家有好的解决方案,欢迎一起讨论~