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,未能進入到容器內部的命令行,目前未解決,待之後完善。

總結

沉舟側畔千帆過,病樹前頭萬木春。 今日聽君歌一曲,暫憑杯酒長精神。 ——劉禹錫《酬樂天揚州初逢席上見贈》
相關文章
相關標籤/搜索