1. 程式人生 > >Jenkins把GitHub專案做成Docker映象

Jenkins把GitHub專案做成Docker映象

本文是《Jenkins流水線(pipeline)實戰》系列的第三篇,前面已對Jenkins流水線有了基本認識,也試過從GitHub下載pipeline指令碼並執行,今天的實戰是編寫一段pipeline指令碼,該指令碼的作用是從GitHub下載一個Java專案(Maven構建的),然後編輯構建此專案,並將構建結果製作成Docker映象並且推送到私有映象倉庫;

系列文章地址

  1. 《Jenkins流水線(pipeline)實戰之:從部署到體驗》;
  2. 《讓Jenkins執行GitHub上的pipeline指令碼》;
  3. 《Jenkins把GitHub專案做成Docker映象》;

    環境資訊

    為了快速完成Jenkins部署,本次實戰用到了Docker,請在實戰前準備好以下環境:
  4. 作業系統:Ubuntu 18.04.2 LT
  5. Jenkins:2.176.3
  6. Docker:19.03.1
  7. 私有映象倉庫:Harbor 1.9.0

    實戰內容簡介

    今天的實戰功能如下圖所示:

    關於Docker私有映象倉庫Harbor

    構建好的Docker映象,會被推送到Docker映象倉庫Harbor,此倉庫是我自己在本地搭建的,詳細搭建步驟請參考《CentOS部署Harbor映象倉庫》
    如果您有hub.docker.com網站的賬號,也可以直接將映象推送到此網站,這樣大家都能使用到您製作的映象了。

    關於本次用到的GitHub專案

    本次實戰會將一個GitHub上的專案先編譯,再構建成Docker映象,我這邊準備了一個基於Maven構建的SpringBoot專案,這是個Hello world級別的工程,唯一特別之處是pom.xml中用到了Jib外掛,用來將SpringBoot專案構建成Docker映象。

該專案的原始碼可以從GitHub上下載,地址和連結資訊如下表所示:
| 名稱 | 連結 | 備註|
| :-------- | :----| :----|
| 專案主頁| https://github.com/zq2599/blog_demos | 該專案在GitHub上的主頁 |
| git倉庫地址(https)| https://github.com/zq2599/blog_demos.git | 該專案原始碼的倉庫地址,https協議 |
| git倉庫地址(ssh)| [email protected]:zq2599/blog_demos.git | 該專案原始碼的倉庫地址,ssh協議 |

這個git專案中有多個資料夾,本章的應用在hellojib資料夾下,如下圖所示:


來看看此工程的pom.xml,重點是Jib外掛部分,如下所示:

<!--使用jib外掛-->
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>1.3.0</version>
                <configuration>
                    <!--from節點用來設定映象的基礎映象,相當於Docerkfile中的FROM關鍵字-->
                    <from>
                        <!--使用openjdk官方映象,tag是8-jdk-stretch,表示映象的作業系統是debian9,裝好了jdk8-->
                        <image>openjdk:8-jdk-stretch</image>
                    </from>
                    <to>
                        <!--映象名稱和tag,使用了mvn內建變數${project.version},表示當前工程的version-->
                        <image>bolingcavalry/hellojib:${project.version}</image>
                    </to>
                    <!--容器相關的屬性-->
                    <container>
                        <!--jvm記憶體引數-->
                        <jvmFlags>
                            <jvmFlag>-Xms4g</jvmFlag>
                            <jvmFlag>-Xmx4g</jvmFlag>
                        </jvmFlags>
                        <!--要暴露的埠-->
                        <ports>
                            <port>8080</port>
                        </ports>
                    </container>
                </configuration>
            </plugin>
        </plugins>
    </build>

使用Jib將SpringBoot專案構建成Docker映象的更多資訊,請參考《Docker與Jib(maven外掛版)實戰》;

