最近写了个工具,须要在服务端运行,一开始直接使用transmit上传代码,可是每次更新代码都要同步,并且因为服务器在国外,速度贼慢,因此趁着放假搞了下代码自动部署。html
以前用过Github的Webhooks作过自动部署,原理就是本身服务器上启动一个服务,对外暴露一个接口,每次代码push到github时,github服务器会调用你的接口,收到请求后再执行代码部署。
此次决定换用Actions实现一个相似的功能,原理相似,代码push到github时,github服务器会执行你预设好的步骤,部署代码。要实现的功能就是:git
首先要实现登陆服务器,用帐户密码天然能够,可是不太安全,因此采用SSH密匙登陆的方式,步骤以下(参考mac 免密ssh登录配置不坑指南):github
本地建立公私匙对(我的以为新建一个专用的匙对比较好):npm
ssh-keygen -t rsa -C "github actions"
上传公匙到服务器ubuntu
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免密登陆 链接远程服务器bash
在.ssh目录下建立一个config文件, 写入服务器
Host alias-name # 别名,这里举例为 alias-name HostName 111.111.111.111 # 要登陆服务器域名或IP Port 22 # 要登陆服务器的端口 User root # 要登陆服务器的用户名
设置成功后就能够直接使用ssh alias-name
登陆服务器了!app
参考1:GitHub Actions 入门教程
参考2:使用 GitHub Actions 实现博客自动化部署ssh
具体过程不表,个人是这样的
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,大工告成!