GitHub Actions CI/CD 解放码农双手

GitHub Actions CI/CD 解放码农双手

1. 和 TravisCI 分手, 投入 GitHub Actions 怀抱的狗血剧情

file

就目前而言, 持续集成有很多产品, 比如: Jenkins, Travis CI, Circle CI, GitHub Actions 等等, 选择一款高效, 稳定的 CI/CD 产品无疑可以大大降低我们每天写的 Bug 数目(每天都在写 Bug…)以及极大的解放我们的双手, jfoa 项目以前使用的是 travis CI(具体配置可以参看https://github.com/JavaFamilyClub/jfoa/blob/master/.travis.yml), 但是一次偶然的机会发现虽然 CI Linux 和帅帅本地 Mac 都编译过了, 但是同事 Windows 却编译失败了, 这引起了我的注意, 也让我意识到多平台构建的必要性, 但是当我翻看 Travis CI 的官方文档后发现, 其并不支持 Windows 构建, 又正当 GitHub Actions 大放异彩, 因此帅帅便将 jfoa 迁移到了 GitHub Actions.

目前, jfoa 共创建了三个 workflow:

file

  • 用于测试的 build, 运行在 Linux, Mac OS X, Windows 上
  • 用于发布客户端的 publish, 运行在 Linux, Mac OS X, Windows 上
  • 用于打包和发布 Docker 镜像的 docker, 运行在 Linux 上. (Docker 打包大家可以翻看帅帅之前的一篇文章: Docker 构建/发布 SpringBoot).

下面带大家了解一下构建配置流程和帅帅 jfoa 项目的配置

2. Hello, GitHub Actions

2.1 创建仓库

首先, 你得先创建一个 GitHub 的仓库, 可以简单的创建一个 springboot 项目放上去.

2.2 创建你的第一个 workflow

一个 workflow 就是一个构建流程, 里面可以包含多个相关的任务. 你可以在GitHub 首页创建 workflow, 也可以在本地仓库目录下创建一个 .github/workflows/xxx.yml 文件. xxx 随便起一个文件名, 当然你可不要起~!x x ....**&^^%^)(%$# 之类的奇葩名字就行. 下面展示一下 GitHub 首页创建 workflow 的流程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wKOQkxmO-1603937259163)(http://jeff.spring4all.com/Fi4uQSzHlRo-7utp6I0utN4llyyM)]

往下翻, 找到你想要的那个, 你懂得

file

file

大家根据自己的构建工具进行选择, 由于 jfoa 是基于 gradle 6+ 构建的, 因此, 帅帅选择的是 Java with Gradle(后面可以随便改的, GitHub Actions 是基于插件的, 需要什么引什么就行了).
选择set up this workflow之后就可以看到下面的界面

file

这是一个基本的基于 gradle 的 workflow, 右上角将文件提交, GitHub actions 就可以为你工作了. 下面简单介绍一下各个部分的意思

2.3 workflow 文件介绍

一个基本的基于 gradle 的 workflow 文件内容如下:

name: Java CI with Gradle

on:
  push:
    branches: [ master ] # 在 master 分支上发生 push 操作时触发构建
  pull_request:
    branches: [ master ] # 在 master 分支上发生 pull_request 操作时触发构建

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 1.8
      uses: actions/setup-java@v1
      with:
        java-version: 1.8
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Build with Gradle
      run: ./gradlew build
  • name 属性为 workflow 指定一个名字, 注意该名字会显示在你 Action下, 如下图

file

  • on 指定触发事件和分支. 以上 workflow 指定了在 master 分支上(现在创建的主分支已经叫 main 了, 哎, 该死的种族歧视…)当有 push 或者 pull_request操作时自动启动构建.
  • jobs 指定构建任务, 注意可以有多个, 根据缩进直接定义构建任务, 上面示例中的 build 就是一个构建任务.
  • runs-on 指定构建运行的平台. 可以指定矩阵开启多平台构建.
runs-on: ${{ matrix.os }}

strategy:
	matrix:
		os: [ubuntu-latest, macos-latest, windows-latest]
  • steps 指定构建的步骤
  • uses 引入插件, 以上示例中引入了 JDK1.8
  • -name 指定当前步骤的构建名称, 在查看构建日志的时候就可以根据该名称快速定位问题.

file

  • width 一般用于指定插件的一些配置, 比如该示例中指定了 jdk 的版本为 1.8

再之后就可以通过 name/run 就可以自定义一些构建步骤和运行的命令, 示例中, 执行了两个构建步骤, 一个是授权 gradlew 文件可执行权限; 一个执行 gradle build 命令执行构建.

   - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Build with Gradle
      run: ./gradlew build

3. GitHub Actions 数据安全与加密

当我们将项目放在 GitHub 上之后, 一些密码信息就不适合明文写入了, 比如 application.yml 中一般配置的数据库连接密码, AMQP 连接密码等, 这时候对于 SpringBoot 就可以使用 jasypt-spring-boot-starter 进行加密,
就像 jfoa 一般, ENC( 括起来的就是 jasypt 加密后的密文, 当项目启动时 jasypt 会根据 jasypt.encryptor.password 的值对密文进行解密.

jasypt:
   encryptor:
      password: ${JF_JASYPT_ENCRYPTOR}

spring:

	 # Rabbitmq
   rabbitmq:
      host: javafamily.club
      port: 5672
      virtual-host: /
      username: jfoa
      password: ENC(Fsj3Z7OHFAvOfjf7GSol02jS6ddGr9HSVAm1fBx8iwig942jxj5goh/8QJFrRq2p)

   # Mail Config
   mail:
      host: smtp.office365.com
      port: 587
      default-encoding: utf-8
      username: javafamily.no-reply@outlook.com
      password: ENC(Dei9QlGM89UdMyvlvEXVE6DX9aMKZBlRs+Rt5DXUpH3T10DsKRIUTpEOQDIT/I3j)

所以, jasypt.encryptor.password 一定不敢让别人知道啊…明文写入当然不行, GitHub 上谁都看得到啊…
因此, 将其配置到电脑的环境变量中就可以了, 别人就不知道了, 而且不用每次自己手动传入去敲(啊哈, 我可真是个小机灵鬼…), 但是…GitHub Actions 构建却起不起来了, 因为 CI 机器的环境变量中并没有配置这个环境变量. 写入 workflow 文件中别人依然看的到啊…

3.1 在 GitHub 创建秘钥

将一些敏感数据配置到 GitHub 是一个很好的加密方式, 在 setting/secrets

file

如上所示, 这些是 jfoa 项目所需要的一个敏感数据

3.2 在 workflow 中引用

然后 workflow 就可以引用 GitHub 中的敏感数据, 并且可以传入 CI 构建机器的环境变量

jobs:
  build:

    runs-on: ${{ matrix.os }}

    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]

    env:
      JF_JASYPT_ENCRYPTOR: ${{ secrets.JF_JASYPT_ENCRYPTOR }}
      CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

通过 env 进行环境变量的设置, 通过 ${{secrets.XXXXX}} 引用 GitHub 的secrets 的秘钥, 这样敏感数据就不会暴露.

具体数据加密的操作大家可以参考 GitHub Actions 文档

3.3 条件执行

你可以使用 if 条件表达式在运行时确定每一个构建步骤是否执行, 如 jfoapublish workflow 中

    - name: Publish Installer
      if: ${{ github.event_name == 'release' }}
      run: ./gradlew publish -Pbuildenv=prod

该示例指定了只有在项目发布 release 时才执行发布.

3.4 上传 artifact

GitHub Actions 在 workflow 可以提供 artifact 的上传于下载. jfoa 每次构建都会将客户端上传到 GitHub 提供下载测试.
上传 artifact 通过 upload-artifact@v2 插件.

    - name: Publish to github artifact
      uses: actions/upload-artifact@v2
      with:
        name: jfoa-client-0.0.1-${{ runner.os }}
        path: web/angular/build/installerArchives/jfoa-client-*.zip
        if-no-files-found: error
  • width.name 指定了 artifact 名
  • with.path 指定 artifact 的文件位置, 默认基于项目根路径
  • with.if-no-files-found: 指定如果 artifact 文件找不到如何处理, 默认为 warn

4 嘴一嘴

至此, GitHub Actions 的常用功能和项目实践已经介绍给大家了.有任何问题大家都可以留言, 批评指正.
最后, 强烈建议:

  • 多写测试
  • 代码规范, 不要写没用的注释
  • CI/CD 加持

每天少写几个 bug…, GitHub Actions 赶紧用起来吧.

file

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值