Github Actions 实践

引言

开源组件开发,抱着学习的态度,采用的都是新技术,刚开始在这些新技术的使用上面踩了不少坑,经过一段时间的学习与实践,发现新技术的蓬勃发展并非偶然,而是因为它真的能满足日益增长的新需求。

选型对比

持久层:MyBatis

过去一直使用Hibernate进行开发,觉得Hibernate虽然在性能上差一些,但开发效率极高;但是在用了MyBatis一段时间后发现,当SQL写熟练了之后,开发效率也不低,更何况还有强大的开源社区与丰富的IDE插件。

之前一直讨厌XML,导致一直没有启用MyBatis,最近经过与大厂的交流才发现,CSDN上所说的XML更适合复杂查询之类的观点都是扯淡。

向最佳实践看齐:简单语句使用注解,复杂语句使用ProviderSQL,再见,XML

项目构建:Gradle

在进行多模块项目构建时,从spring-framework中学到了不少东西,同样也借鉴了它的构建工具Gradle

image.png

刚开始还分不清楚java-libraryruntimeOnlyapiimplementation这些Gradle中的新概念,但在使用一段时间后,发现Gradle真的是天生适合多模块复杂项目构建,用起来十分方便。

CI:Github Actions

Github Actions公测有一段时间了,本次的CI就采用Github Actions

Github Actions

介绍

来瞅瞅,在Pull Request旁边的这个Actions就是我们的CI工具Github Actions

image.png

我们可以自定义CI的工作流,Github自动在特定事件发生时触发CI

image.png

工作流配置

在仓库根目录创建文件.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

一切看起来还不错,使用起来方便快捷。

image.png

自定义 Actions 组件

在进行工作流的配置过程中,发现Github Actions中,如果使用Docker ServiceGithub在工作流会自动初始化容器。

image.png

看起来很智能,但如果想对容器进行自定义配置就不那么方便了。

端口冲突问题:Github Actions提供的默认MySQL无法使用(忘了为啥不能用了,好像是随机密码的问题?),如果镜像也在3306端口映射,会发生端口冲突,希望在关闭默认MySQL后,手动启用Docker容器。

容器自定义配置问题:正常一个MySQL容器只有一项数据库的配置,如果想在一个Docker容器内创建多个数据库,就需要对容器进行自定义配置。但是Github Actions在初始化容器时,使用随机名称,导致无法对容器执行自定义脚本。

image.png

基于以上问题,开发了自己的开源Action脚本。

最开始以为有多复杂,后来发现不过是一个shell脚本,将自定义的输入变量拼接到指定位置,拼接成完整docker命令,再去执行。

拼接Docker命令时参照李宜衡的文章:Docker初战 - 笙歌会停,总结得很详细,具有极高参考价值。

很遗憾,架子搭好了,但是目前未实现容器的自定义脚本功能,Github一直报错:the input device is not a TTY,未能进入到容器内部的命令行,目前未解决,待以后完善。

总结

沉舟侧畔千帆过,病树前头万木春。
今日听君歌一曲,暂凭杯酒长精神。
——刘禹锡《酬乐天扬州初逢席上见赠》
阅读 654

推荐阅读
Tomorrow
用户专栏

明天,你好

316 人关注
136 篇文章
专栏主页