GitLab集成Jenkins、Harborn構建pipeline流水線任務
一、計劃
在jenkins中構建流水線任務時,從GitLab當中拉取代碼,通過maven打包,然後構建dokcer鏡像,並將鏡像推送至harbor當中。Jenkins中含開發、測試、生產視圖,開發人員可以對開發、測試的任務具有權限;測試人員僅對測試任務具有權限;管理員具有所有權限。
二、jenkins所需插件
Pipeline、docker-build-step、Docker Pipeline、Docker plugin、docker-build-step
、Role-based、Authorization Strategy
在jenkins中將上訴插件安裝好。
三、Jenkins設置權限(開發、測試、生產)
-
“系統管理”—>”全局安全配置”
-
“系統管理”—>”Manage and Assign Roles”
-
選擇”Manage Roles”,在”Global roles”中添加一個user角色,角色權限可以自己調整,我這裡設置了該角色的所有讀權限。
-
編輯”Item roles”,添加三個項目角色,分別代表開發、測試、生產,並設置權限。
根據正則,若任務名稱為dev或者DEV開頭,則該項目屬於開發組項目。編輯完成之後點擊應用,保存。
-
點擊保存後,回到”Manage and Assign Roles”頁面,點擊”系統管理”—>”管理用戶”—>”新建用戶”;創建兩個用戶分別代表開發人員,測試人員;生產人員就用管理員用戶。
-
用戶創建完成之後,點擊”系統管理”—>”Manage and Assign Roles”–>”Assign Roles”
編輯完成之後,點擊應用,保存。
-
創建三個新的視圖,並按照前面的正則在分別在三個視圖創建一個空的流水線任務
-
權限驗證
admin用戶登錄:
開發人員登錄:
測試人員登錄:
四、Jenkins中設置JDK、Maven
-
登錄至Jenkins容器當中
#以root用戶登錄,避免後面下載maven時權限不足 [root@node03 docker-jenkins]# docker-compose exec -u root jenkins /bin/bash root@8286c620ab88:/# java -version openjdk version "1.8.0_242" OpenJDK Runtime Environment (build 1.8.0_242-b08) OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode) root@8286c620ab88:/# whereis java java: /usr/local/openjdk-8/bin/java
登錄到容器中發現jdk已安裝;不用再安裝jdk。
-
安裝maven,我這裡將maven安裝至容器中/usr/local/maven3.6
root@8286c620ab88:/# cd /usr/local/ root@8286c620ab88:/usr/local# wget //mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz #下載成功後解壓 root@8286c620ab88:/usr/local# tar xvf apache-maven-3.6.3-bin.tar.gz #重命名 root@8286c620ab88:/usr/local# mv apache-maven-3.6.3/ maven3.6
-
設置環境變量
root@8286c620ab88:/# vim /etc/profile
若沒有vi或者vim命令,可以先安裝:
root@8286c620ab88:/# apt-get update root@8286c620ab88:/# apt-get install vim
在文件末尾加上如下內容
export JAVA_HOME=/usr/local/openjdk-8 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin export M2_HOME=/usr/local/maven3.6 export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
建議把JAVA_HOME和M2_HOME記住,待會需要在Jenkins頁面中設置
編輯完成之後保存退出,然後讓環境變量生效,執行source /etc/profile,檢驗是否生效
root@8286c620ab88:/# source /etc/profile root@8286c620ab88:/# java -version openjdk version "1.8.0_242" OpenJDK Runtime Environment (build 1.8.0_242-b08) OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode) root@8286c620ab88:/# mvn -v Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: /usr/local/maven3.6 Java version: 1.8.0_242, vendor: Oracle Corporation, runtime: /usr/local/openjdk-8/jre Default locale: en, platform encoding: UTF-8 OS name: "linux", version: "3.10.0-862.14.4.el7.x86_64", arch: "amd64", family: "unix" #設置完成之後即可退出容器
-
為避免在jenkins容器中使用docker命令時權限不足,我這裡為了方便,使用了最簡單粗暴的方法,在宿主機下使用如下命令修改權限
[root@node03 data]# chmod 777 /var/run/docker.sock
其他方法可以參考:在docker容器中調用和執行宿主機的docker
-
在Jenkins頁面中配置JDK和Maven,在Jenkins頁面中選擇”系統管理”–>”全局工具配置”
五、GitLab中創建測試項目
-
我這裡選擇從模板中創建一個Spring項目,項目名稱自擬
-
我自己修改了部分pom文件以及Dockerfile文件
pom文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <finalName>SpringProject</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.4.2</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> </plugins> </build> </project>
Dockerfile文件:
FROM maven:3-jdk-8-alpine MAINTAINER [email protected] RUN mkdir -p /usr/src/app WORKDIR /usr/src/app ENV PORT 5000 EXPOSE $PORT ADD ./target/SpringProject.jar ./app.jar ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
六、在Jenkins開發視圖中創建流水線任務(pipeline)
-
任務名按照上面的配置,dev開頭的項目屬於開發組項目,test開頭的項目屬於項目,prod開頭的屬於生產項目;這裡僅創建一個開發流水線任務用來演示,測試和生產的配置與開發大同小異。
註:由於我前面設置開發人員時沒有設置”添加憑證”的權限,所以需要在配置任務時,我採用管理員用戶登錄,因為在配置需要添加憑證才能拉取GitLab中的代碼
-
流水線任務需要編寫pipeline腳本,編寫腳本的第一步應該是拉取GitLab中的項目
點擊”流水線語法”:
選擇”git”:
填寫剛才在GitLab創建的項目地址,然後選擇”憑證”–>添加–>jenkins:
在彈窗中輸入對應信息,然後點擊”添加”:
點擊”添加”後,在”憑據”下拉選擇剛才創建的憑據,然後點擊”生成流水線腳本”,將生成的腳本複製出來:
-
回到配置頁面編寫pipeline腳本:
pipeline{ agent any environment { HARBOR_HOST = "192.168.113.48:8930" BUILD_VERSION = createVersion() } tools{ // 添加環境,名稱為Jenkins全局配置中自己定義的別名 jdk 'jdk1.8' maven 'maven3.6' } stages{ stage("拉取代碼"){ //check CODE steps { git credentialsId: 'c4d554a2-052c-40d5-bb75-12c5a70e0e97', url: '//192.168.113.48:8929/linaj/springproject.git' } } stage("maven構建"){ steps { sh "mvn clean package -Dmaven.test.skip=true" } } stage("構建docker鏡像,並push到harbor當中"){ //docker push steps { sh ''' docker build -t springproject:$BUILD_VERSION . docker tag springproject:$BUILD_VERSION ${HARBOR_HOST}/dev/springproject:$BUILD_VERSION ''' sh "docker login -u admin -p h12345" + " ${HARBOR_HOST}" sh "docker push ${HARBOR_HOST}/dev/springproject:$BUILD_VERSION" } } } } def createVersion() { // 定義一個版本號作為當次構建的版本,輸出結果 20201116165759_1 return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}" }
請確保Harbor中已經創建dev倉庫;pipeline的寫法可以自己在網上學習,腳本中應盡量不要出現明文的密碼,為了演示方便,我這裡直接使用了harbor的明文密碼,正規來說,應該再建一個憑據來維護harborn的用戶名和密碼,然後再通過腳本去獲取憑據中的用戶名和密碼
編寫完成後點擊應用,保存。
-
回到開發視圖頁面,構建剛才創建的流水線任務
-
第一次構建時間相對較久,因為maven構建時需要下載對應依賴,耐心等待構建完成,我這裡因為之前已經下載過相關依賴,所以時間較短
七、檢驗
-
到harbor中查看,發現鏡像已上傳
-
到另外一台主機拉取鏡像,並以該鏡像創建容器
[root@node02 ~]# docker pull 192.168.113.48:8930/dev/springproject:20201116165759_1 [root@node02 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.113.48:8930/dev/springproject 20201116165759_1 bab09cc7b4e5 13 minutes ago 138MB [root@node02 ~]# docker run -p 5000:8080 -d bab0 d5cbe48b83f3d7b69bfec02692e56e6fd9321e35ef4995faf8a9c659ef00a12d [root@node02 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d5cbe48b83f3 bab0 "java -Djava.securit…" 24 seconds ago Up 15 seconds 5000/tcp, 0.0.0.0:5000->8080/tcp interesting_visvesvaraya
-
訪問接口