Github Actions 实践

引言

开源组件开发,抱着学习的态度,采用的都是新技术,刚开始在这些新技术的使用上面踩了很多坑,通过一段时间的学习与实践,发现新技术的蓬勃发展并不是偶然,而是由于它真的能知足日益增加的新需求。html

选型对比

持久层:MyBatisjava

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

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

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

项目构建:Gradlespring

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

image.png

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

CI:Github Actionsshell

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,未能进入到容器内部的命令行,目前未解决,待之后完善。

总结

沉舟侧畔千帆过,病树前头万木春。 今日听君歌一曲,暂凭杯酒长精神。 ——刘禹锡《酬乐天扬州初逢席上见赠》
相关文章
相关标签/搜索