目录

创建SSH KEY

cd ~/.ssh
ssh-keygen -t rsa -C "username@email.com"

取名github20211003得到私钥和公钥:

github20211003  github20211003.pub

将公钥放入authorized_keys:

cat github_action.pub >> authorized_keys

配置Secrets

打开github项目,settings->左侧栏Secrets->New Repository secret

添加我们再actions工作流中会用到的一些敏感的数据,比如用户密码、路径等

比如我们下的workflow中使用到的:BLOG_DEPLOY_HOST,BLOG_DEPLOY_KEY…

根据workflow需要任意添加需要的数据。

创建Workflow

完整构建工作流:

name: microblog-go

on:
  push:
    branches: [ master ] #push master的时候触发
    paths-ignore: # 下列文件的变更不触发部署,可以自行添加
      - 'LICENSE'
      - '.gitignore'
      - 'README.md'      
  pull_request:
    branches: [ master ] #pull request 到master的时候触发
    paths-ignore: # 下列文件的变更不触发部署,可以自行添加
      - 'LICENSE'
      - '.gitignore'
      - 'README.md'  

jobs:

  build:
    runs-on: ubuntu-latest #使用最新的ubuntu虚拟环境
    steps:
    - uses: actions/checkout@v2  #使用这个action,checkout到虚拟环境

    - name: Set up Go
      uses: actions/setup-go@v2 # 虚拟环境搭建go环境
      with:
        go-version: 1.16 #指定1.16版本

    - name: Build
      run: go build -o microblog #在虚拟环境编译microblog应用

#     - name: Test
#       run: go test -v ./... #测试

    # 将编译出的二进制文件 scp 到我们的服务器
    - name: SCP Files 
      uses: appleboy/scp-action@master
      with:
        host: ${{ secrets.BLOG_DEPLOY_HOST }}  # Secrets中的配置:IP地址
        username: ${{ secrets.BLOG_DEPLOY_USER }}  # Secrets中的配置:登录用户名
        port: ${{ secrets.BLOG_DEPLOY_PORT }} # Secrets中的配置:端口
        key: ${{ secrets.BLOG_DEPLOY_KEY }} # Secrets中的配置:我们服务器上创建的ssh key的私钥内容
        source: 'microblog'  # 编译出的二进制文件名
        target: ${{ secrets.BLOG_DEPLOY_PATH }} # Secrets中的配置:scp 到我们服务器上的的目录

    # 通过ssh远程执行命令重启vps上的服务
    - name: SSH Remote Commands
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.BLOG_DEPLOY_HOST }}  # Secrets中的配置:IP地址
        username: ${{ secrets.BLOG_DEPLOY_USER }}  # Secrets中的配置:登录用户名
        port: ${{ secrets.BLOG_DEPLOY_PORT }} # Secrets中的配置:端口
        key: ${{ secrets.BLOG_DEPLOY_KEY }} # Secrets中的配置:我们服务器上创建的ssh key的私钥内容
        script: /bin/sh /home/tsingchan/shell/microblog.sh # Secrets中的配置:scp二进制文件到我们服务器上后需要执行的相关shell命令重启服务,
        #比如:killall -9 microblog && nohup .../microblog/microblog &  或是shell脚本

由于github actions从2021.09.20开始不再提供ubuntu16.04的虚拟环境,所以如果目标系统还是16.04时,有时在ubuntu-latest环境编译后的执行文件,在16.04下执行会报错,

所以就有了不得已粗暴工作流,直接ssh到目标机器pull代码并编译构建:

name: microblog-go

on:
  push:
    branches: [ master ]
    paths-ignore: # 下列文件的变更不触发部署,可以自行添加
      - 'LICENSE'
      - '.gitignore'
      - 'README.md'      
  pull_request:
    branches: [ master ]
    paths-ignore: # 下列文件的变更不触发部署,可以自行添加
      - 'LICENSE'
      - '.gitignore'
      - 'README.md'  

