最近接到一個任務,就是講本地的maven項目,提交到gitlab上而後使用jenkins自動化集成,打包,生成鏡像,最後將鏡像上傳到harbor中,實現自動化的部署上線。總結這篇帖子的緣由是,做爲一個剛剛接觸docker的小白,也翻了不少篇博主的博客,通過了二個星期的洗禮,終於把這套流程走通了,這裏分享給你們,也讓你們少走一些彎路。
首先向你們介紹一些個人環境,我是在k8s上,安裝了3個組件:gitlab、jenkins、harbor,而且映射了端口,這樣能夠供外部訪問。因此我作的操做是jenkins基於k8s的自動化集成,而且使用的pipeline流水線任務。
目的:本地編寫web項目----》上傳到gitlab----》使用jenkins集成----》提交到harbor----》測試是否新發布的image可使用,而且其中的web項目能夠供外部訪問。本案例主要介紹一套流程熱點配置,其中的web項目只是簡單的實現hello World。html
建立一個項目,填寫項目名稱,並設置項目爲私有:
接着將本地項目提交到gitlab上管理:
這裏的對應步驟爲:
A) 初始化項目爲git項目:git init
B) 鏈接遠程gitlab:
git remote add origin http://172.18.28.13:32582/devops_test_group/devops_test_project.git
C) 將項目提交本地git倉庫:git add . &&git commit -m 「Initial commit」
D) 將本地倉庫推送到遠端gitlab倉庫:git push -u origin master
完成以上步驟,就能夠在gitlab中剛剛建立的項目中看見本身的本地項目中的內容:
項目介紹:
這是我項目的結構:
docker/dockerfile:build docker 的imagejava
#docker/dockerfile FROM centos MAINTAINER docer_user RUN yum install httpd RUN echo "/usr/sbin/httpd -DFOREGROUND" > /usr/local/bin/start.sh RUN chmod a+x /usr/local/bin/start.sh COPY ./*.war /var/www/html RUN echo "啓動Tomcat服務" EXPOSE 80 注意:這個dockerfile就是簡單的下載一個httpd服務,並將打好的war包,放入/var/www/html, 並暴露了80端口,只要啓動httpd服務,就能夠訪問到咱們的上線的web項目。
main/java:編寫具體的業務邏輯linux
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class HelloWorld extends HttpServlet { private String message; @Override public void init() throws ServletException { message = "Hello world, this message is from servlet!"; } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //設置響應內容類型 resp.setContentType("text/html"); //設置邏輯實現 PrintWriter out = resp.getWriter(); out.println("<h1>" + message + "</h1>"); } @Override public void destroy() { super.destroy(); } }
在web.xml中配置git
<servlet> <servlet-name>HelloWorld</servlet-name> <servlet-class>com.zy.web.HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/HelloWorld</url-pattern> </servlet-mapping>
build.sh:maven的打包命令web
#!/bin/sh mvn clean package #將maven項目打包
Jenkinsfile:流水線任務的自動化部署文件:docker
pipeline { agent { label "zjnx" } environment { //本地harbor的地址 DOCKER_REPO_URL = "172.18.28.37:32702" } stages { stage('Example Build') { environment { BUILDER = "gold" IMAGE_TAG = "master" JAVA_HOME = "/usr/jdk-8u131-linux-x64.tar/jdk1.8.0_131/" } steps { container('maven') { sh '''startdocker.sh $DOCKER_REPO_URL &''' sh '''chmod a+x build.sh ./build.sh cp target/*.war src/docker/ cd src/docker && docker build . -t devops-web-test:latest docker tag devops-web-test:latest ${DOCKER_REPO_URL}/${BUILDER}/devops-web-test:${IMAGE_TAG} docker push ${DOCKER_REPO_URL}/${BUILDER}/devops-web-test:${IMAGE_TAG}''' } } } } } 注意:這裏具體的將maven項目打包,構建一個docker 的image,並將構建的image打標籤,推送至本身的harbor倉庫中。
新建視圖:
新建任務
接着,後面的構建觸發器是選擇構建項目的觸發方式,觸發方式有按期觸發,構建其餘項目以後觸發,gitlab有新推送時觸發等等,能夠根據須要自行選擇,推薦選擇Poll SCM,也就是週期性輪詢gitlab,若是有代碼合入,則觸發構建的配置。 輪詢週期能夠基於crontab的時間樣式配置。好比H 表明每小時輪詢一次。
而後是流水線配置,選擇pipeline script from scm,scm選擇git,url使用前面gitlab中的項目地址http://172.18.28.13:32582/devops_test_group/devops_test_project.git
這裏注意,若是是事先沒有建立用戶的還,這裏點擊add,添加一個鏈接gitlab的用戶:
填寫正確的用戶名,和密碼:
選擇檢出的分支,默認是master:
完成上面的配置,須要配置系統:
在這裏把執行者數量改爲大於0
Jenkins安裝後,默認會配置一個Kubernetes Cloud。以下圖所示
這裏首先測試一下,此時的鏈接是否成功:centos
配置kubernetes Pod template:
注意:Labels:這裏的labels會在以後項目的jenkinsfile中使用到(兩者必須配置同樣)
Namespace:是我k8s集羣中的namespace。
docker image:能夠在:
上面這個模板的Name必定要是:jnlp
因爲使用maven工具打包,這一還須要配置一個模板
注意:這裏的name在編寫的jenkins中會使用到。
docker image:能夠在
docker pull tcregistry.starcloud.io/devops/base/builder:centos2018/9/
拉取以後,上傳到本身的harbor上。bash
注意:兩個模板中 這裏須要勾上。
配置Pod Env:
上面的jenkins的URL能夠在這裏找到:
Pod annotation配置
名稱爲:命名空間_shared
配置完如上配置以後,點擊保存。app
此時咱們再看在gitlab中的項目:
其中注意:這裏解釋jenkinsfile中的幾點:
最後,構建剛剛的任務:
若是成功的話:
此時能夠作一個測試:(從harbor中下載鏡像,而且運行),咱們在建立一個流水線任務:(直接編寫腳本便可):
將如下內容copy到腳本中:maven
pipeline { agent { label "zjnx" } environment { //該docker url是tdc上安裝的harbor的地址 DOCKER_REPO_URL = "172.18.28.37:32702" } stages { stage('Example Build') { environment { BUILDER = "gold" IMAGE_TAG = "master" JAVA_HOME = "/usr/jdk-8u131-linux-x64.tar/jdk1.8.0_131/" } steps { container('maven') { sh '''startdocker.sh $DOCKER_REPO_URL &''' sh '''docker pull 172.18.28.37:32702/gold/devops-web-test:master docker run -it -d -p 9999:80 172.18.28.37:32702/gold/devops-web-test:master /bin/bash -c /usr/local/bin/start.sh docker images docker ps -a ''' } } } } }
構建成功以後,能看到上一個任務push到harbor的鏡像,被pull下來,而且能夠運行: