Springboot專案Github Action生成Docker映象

Mr_Chenn發表於2020-12-16

最近下班後的練習比較多,而且修改後的東西提交後在阿里雲執行。專案的更新比較麻煩。因此,想git push後,優雅的docker run就可以把修改後的專案執行起來。

首先來比較一下:

一、傳統的Springboot專案更新方式

1.提交程式碼:git push

2.打包:maven clean & maven package

3.傳輸:將maven利用pom.xml配置檔案生成的xxx.jar傳輸到阿里雲伺服器

4.執行:java -jar xxx.jar執行

 

而今天記錄的教程想要達到的是,提交程式碼後,只需要在阿里雲伺服器一行命令執行映象即可。

1.git push

2.docker run

 

git push後優雅地docker run需要做什麼呢?

首先,你得有pom.xml、Dockerfile和docker倉庫。

pom.xml的artificatId和version決定了打包之後的jar檔名。比如我這個就是 demo-0.0.1.jar。

mvn package後jar檔案在target目錄下,對應的Dockerfile的寫法

docker映象倉庫不用多說了,dockerhub或者阿里雲映象倉庫都可以。這裡我用的是dockerhub,建立一個賬號和倉庫就好了。

 

 

下面開始主要的設定Github Actions操作說明:

1.建立Github Action工作流:github 專案的 Actions > New workflow

2.建立maven.yml檔案:找到Java With Maven,點選Set up this workflow來建立yml檔案

yml檔案的路徑預設是 專案根目錄/.github/workflows/maven.yml,建議這個yml檔案路徑不要更改,我一開始就是把它放在了專案根目錄Actions在git push後一直無法運作。

3.編輯maven.yml檔案,使其符合你的需求。

  Github Actions的功能很強大,簡而言之,這一步是正確地編寫yml檔案,使其符合我們自動化部署的需求。

  這裡我們的需求是什麼?一開始我們分析了傳統的專案更新方式,使用了maven 打包。這裡依然是一樣的,並沒有高階多少,只是github的伺服器按照這個maven.yml執行打包操作罷了。

  編寫yml使其實現:

  1.git push 後 maven 自動打包

  2.利用Dockerfile自動製作docker映象

  3.自動推送製作好的docker映象到映象倉庫

預設的maven.yml只能實現git push後,使用maven打包生成jar檔案。要生成映象並且推送到指定的映象倉庫還得修改,修改編寫後的yml檔案如下:

# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven

name: Java CI with Maven

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

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: Build with Maven
      run: mvn -B package --file pom.xml
    - name: BuildDockerImage
      run: docker build . --file Dockerfile --tag my-image-name:$(date +%s)
    - name: Publish to Docker Repository
      uses: elgohr/Publish-Docker-Github-Action@master
      with:
        name: christopherchen/practice:practice
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

仔細看,與預設的maven.yml相比並沒有新增多少東西。

    - name: BuildDockerImage
      run: docker build . --file Dockerfile --tag my-image-name:$(date +%s)
    - name: Publish to Docker Repository
      uses: elgohr/Publish-Docker-Github-Action@master
      with:
        name: christopherchen/practice:practice
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

這裡的 -name後面就是一個子任務名稱,run後面則是要執行的命令列,在什麼環境執行呢?就是上面的 ubuntu-latest。

BuildDockerImage:這一步 使用docker build利用Dockerfile生成docker映象。

Publish to Docker Repository:這一步將上一步打包生成的docker映象推送至指定的映象倉庫。

with下面的name是映象倉庫地址,username是映象倉庫登入的使用者名稱,password是映象倉庫登入的密碼。由於這些東西是比較隱祕的,這裡用了github的secret。

專案的Settings > Secrets > New repository secret 建立金鑰。就是類似與鍵值對,建立後在yml中用 ${{key}}來代替它的value。

完成以上設定就可以了。git push後Actions自動執行workflow工作流,打包映象推送到docker倉庫。

然後在阿里雲伺服器裡,docker login,由於我使用的tagname是practice,因此後面docker pull的時候也是 docker pull 倉庫地址:practice。使用 docker pull christopherchen/practice:practice 即可下載到打包好的映象。

 

相關文章