引言
开源组件开发,抱着学习的态度,采用的都是新技术,刚开始在这些新技术的使用上面踩了不少坑,经过一段时间的学习与实践,发现新技术的蓬勃发展并非偶然,而是因为它真的能满足日益增长的新需求。
选型对比
持久层:MyBatis
过去一直使用Hibernate
进行开发,觉得Hibernate
虽然在性能上差一些,但开发效率极高;但是在用了MyBatis
一段时间后发现,当SQL
写熟练了之后,开发效率也不低,更何况还有强大的开源社区与丰富的IDE
插件。
之前一直讨厌XML
,导致一直没有启用MyBatis
,最近经过与大厂的交流才发现,CSDN
上所说的XML
更适合复杂查询之类的观点都是扯淡。
向最佳实践看齐:简单语句使用注解,复杂语句使用Provider
拼SQL
,再见,XML
。
项目构建:Gradle
在进行多模块项目构建时,从spring-framework
中学到了不少东西,同样也借鉴了它的构建工具Gradle
。
刚开始还分不清楚java-library
、runtimeOnly
、api
、implementation
这些Gradle
中的新概念,但在使用一段时间后,发现Gradle
真的是天生适合多模块复杂项目构建,用起来十分方便。
CI:Github Actions
Github Actions
公测有一段时间了,本次的CI
就采用Github Actions
。
Github Actions
介绍
来瞅瞅,在Pull Request
旁边的这个Actions
就是我们的CI
工具Github Actions
。
我们可以自定义CI
的工作流,Github
自动在特定事件发生时触发CI
。
工作流配置
在仓库根目录创建文件.github/workflows/workflow.yml
,我们可在此文件中配置自定义工作流。
具体的语法细节就不作详述了,可参考以下两篇文章:
GitHub Actions 入门教程 - 阮一峰的网络日志
Workflow syntax for GitHub Actions - Github Help
任务分为两种,一种是run
定义,注明要执行什么脚本;另一种使用uses
定义,使用Github
中已有的开源第三方脚本。
# 定义 CI 工作流
name: Java CI Workflow
# 在 push / pull request 到 master分支时触发
on:
push:
branches:
- master
pull_request:
branches:
- master
# 定义工作任务
jobs:
build:
# 配置 build 工作
name: Project Test And Build
# 运行于 ubuntu-latest 操作系统
runs-on: ubuntu-latest
# 定义任务执行步骤
steps:
# 检出当前仓库代码
- name: Checkout code
uses: actions/checkout@v2
# 关闭默认 MySQL
- name: Shutdown default mysql
run: sudo service mysql stop
# 创建数据库
- name: Create mysql database auth
uses: icomponent/mysql-action@master
with:
VERSION: 5.7
CONTAINER_NAME: mysql
PORT_MAPPING: 3307:3306
ROOT_PASSWORD: root
DATABASE: auth
# 安装 JDK
- name: Install jdk 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
# 数据库迁移及各模块测试
- name: Flyway module migration database
run: gradle flyway:bootRun
- name: Test core module
run: gradle core:test
- name: Test common module
run: gradle common:test
- name: Test auth module
run: gradle auth:test
- name: Test app module
run: gradle app:test
一切看起来还不错,使用起来方便快捷。
自定义 Actions 组件
在进行工作流的配置过程中,发现Github Actions
中,如果使用Docker Service
,Github
在工作流会自动初始化容器。
看起来很智能,但如果想对容器进行自定义配置就不那么方便了。
端口冲突问题:Github Actions
提供的默认MySQL
无法使用(忘了为啥不能用了,好像是随机密码的问题?),如果镜像也在3306
端口映射,会发生端口冲突,希望在关闭默认MySQL
后,手动启用Docker
容器。
容器自定义配置问题:正常一个MySQL
容器只有一项数据库的配置,如果想在一个Docker
容器内创建多个数据库,就需要对容器进行自定义配置。但是Github Actions
在初始化容器时,使用随机名称,导致无法对容器执行自定义脚本。
基于以上问题,开发了自己的开源Action
脚本。
最开始以为有多复杂,后来发现不过是一个shell
脚本,将自定义的输入变量拼接到指定位置,拼接成完整docker
命令,再去执行。
拼接Docker
命令时参照李宜衡的文章:Docker初战 - 笙歌会停,总结得很详细,具有极高参考价值。
很遗憾,架子搭好了,但是目前未实现容器的自定义脚本功能,Github
一直报错:the input device is not a TTY
,未能进入到容器内部的命令行,目前未解决,待以后完善。
总结
沉舟侧畔千帆过,病树前头万木春。
今日听君歌一曲,暂凭杯酒长精神。
——刘禹锡《酬乐天扬州初逢席上见赠》