用私有的GitHub倉庫來實戰

  1. 考慮到實際工作中大多數原始碼都沒有對外公開,因此我這裡也建了個私有GitHub倉庫,地址是:https://github.com/zq2599/pipeline.git ,將前面提到的的hellojib工程所有原始碼都放入此倉庫;
  2. pipeline下載私有倉庫的原始碼時需要身份驗證,驗證方式後面會說到。
  3. 這個私有倉庫裡面並不只有hellojib一個工程,倉庫的根目錄下的hellojib目錄裡面才是構建映象會用到的Maven工程:

    建立Jenkins任務

  4. 建立一個名為build-image流水線任務:
  5. 接來下我們要藉助Jenkins提供的語法工具來生成下載GitHub的pipeline程式碼,如下圖,在設定任務的頁面點選紅框中的流水線語法按鈕:
  6. 現在進入的頁面是Jenkins輔助我們編寫pipeline指令碼的地方,請按照下圖操作:
  7. 在彈出的視窗配置一個儲存了GitHub賬號和密碼的祕鑰配置項,請按照下圖的數字順序操作:
  8. 如下圖紅框所示,在下拉選單中選擇剛才建立的祕鑰配置:
  9. 此時可以發現之前的紅色錯誤提示已經消失(因為鑑權通過了),點選下圖紅框中的按鈕即可生成pipeline原始碼:
  10. 完整的pipeline指令碼內容如下,其中Checkout階段從GitHub下載的那段指令碼,就是上圖中自動生成的:
pipeline {
    agent any
    tools {
        maven 'mvn-3.6.2'
    }
    stages {
        stage('Checkout') {
            steps {
                echo '從GitHub下載專案原始碼'
                checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'git-account-passwd', url: 'https://github.com/zq2599/pipeline.git']]])
            }
        }        
        stage('Build') {
            steps {
                echo '開始編譯構建'
                sh 'cd hellojib && mvn clean compile -U -DskipTests jib:dockerBuild'
            }
        }
        stage('Push') {
            steps {
                echo '將本地Docker映象推送到Harbor映象倉庫'
                echo '給當前映象設定帶有Harbor地址和專案名稱的Tag,這樣才能推送到Harbor的library專案之下'
                sh 'docker tag bolingcavalry/hellojib:0.0.1-SNAPSHOT 192.168.50.167/library/hellojib:0.0.1-SNAPSHOT'
                echo '登入Harbor'
                sh 'docker login 192.168.50.167 -u admin -p Harbor12345'
                echo '登入chengg成功,開始推送映象'
                sh 'docker push 192.168.50.167/library/hellojib:0.0.1-SNAPSHOT'
            }
        }
        stage('Clean') {
            steps {
                echo '清理Maven工程'
                sh 'cd hellojib && mvn clean'
                echo '刪除映象'
                sh 'docker rmi bolingcavalry/hellojib:0.0.1-SNAPSHOT 192.168.50.167/library/hellojib:0.0.1-SNAPSHOT'
                echo '清理完畢'
            }
        }
    }
}
  1. 將上面的pipeline指令碼填寫到build-image任務的流水線指令碼輸入框中,如下圖:
  2. 點選下圖紅框中的立即構建即可開始執行流水線任務:
  3. 如果配置無誤的話任務可以執行成功,如下圖,每個階段的執行結果和耗時都展現出來了:
  4. 如果您的任務構架失敗了,點選下圖紅框中的小圓球,會開啟任務執行的詳細日誌,用來檢查錯誤原因:
  5. 登入Harbor網站,可以看到推送過來的映象:

    ### 把pipeline指令碼放在GitHub上
    今天的實戰中,編寫的pipeline指令碼是儲存在任務的設定中的,還記得 《讓Jenkins執行GitHub上的pipeline指令碼》一篇的內容麼?您可以嘗試將今天的pipeline指令碼存放在GitHub上,這樣從構建指令碼到業務專案都實現了版本控制,在多人開發階段更加實用。

至此,基於pipeline操作的GitHub專案的實戰就完成了,如果您正在尋求容器化環境的CI && CD方案,願本文能給您提供一些參考