双十一的时候,看着腾讯云有不小的折扣,本着亏死🐴哥的想法,买了一年的服务器😝
...
时光荏苒,一直闲置到现在...
今天看到Gayhub的 actions 的功能,决定尝试一番,也踩了不少坑,就此记录下来
start
什么是action
大家知道,持续集成由很多操作组成,比如抓取代码、运行测试、登录远程服务器,发布到第三方服务等等。GitHub 把这些操作就称为 actions。 ——《GitHub Actions 入门教程》 阮一峰
GitHub Actions 有一些自己的术语。
- workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。
- job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。
- step(步骤):每个 job 由多个 step 构成,一步步完成。
- action (动作):每个 step 可以依次执行一个或多个命令(action)。
在github上创建项目
我的项目是基于 midway 框架的一个后端应用。
创建 Actions
点击 Actions ,创建一个新的 workflow

选择nodejs的模板,按照项目自行选择,

这时候会看见一个yml
文件,右边是 actions 的市场,我觉得类似于 docker 的镜像,作用是提高复用率,减少重复劳作。
# 这是基础模板
# 这个 workflow 的名字,可以随意命名
name: Node.js CI
# 触发条件
on: [push]
jobs:
# 一个名为 build 的 job
build:
# 虚拟机环境
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [8.x, 10.x, 12.x]
steps:
# 一个step
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- run: npm install
- run: npm run build --if-present
- run: npm test
env:
CI: true
当你 push 代码的时候,github 就会开始执行这个文件定义的任务,当然这个例子不能直接满足我们的需求,我们需要对他进行改动。
修改 workflow
# hah, 现在看起来比之前丰满了很多
name: xxxx CI
# 触发条件修改为:当master分支,有push的时候,执行任务
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
# step1: 获取源码
- name: chekcout
uses: actions/checkout@v2
# step2: 将源码复制到服务器 #坑
- name: Deploy to Server
uses: easingthemes/ssh-deploy@v2.0.8
env:
# 这个地方的用法会在下面解释,简单的说就是一个变量
# 为了安全,被写在一个其他的地方
SSH_PRIVATE_KEY: ${{ secrets.TOKEN }}
REMOTE_HOST: 'xxx.xx.xxx.xxx'
REMOTE_USER: 'xxx'
SOURCE: ''
TARGET: '/xxxxxxx/xxxxxxx'
ARGS: '-avzr --delete'
# step3: 通过ssh连接服务器,执行安装和启动服务
# 其实可以在github提供的虚拟机里面完成代码的打包
# 但是node_modules太大了,我的服务及带宽太小,传输速度太慢了
- name: start server
uses: appleboy/ssh-action@master
with:
host: 'xxx.xx.xxx.xxx'
username: 'xxx'
key: ${{ secrets.TOKEN }}
script: |
cd /xxxxxxx/xxxxxxx
npm install
npm run stop
npm run build
npm run start
easingthemes/ssh-deploy@v2.0.8、appleboy/ssh-action@master 使用说明
坑 —— ssh如何使用私钥登录服务器?
这个坑不属于 actions,折腾了很久是因为easingthemes/ssh-deploy
无法连接服务器。
制作密钥对
登录服务器
[root@host ~]$ ssh-keygen
一路回车,会在root用户的家目录中生成一个.ssh的隐藏目录。内含两个密钥文件。id_rsa 为私钥,id_rsa.pub 为公钥。
在服务器上安装公钥
[root@host ~]$ cd .ssh
[root@host .ssh]$ cat id_rsa.pub >> authorized_keys
为了确保连接成功,请保证以下文件权限正确:
[root@host .ssh]$ chmod 600 authorized_keys
[root@host .ssh]$ chmod 700 ~/.ssh
设置 SSH,打开密钥登录功能
编辑 /etc/ssh/sshd_config 文件,进行如下设置:
RSAAuthentication yes
PubkeyAuthentication yes
PermitRootLogin yes
重启SSH服务
[root@host .ssh]$ service sshd restart
复制私钥到github
[root@host .ssh]$ cat id_rsa
复制文件,注意:要复制全,包括上下的 -------- BEGIN .... -----------
。
点击进入项目设置:

进入左侧的Secrets

添加一个 secret
name随意设置,需要和上面设置${{ secrets.TOKEN }}
对应上,value就可以将上面复制的私钥放进去,现在就可以正确的连接服务器了。
结论
真香啊!😬。希望对大家想尝试的人有帮助。整个workflow也很简陋,希望大🔥可以提意见,让我改进。
最后发个Demo成品地址。