基于Docker整合開發測試環境

n342 9年前發布 | 28K 次閱讀 Docker

這是一個內部集開發測試為一體的環境,開發人員通過push代碼到GitLab,以此來觸發Jenkins,讓Jenkins來執行一系列的腳本和操 作,build構建、結合Sonar、Email通知,還包括啟動停止容器,將容器commit為Image,并將Image push到私有Docker Registry等操作;注意這個環境的主體是Jenkins。

 基于Docker整合開發測試環境


此前在網上看到了一張這樣的圖片,讓我感觸良多,我覺得這一套環境很適合我們當前的環境;開發人員提交代碼到GitLab,通過GitLab的web hook觸發Jenkins;此時,Jenkins可能會很繁忙,它要處理的事情如下:

  1. 從GitLab clone最新的代碼準備build
  2. ssh遠程執行一個腳本,啟動一個Container用于部署
  3. 通過maven進行build打包
  4. 部署到tomcat
  5. 匹配build的輸出字段來遠程執行一個腳本,將部署的tomcat提交成Image,并push到私有Docker Registry
  6. 將build的包發送給Sonar,進行代碼質量檢測
  7. 郵件通知給測試人員和開發人員
  8. </ol>
    因此,我花費了幾天時間將這一套整合到我們內部的環境中來(都是Java應用);這中間每一個步驟都要精心的規劃和測試來保證他的可用性;

    我們要做的第一件事就是做一個tomcat的鏡像(需要開啟tomcat的用戶登錄功能),這個鏡像將用于后續Jenkins的部署;此后就是Jenkins的配置了;

    你需要了解Jenkins的工作原理:

    Jenkins會自動從我們設置的Repository URL中clone到當前的一個workspace中并切換到最新的branch,然后執行Execute shell中的command,如果每條command都返回0,則build成功,否則算失敗;所以我們的shell command可以是簡單的編譯指令;(注意:command有兩種形式,一種是shell命令build;另一種是使用Jenkins的插件來 build)
    接下來設置構建觸發器,通過SCM來與GitLab協調;
    注意:Poll SCM會掃描所有指定了Repository URL branches的job,如果所有的job都設置SCM,那么都會觸發所有的job(前提是所有job設置的SCM都一樣;不一樣,則會依次進行觸發檢測)

    設置構建環境,在build前,遠程執行一個腳本,并且傳遞了兩個Jenkins的環境變量用做腳本的參數;腳本的工作是啟動一個容器,并指定映射的端口為8080,這也是一個變量)
    注意:在啟動容器的時候建議指定其name,方便后續對它進行操作,并且name最好是一個變量,因為,當有多個開發 人員在提交代碼后都會觸發Jenkins的創建,創建的過程中都會啟動一個容器,如果容器的name相同,那么容器會創建失敗;還要注意映射的端口也是一 個變量,這個端口要跟下面的tomcat端口一樣;

    !/bin/bash

    docker run -d -p $2:8080 --name="$1" 192.168.1.188:5000/centos-tomcat7:latest docker inspect -f '{{.Name}}' $1 | awk -F/ '{print $2}' > /root/docker/CI/.tmp.txt

    構建步驟(Java應用),可通過maven插件,執行maven命令來build;也可以用shell命令或腳本來build;build后指定Tomcat的部署地址;

    部署成功就可以對容器進行操作了,通過post build task的“Log text”對build部署的輸出進行匹配,匹配成功,則執行一個腳本;腳本的功能是將容器提交為一個鏡像,并將鏡像push到私有Docker registry;

    !/bin/bash

    container_name=`cat /root/docker/CI/.tmp.txt` build_number=`cat /root/docker/CI/.tmp.txt | awk -F- '{print $2}'` docker stop ${container_name} docker commit -a "Jason Tom <tangjiaxing147@aol.com>"  `docker inspect -f '{{.Id}}' ${container_name}` 192.168.1.188:5000/centos-${container_name}:latest docker commit -a "Jason Tom <tangjiaxing147@aol.com>"  `docker inspect -f '{{.Id}}' ${container_name}` 192.168.1.188:5000/centos-${container_name}:v${build_number} docker push 192.168.1.188:5000/centos-${container_name}:latest docker push 192.168.1.188:5000/centos-${container_name}:v${build_number} docker rm ${container_name}

    注意:Jenkins中默認是以Jenkins用戶去執行所有的操作的;切記,如果你是直接執行這個腳本,那么這一步肯定會跳過的,因為Jenkins默 認用戶的bash是/bin/false,是沒有shell的,你必須把Jenkins用戶的shell改成bash才能執行上面的腳本;切記切 記.....

    配置到這,Jenkins的任務就已經完成了,現在只需要到GitLab的項目倉庫中設置web hook即可。

    使用插件介紹:

    • post build task插件(編譯后的任務,如果放在tomcat部署插件之后,那么就等待部署完成再執行這個task任務)
    • ssh plugin插件(ssh插件)
    • invoke top-level maven targets插件
    • deploy to container plugin插件
    • 要讓Jenkins可以自動build git repo中的代碼,需要安裝git client plugin和git plugin
    • 要讓Jenkins可以收到GitLab發來的hook從而自動build,需要安裝GitLab hook plugin
    • 要讓Jenkins可以在build完成之后根據TAP(test anything protocol)文件生成graph,需要安裝 TAP Plugin

    參考文檔:
 本文由用戶 n342 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!