jobs:

  build:
    runs-on: ubuntu-latest
    steps:
    
    # 通过ssh远程执行命令重启vps上的服务
    - name: SSH Remote Commands
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.BLOG_DEPLOY_HOST }}  # Secrets中的配置:IP地址
        username: ${{ secrets.BLOG_DEPLOY_USER }}  # Secrets中的配置:登录用户名
        port: ${{ secrets.BLOG_DEPLOY_PORT }} # Secrets中的配置:端口
        key: ${{ secrets.BLOG_DEPLOY_KEY }} # Secrets中的配置:我们服务器上创建的ssh key的私钥内容
        script: /bin/sh /home/tsingchan/shell/microblog.sh # Secrets中的配置:scp二进制文件到vps服务器上后需要执行的相关shell命令重启服务,
        

microblog.sh具体内容

#!/bin/bash

cd /xxx/microblog-new/
/usr/bin/git pull origin master && /usr/local/go/bin/go build && chmod 755 ./microblog && killall -9 microblog
nohup ./microblog > microblog.log 2>&1 &
exit 0

可以考虑使用系统 systemctl 管理服务的方式,触发重启服务。详见:githubactions持续集成构建部署go站点服务

如何编写workflow

如何定义workflow自动触发

  • 设置push到main或release/*分支时触发

      on:
        push:
          branches:
          - main
          - release/\*
    
  • 设置pull request到main时触发

    on:
      pull_request:
        branches:
        - main
    
  • 设置每周一到周五的2点触发

    on:
      schedule:
      - cron: "0 2 * * 1-5"
    

更多详见:Events that trigger workflows

如何手动运行workflow

如果要手动运行workflow,需要配置workflow_dispatch,会在Actions面板展示"Run workflow"的按钮。

on:
  workflow_dispatch:

更多详见:Manually running a workflow

如何在不同的操作系统上执行我们的jobs

GitHub Actions提供了Linux、Windows、macOS的托管运行器(虚拟环境)。

我们可以通过runs-on指定job运行在什么操作系统(虚拟环境)上:

jobs:
  my_job:
    name: deploy to staging
    runs-on: ubuntu-18.04

可选择的虚拟环境类型有:

  • ubuntu-latest, ubuntu-18.04, or ubuntu-16.04
  • windows-latest or windows-2019
  • macos-latest or macos-10.15

注意:GitHub actions:Ubuntu 16.04 LTS 虚拟环境将于 2021 年 9 月 20 日移除 | GitHub 更新日志

更多信息详见:Virtual environments for GitHub Actions](https://docs.github.com/articles/virtual-environments-for-github-actions)

如何使用action

Actions是可重复使用的代码块,在github上的任何人都可以构建和分发actions。我们可以在GitHub Marketplace找到很多actions,当然github官方也提供了一些actions,参考:Actions repository

- name: Setup Node
  uses: actions/setup-node@v1
  with:
    node-version: '10.x'

更多详见:Workflow syntax for GitHub Actions

执行命令

我们可以在虚拟环境上执行命令,比如:

- name: Install Dependencies
  run: npm install

更多详见:Workflow syntax for GitHub Actions

如何一次跨多平台执行同一个job

我们还可以一次性跨多平台执行同一个job,比如在3个虚拟环境执行3个不同版本的node:

jobs:
  test:
    name: Test on node ${{ matrix.node_version }} and ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        node_version: ['8', '10', '12']
        os: [ubuntu-latest, windows-latest, macOS-latest]

    steps:
    - uses: actions/checkout@v1
    - name: Use Node.js ${{ matrix.node_version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node_version }}

    - name: npm install, build and test
      run: |
        npm install
        npm run build --if-present
        npm test

更多详见:Workflow syntax for GitHub Actions

如何有条件的执行step或job

比如,我们只想要push的时候才执行step,pull request的将不会触发:

steps:
- run: npm publish
  if: github.event\_name == 'push'

更多详见:Contexts and expression syntax for GitHub Actions

参考

github actions document

GitHub Marketplace · Actions to improve your workflow

Github Action 精华指南

使用Github Actions自动部署Golang应用到VPS服务器