使用github actin做CICD并集成git secrets

最近两天把一个项目的CICD流水线从jenkins迁移到github action,中间遇到一些问题,做个记录。
先放几个这两天看到的还不错的教程连接:

  1. 第一个是大佬阮一峰在2019年写的一个教程,浅显易懂,大佬还是大佬,那个时候action刚刚出来他就开始写教程了
    Github Actions 入门教程

  2. 第二个是github官方的工作流语法教程,建议把目录通读一遍,然后找到自己需要的部分详细阅读
    Workflow syntax for Github Actions

  3. 第三个是git secrets的官方repo,git secrets是一个可以用来扫描代码是否包含密码、用户名等敏感信息的工具
    git secrets


说明:

  1. 结合下面的yml文件看说明,并仔细查看yml文件中的注释,我把很多信息写在注释中了
  2. 我们的环境是github 企业版,自己托管的runner服务器,不同于github.com
  3. 我们采用了比较常见的方式来触发CICD job:当有分支发起pull request的时候会触发测试环境的CICD;当有代码merge到master分支后出触发生产环境的CICD
  4. 我选择把流水线的实际运行过程放在容器中,因为这样可以把所有的依赖都封装进容器,即使以后更换了runner的服务器,只要能运行docker就能进行编译
  5. 重要!!! 因为我是在workflow的配置文件(下面的yml)中配置git secrets的pattern(也就是git secrets –add xxxxx 命令),所以需要配置git secrets 不检测这个yml文件(git secrets –add –allowed .github/workflows/main.yml:.* ),不然git secrets 永远提示代码中含有私密信息,流水线也就会失败
  6. 重要!!! git secrets的配置信息在repo里面的 .git 目录里面,所以每次开始运行的时候都要记得删除这个repo,不然执行git secrets --scan的时候就会失败,rm -rf *不能删除隐藏目录,所以要单独执行rm -rf .git才行,4和5两点花了我将近一天时间。。。
  7. 我利用if语法和分支名称条件来判断应该发布到测试环境还是生产环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
name: CICD

# 触发流水线的条件
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
# runs-on 后面是runner所在服务器的tag
runs-on: [ myTag ]
# container下面的配置是用来在上面的服务器上启动一个docker作为流水线实际执行的环境
# 这几如果使用的docker hub的公开镜像就不需要credentials,如果是私有仓库就需要配置
container:
image: xxxxxxxxxxxxxxxxxxxxxxx
credentials:
# ${{secrets.xxxxxxxxxxx}} 是利用了github的secrets功能,在repo的setting-->Secrets里面可以添加需要的
# 秘钥和token等信息,然后以${{secrets.xxxxxxxxxxx}}形式在workflow中使用,这一点比起jenkins要好很多
username: ${{secrets.xxxxxxxxxxx}}
password: ${{secrets.xxxxxxxxxx}}
env:
# 设置容器内的环境变量
AAA: BBB

# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# 正式开始编辑之前先清理环境,
# rm -rf * 不能删除隐藏目录,所以 .git 要单独删除,因为git secrets 相关的配置文件都在这里面,
# 如果不删除的话,在执行git secrets --scan命令的时候shell退出码会返回1,这样action 的workflow就会失败
# 我在这里花了一天时间....
- name: Initial Env
run: |
rm -rf *
rm -rf .git
ls -a

# 利用官方的action把代码拉下来
- uses: actions/checkout@v2

- name: Secrets Scan
run: |
git secrets --install -f
git secrets --register-aws
git secrets --add --allowed .github/workflows/main.yml:.*
git secrets --add xxxxxxxxxxx
git secrets --scan

- name: Stg Build Image
if: ${{github.ref != 'refs/heads/master'}}
run: |
Stg Build Command

# 利用if语法和分支名称条件来判断应该发布到测试环境还是生产环境
- name: Stg Deploy
if: ${{github.ref != 'refs/heads/master'}}
run: |
Stg Deploy Command

- name: Prod Build Image
if: ${{github.ref == 'refs/heads/master'}}
run: |
Prod Build Command

- name: Prod Deploy
if: ${{github.ref == 'refs/heads/master'}}
run: |
Prod Build Command

# 最后记得要清理环境,尽量避免信息泄露
- name: Clean up
run: |
rm -rf *
rm -rf .git