背景
最近写了个工具,需要在服务端运行,一开始直接使用transmit上传代码,但是每次更新代码都要同步,而且由于服务器在国外,速度贼慢,所以趁着放假搞了下代码自动部署。
要实现的功能
之前用过Github的Webhooks做过自动部署,原理就是自己服务器上启动一个服务,对外暴露一个接口,每次代码push到github时,github服务器会调用你的接口,收到请求后再执行代码部署。
这次决定换用Actions实现一个类似的功能,原理类似,代码push到github时,github服务器会执行你预设好的步骤,部署代码。要实现的功能就是:
- push代码
- github actions runner登录自己的服务器
- 切到目录,拉取代码,重启服务
步骤
首先要实现登录服务器,用账户密码自然可以,但是不太安全,所以采用SSH密匙登录的方式,步骤如下(参考mac 免密ssh登陆配置不坑指南):
本地创建公私匙对(个人觉得新建一个专用的匙对比较好):
ssh-keygen -t rsa -C "github actions"
上传公匙到服务器
ssh-copy-id -i [公钥文件] user@host # user是你的ssh的用户,host是服务器地址,这时候还要输入密码。 # 例子:ssh-copy-id -i id_rsa.pub root@111.111.111.111
ssh-add(mac的坑点)
好一般别的系统到这就可以免密登陆了,但是mac并不这样。还要调用ssh-add
ssh-add -K [你的私钥文件,就是那个不加.pub结尾的文件] # 例如,ssh-add -K id_rsa
这时候就可以直接使用
ssh user@host
登录服务器了,如果你想,服务器IP每次都得手动输入,记不住,有没有更好的方式了?答案是,有。
以下可选,而且与本文的主要目的(部署代码)无关,参考mac ssh免密登录 连接远程服务器在.ssh目录下创建一个config文件, 写入
Host alias-name # 别名,这里举例为 alias-name HostName 111.111.111.111 # 要登录服务器域名或IP Port 22 # 要登录服务器的端口 User root # 要登录服务器的用户名
设置成功后就可以直接使用
ssh alias-name
登录服务器了!- 在github仓库中添加私匙
我们需要给github服务器授权在自己的服务器上执行一些命令,所以需要给它授权,把私匙给它。肯定不能明文写在代码里,放在那里呢?答案是Secrets中。在仓库的Settings中,将步骤1中生成的私匙添加到Secrets中(注意添加时Name是后面actions中要用到的)。一般会把私匙、服务器Host、服务器User都添加到Secrets中,这样,如果后续更改服务器或者登陆用户时就不需要改代码了。
2. 编写Actions文件
参考1:GitHub Actions 入门教程
参考2:使用 GitHub Actions 实现博客自动化部署
具体过程不表,我的是这样的
name: deploy
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: executing remote ssh commands
# 使用appleboy/ssh-action@master来执行命令
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_SECRET }}
script: cd </your/code/path> && git pull && npm install && <restart your service>
其中</your/code/path>
和<restart your service>
替换为自己的就可以了。
需要注意的时,其实没有办法直接让github actions runner直接登录我们的服务器并执行命令,所以需要使用appleboy/ssh-action@master
封装的actions。
OK,大工告成!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。