『高階篇』docker之gitlab和jenkins-CICD流程(43)
上節已經安裝好了gitlab和jenkins,這次就把CICD的流程串起來切身的體驗下CICD。目的就是在gitlab提交程式碼。觸發一系列的流程,最後可以看到新程式碼的效果(機器內容優先,只做到映象的打包推送)。原始碼:https://github.com/limingios/msA-docker/vagrant master分支CICD
瞭解git程式碼提交完成jenkins的構建
上次已經把程式碼上傳上去了,進入專案選擇settings裡面的Integrations
這裡可以配置一個url,預設的trigger觸發器push的時候,
這裡的url地址是哪裡來的。請檢視jenkins,因為本身gitlab裡面的微服務比較多,選擇其中的一個服務吧,新建一個任務名稱:user-edge-service,允許url遠端觸發構建任務。
Jenkins中的Job配置裡缺少 觸發遠端構建(例如,使用指令碼) 選項的
如圖所示的功能沒有出現在Job配置頁面,這是由於許可權問題導致的:
關閉防止跨站點請求偽造
gitlab的Integrations的URL地址修改:
http://192.168.66.102:8888/job/user-edge-service/build?token=123456
gitlab設定Webhooks報錯Urlis blocked: Requests to localhost are not allowed。admin 登入設定
gitlab的Integrations,新增完畢。
jenkins的新增完畢
- 測試一把
返回201,說明構建返回成功。
構建說明
咱們的所有構建都是基於pipline的,指令碼是用groovy來做的,如果老鐵有不會的可以檢視,可以流水線語法。
-
開始pipline的編寫
>Jenkins Pipeline是一套外掛,支援將連續輸送Pipeline實施和整合到Jenkins。Pipeline 提供了一組可擴充套件的工具,用於通過Pipeline DSL為程式碼建立簡單到複雜的傳送Pipeline 。
寫個測試的試試
#!groovy pipeline { //之前說過jenkins是支援叢集的,但是咱們這裡不需要叢集的方式,因為有了k8s。any在任何可用的agent 上執行 agent any //環境變數, environment { REPOSITORY="ssh://[email protected]:2222/liming/microservice.git" } //流水線是如何提前,都是通過很多個stages下面的stage stages { stage('獲取程式碼'){ steps{ echo " start fetch code from git ssh://[email protected]:2222/liming/microservice.git" deleteDir() git "${REPOSITORY}" } } } }
點選立即構建,然後檢視效果
jenkins所在容器未配置,祕鑰到gitlab上,來一起配置下
進入102的主機上
docker ps docker exec -it d918e00a583f /bin/bash ssh-keygen -t rsa -C "[email protected]" cat /root/.ssh/id_rsa.pub
在容器內試試看能git clone 不
在試試,立刻構建
檢視目錄
需要配置maven倉庫地址,當前這個映象nds國內不識別,在容器內需要操作
echo "nameserver 8.8.8.8" | tee /etc/resolv.conf > /dev/null apt-get update apt-get install vim cd /opt/maven/conf vi settings.xml mkdir /usr/lib/jvm/java-8-openjdk-amd64/lib
通過更換maven映象可以解決此問題,在maven安裝目錄下/opt/maven/conf的conf/settings.xml檔案內
<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
如果出現這個錯誤,就是找不到tool.jar直接複製一個tool.jar,原始碼包裡面我複製的有。
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project message-thrift-service-api: Compilation failure [ERROR] Unable to locate the Javac Compiler in: [ERROR] /usr/lib/jvm/java-8-openjdk-amd64/jre/../lib/tools.jar [ERROR] Please ensure you are using JDK 1.4 or above and [ERROR] not a JRE (the com.sun.tools.javac.Main class is required). [ERROR] In most cases you can change the location of your Java [ERROR] installation by setting the JAVA_HOME environment variable. ```` >複製命令 ``` bash yum install lrzsz #rz選擇tool.jar docker cptool.jar 容器ID:/usr/lib/jvm/java-8-openjdk-amd64/jre/../lib/tools.jar
配置環境變數
docker exec -it 容器ID /bin/bash vi ~/.bashrc #配置下面的環境變數 set JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=${JAVA_HOME}/bin:$PATH
- 在此嘗試構建
#!groovy pipeline { //之前說過jenkins是支援叢集的,但是咱們這裡不需要叢集的方式,因為有了k8s。any在任何可用的agent 上執行 agent any //環境變數, environment { REPOSITORY="ssh://[email protected]:2222/liming/microservice.git" MODULE="user-edge-service" } //流水線是如何提前,都是通過很多個stages下面的stage stages { stage('獲取程式碼'){ steps{ echo " start fetch code from git ssh://192.168.66.101:2222/liming/microservice.git" deleteDir() git "${REPOSITORY}" } } stage('編譯+單元測試') { steps{ echo " start compile" sh "mvn -U -pl ${MODULE} -am clean package" } } } }
jenkins完成推送到官網映象
- 建立build-imge檔案
- docker login登入到docker倉庫中(之前已經說過了,我的機器記憶體比較小,無法啟動私有的docker倉庫我通過的官網的,不管哪個都在jenkins的機器上登入下,push的時候就不報錯了)
cd ~ vi build-image.sh chmod 775 build-image.sh docker login
#!groovy pipeline { //之前說過jenkins是支援叢集的,但是咱們這裡不需要叢集的方式,因為有了k8s。any在任何可用的agent 上執行 agent any //環境變數, environment { REPOSITORY="ssh://[email protected]:2222/liming/microservice.git" MODULE="user-edge-service" SCRIPT_PATH="/root/" } //流水線是如何提前,都是通過很多個stages下面的stage stages { stage('獲取程式碼'){ steps{ echo " start fetch code from git ssh://192.168.66.101:2222/liming/microservice.git" deleteDir() git "${REPOSITORY}" } } stage('程式碼靜態檢查') { steps{ echo " start code check" } } stage('編譯+單元測試') { steps{ echo " start compile" sh "mvn -U -pl ${MODULE} -am clean package" } } stage('構建映象') { steps{ echo " start build image" sh "#{SCRIPT_PATH}/build-image.sh ${MODULE}" } } stage('釋出系統') { steps{ echo " start deploy" sh "#{SCRIPT_PATH}/deploy.sh ${MODULE} ${MODULE}" } } } }
build-image.sh
#!/bin/bash MODULE=$1 TIME=`date "+%Y%m%d%H%M"` GIT_REVISION=`git log -1 --pretty=format:"%h"` IMAGE_NAME=zhugeaming/${MODULE}:${TIME}_${GIT_REVISION} cd ${MODULE} docker build -t ${GIT_REVISION} . docker push ${GIT_REVISION}
deply.sh
#!/bin/bash IMAGE=`cat IMAGE_NAME` DEPLOYMENT=$1 MODULE=$2 echo "update image to ${IMAGE}" kubectl set image deployment/${DEPLOYMENT} ${MODULE} =${MODULE}
PS:最後總結下,建議jenkins不要使用容器安裝,我用容器安裝入了至少十幾個坑,對了解命令還是有好處的。我總結幾點
1. 不要容器化jenkins,直接在機器上安裝就可以了。容器本身都是單個個體,你想想裡面還要裝jdk,mvn,docker。如果jenkins容器化,等於容器裡面還要裝docker是不是很蛋疼。
2. 使用pipline寫指令碼其實很簡單本身就是流水線,比較負責命令建議使用shell指令碼的方式,這是也方便維護。
3. gitlab裡面,outbound requests 允許
4. jenkins裡面有幾個重要的點跨域允許訪問,允許使用者註冊
5. 寫的流程有點複雜,我是邊練邊寫的,但是記錄了我遇到的各種問題,希望能對有問題的老鐵有幫助。
6. 裡面的sh 指令碼可能比較適合我,特別是build-image那塊,建議自行修改。
7. 不要用容器安裝jenkins了 這個坑太大了,gitlab還是容器安裝爽。
8. 最後在說一點,jenkins的pipline語法不復雜,參考我的寫你可以可以完成自動化構建,push映象,更新服務這塊其實也沒完全弄好,我準備在繼續好好研究下k8s,感覺k8s水太深,下次出專輯深啃一把!
ofollow,noindex" target="_blank" href="http://zhanzhang.baidu.com/sitesubmit/index?sitename=https://idig8.com/2018/11/21/gaojipiandockerzhigitlabhejenkins-cicdliucheng43/">百度未收錄
>>原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!
>>原文連結地址:上一篇:已是最新文章