Git+Spring-boot+Docker+ Maven +Registry私有倉庫 +jenkins 持續整合測試
第一步 pull docker-registry
#:docker pull registry
// 此/opt/data/registry目錄為私有倉庫映象宿主機對映目錄
#:/usr/bin/docker -d -v -v /opt/data/registry:/tmp/registry --insecure-registry 222.27.196.8:5000
第二步 build jekins映象
建立一個包容以下內容的Dockerfile:
FROM jenkins
USER root
RUN apt-get update \
&& apt-get install -y sudo \
&& rm -rf /var/lib/apt/lists/*
RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
USER jenkins
COPY plugins.txt /usr/share/jenkins/plugins.txt
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt
我們需要賦予jenkins使用者sudo許可權以便能在容器內執行Docker命令。當然,也可以將jenkins使用者加入到Docker組中來避免在所有Docker命令前使用‘sudo’,不過由於這個組gid的不同會造成不可移植(如Pini文中所述)。
最後兩行用於處理plugins.txt檔案中定義的外掛。如果你不需要任何外掛可以忽略這兩行,不過我推薦至少包括如下內容:
$ cat plugins.txt
scm-api:latest
git-client:latest
git:latest
greenballs:latest
如果不想安裝任何外掛,可建立個空檔案或將相關指令從Dockerfile中刪除。本文並不需要上述外掛。
現在來構建並執行容器,將Docker socket和程式對映進來。
$ docker build -t myjenkens.
...
Successfully built 471fc0d22bff
$ docker images
第四步 啟動myjenkins容器
/home/jenkins_home 目錄為jenkins的主目錄本地對映, 只有這樣jenkins容器幹掉後,資料才不會丟失
#: docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -v /lib64/libdevmapper.so.1.02:/usr/lib/libdevmapper.so.1.02 -v /lib64/libsystemd.so.0:/usr/lib/libsystemd.so.0 -v /lib64/libgcrypt.so.20:/usr/lib/libgcrypt.so.20 -v /lib64/libudev.so.0:/usr/lib/libudev.so.0 -v /home/jenkins_home:/var/jenkins_home myjenkins
第五步 jenkins設定
經過上面的配置,你可以訪問你的Jenkins了,在瀏覽器中輸入:http://your server ip:8080/
,效果如下:
按照提示我們執行cat /var/lib/jenkins/secrets/initialAdminPassword
得到Administrator password
,注意var
要改成home
,輸入後點擊Continue,如下:
設定初始賬戶和密碼
設定完成後進入介面:
下載其它外掛
系統管理 –>管理外掛
在可選外掛中下載如下兩個外掛
配置Publish Over SSH
系統管理 –> 系統設定 –>Publish over SSH
配置GitHub Plugin
系統管理 –> 系統設定 –> GitHub –> Add GitHub Sever
如下圖所示
API URL 輸入 https://api.github.com
,Credentials點選Add新增,Kind選擇Secret Text,具體如下圖所示。
設定完成後,點選TestConnection
,提示Credentials
,則表明有效。
verified for user UUserName, rate limit: xxx
第六步 github配置
sercret text
注:此處需要一個對專案有寫許可權的賬戶
進入github –> setting –> Personal Access Token –> Generate new token
自己先儲存此token
,如果丟失,之後再也無法找到這個token
。
GitHub webhooks 設定
進入GitHub上指定的專案 –> setting –> WebHooks&Services –> add webhook –> Payload URL為下圖要求
這部分內容等到在jenkins新增任務時會遇到 這裡大家可以回頭再配
在jenkins
中點開使用者, 拿到api token
最後Payload URL
完整寫法是
http://userName
:userApiToken
@JENKENINS_URL
/job/projectName
?build?token=APITOKEN
第七步 構建一個maven專案
配置此專案
- 填寫專案的git地址, eg.
https://github.com/your_name/your_repo_name.git
- 新增github使用者和密碼
- 選擇githubweb原始碼庫瀏覽器,並填上你的專案URL,這樣每次構建都會生成對應的changes,可直接鏈到github上看變更詳情
-設定鉤子token,觸發遠端構建
通過鉤子 只要Github有push操作就會自動構建, 這裡token就是上面的在Github配置的token=?
- 構建觸發器,構建環境
- maven build 設定
- maven
通過ssh
遠端部署設定
引數說明:
Transfer SetSource files:表示要上傳的本地的jar包及路徑,可到工作空間去看。
Remove prefix:表示要上傳時要去除的資料夾,即只上傳jar包。
remote driectory:即表示執行時的路徑,相當於把jar包上傳到這裡了。這裡的
base dir
為Publish Over SSH
設定的/jenkins_release
exec commad:要執行的命令指令碼。
指令碼deploy.sh
#!/bin/sh
REGISTRY_URL=222.27.196.8:5000
cd /jenkins_release
cp *.jar /opt/jenkinsWeb/release
cd /opt/jenkinsWeb/release
path=`pwd`
echo $path
if docker images | grep ${REGISTRY_URL}/eureka-registry
then
docker rmi ${REGISTRY_URL}/eureka-registry
fi
docker build -t ${REGISTRY_URL}/eureka-registry .
docker push ${REGISTRY_URL}/eureka-registry
if docker ps -a | grep -i eureka-registry
then
docker rm -f eureka-registry
fi
docker create --name eureka-registry ${REGISTRY_URL}/eureka-registry
sh /opt/jenkinsWeb/bin/bootstrap.sh
~
最後點選儲存即可
可以看到把通過ssh
傳過來的jar
扔到 /opt/jenkinsWeb/release
目錄, 此目錄下還有個Dockerfile
用來構建Spring-boot
應用映象。內容:
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD kitty-eureka-registry.jar app.jar
ENV JAVA_OPTS="-Dlogging.path=/var/log"
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
- 構建後操作
第八步 測試構建效果:
-可以用curl
模擬
curl -s -u cbam:c4118bbe83b80a855eafc7939fd0xxxx -X POST http://222.27.196.8:8080/job/eureka-registry/build?token=yyyyy
如果出現Error 403 No valid crumb was included in the request錯誤, 在jenkins
全域性安全設定中取消 對 防止跨站點請求偽造 的勾選
-或著直接在IDEA
中直接編輯專案並push
到remote ,看效果已經開始構建:
-Github效果
-測試效果1
-測試效果2