赞
踩
就目前而言, 持续集成有很多产品, 比如:
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
:
- 用于测试的
build
, 运行在 Linux, Mac OS X, Windows 上- 用于发布客户端的
publish
, 运行在 Linux, Mac OS X, Windows 上- 用于打包和发布 Docker 镜像的
docker
, 运行在 Linux 上. (Docker 打包大家可以翻看帅帅之前的一篇文章: Docker 构建/发布 SpringBoot).
下面带大家了解一下构建配置流程和帅帅
jfoa
项目的配置
首先, 你得先创建一个 GitHub 的仓库, 可以简单的创建一个 springboot 项目放上去.
一个 workflow 就是一个构建流程, 里面可以包含多个相关的任务. 你可以在GitHub 首页创建
workflow
, 也可以在本地仓库目录下创建一个.github/workflows/xxx.yml
文件.xxx
随便起一个文件名, 当然你可不要起~!x x ....**&^^%^)(%$#
之类的奇葩名字就行. 下面展示一下 GitHub 首页创建 workflow 的流程:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wKOQkxmO-1603937259163)(http://jeff.spring4all.com/Fi4uQSzHlRo-7utp6I0utN4llyyM)]
往下翻, 找到你想要的那个, 你懂得
大家根据自己的构建工具进行选择, 由于
jfoa
是基于gradle 6+
构建的, 因此, 帅帅选择的是Java with Gradle
(后面可以随便改的, GitHub Actions 是基于插件的, 需要什么引什么就行了).
选择set up this workflow
之后就可以看到下面的界面
这是一个基本的基于
gradle
的 workflow, 右上角将文件提交, GitHub actions 就可以为你工作了. 下面简单介绍一下各个部分的意思
一个基本的基于
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
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
指定当前步骤的构建名称, 在查看构建日志的时候就可以根据该名称快速定位问题.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
当我们将项目放在 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 文件中别人依然看的到啊…
将一些敏感数据配置到 GitHub 是一个很好的加密方式, 在
setting/secrets
如上所示, 这些是 jfoa
项目所需要的一个敏感数据
然后 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 文档
你可以使用
if
条件表达式在运行时确定每一个构建步骤是否执行, 如jfoa
的publish
workflow 中
- name: Publish Installer
if: ${{ github.event_name == 'release' }}
run: ./gradlew publish -Pbuildenv=prod
该示例指定了只有在项目发布 release 时才执行发布.
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
至此,
GitHub Actions
的常用功能和项目实践已经介绍给大家了.有任何问题大家都可以留言, 批评指正.
最后, 强烈建议:
每天少写几个 bug…, GitHub Actions 赶紧用起来吧.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。