github actions 初次体验

3,853 阅读3分钟

双十一的时候,看着腾讯云有不小的折扣,本着亏死🐴哥的想法,买了一年的服务器😝

...

时光荏苒,一直闲置到现在...

今天看到Gayhub的 actions 的功能,决定尝试一番,也踩了不少坑,就此记录下来

start

什么是action

大家知道,持续集成由很多操作组成,比如抓取代码、运行测试、登录远程服务器,发布到第三方服务等等。GitHub 把这些操作就称为 actions。 ——《GitHub Actions 入门教程》 阮一峰

GitHub Actions 有一些自己的术语。

  1. workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。
  2. job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。
  3. step(步骤):每个 job 由多个 step 构成,一步步完成。
  4. 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成品地址。

参考文章