GitLab整合Jenkins、Harborn構建pipeline流水線任務
阿新 • • 發佈:2020-11-16
# 一、計劃
在jenkins中構建流水線任務時,從GitLab當中拉取程式碼,通過maven打包,然後構建dokcer映象,並將映象推送至harbor當中。Jenkins中含開發、測試、生產檢視,開發人員可以對開發、測試的任務具有許可權;測試人員僅對測試任務具有許可權;管理員具有所有許可權。
# 二、jenkins所需外掛
```
Pipeline、docker-build-step、Docker Pipeline、Docker plugin、docker-build-step
、Role-based、Authorization Strategy
```
在jenkins中將上訴外掛安裝好。
# 三、Jenkins設定許可權(開發、測試、生產)
- "系統管理"--->"全域性安全配置"
[![BxzSqU.png](https://s3.ax1x.com/2020/11/12/BxzSqU.png)](https://imgchr.com/i/BxzSqU)
- "系統管理"--->"Manage and Assign Roles"
[![BzSrAe.png](https://s3.ax1x.com/2020/11/12/BzSrAe.png)](https://imgchr.com/i/BzSrAe)
- 選擇"Manage Roles",在"Global roles"中新增一個user角色,角色許可權可以自己調整,我這裡設定了該角色的所有讀許可權。
[![DSdVFx.png](https://s3.ax1x.com/2020/11/13/DSdVFx.png)](https://imgchr.com/i/DSdVFx)
- 編輯"Item roles",新增三個專案角色,分別代表開發、測試、生產,並設定許可權。
[![DSdZY6.png](https://s3.ax1x.com/2020/11/13/DSdZY6.png)](https://imgchr.com/i/DSdZY6)
根據正則,若任務名稱為dev或者DEV開頭,則該專案屬於開發組專案。編輯完成之後點選應用,儲存。
- 點選儲存後,回到"Manage and Assign Roles"頁面,點選"系統管理"--->"管理使用者"--->"新建使用者";建立兩個使用者分別代表開發人員,測試人員;生產人員就用管理員使用者。
[![BzkxMj.png](https://s3.ax1x.com/2020/11/12/BzkxMj.png)](https://imgchr.com/i/BzkxMj)
- 使用者建立完成之後,點選"系統管理"--->"Manage and Assign Roles"-->"Assign Roles"
[![BzQtCn.png](https://s3.ax1x.com/2020/11/12/BzQtCn.png)](https://imgchr.com/i/BzQtCn)
編輯完成之後,點選應用,儲存。
- 建立三個新的檢視,並按照前面的正則在分別在三個檢視建立一個空的流水線任務
[![Bzl5Q0.png](https://s3.ax1x.com/2020/11/12/Bzl5Q0.png)](https://imgchr.com/i/Bzl5Q0)
- 許可權驗證
admin使用者登入:
[![Bz8zyq.png](https://s3.ax1x.com/2020/11/12/Bz8zyq.png)](https://imgchr.com/i/Bz8zyq)
開發人員登入:
[![DSdoA1.png](https://s3.ax1x.com/2020/11/13/DSdoA1.png)](https://imgchr.com/i/DSdoA1)
測試人員登入:
[![DSd7h6.png](https://s3.ax1x.com/2020/11/13/DSd7h6.png)](https://imgchr.com/i/DSd7h6)
# 四、Jenkins中設定JDK、Maven
- 登入至Jenkins容器當中
```bash
#以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
```bash
root@8286c620ab88:/# cd /usr/local/
root@8286c620ab88:/usr/local# wget https://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
```
- 設定環境變數
```bash
root@8286c620ab88:/# vim /etc/profile
```
若沒有vi或者vim命令,可以先安裝:
```bash
root@8286c620ab88:/# apt-get update
root@8286c620ab88:/# apt-get install vim
```
在檔案末尾加上如下內容
```bash
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,檢驗是否生效
```bash
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命令時許可權不足,我這裡為了方便,使用了最簡單粗暴的方法,在宿主機下使用如下命令修改許可權
```bash
[root@node03 data]# chmod 777 /var/run/docker.sock
```
其他方法可以參考:在docker容器中呼叫和執行宿主機的docker
- 在Jenkins頁面中配置JDK和Maven,在Jenkins頁面中選擇"系統管理"-->"全域性工具配置"
[![DpG2HP.png](https://s3.ax1x.com/2020/11/13/DpG2HP.png)](https://imgchr.com/i/DpG2HP)
[![DpGj4U.png](https://s3.ax1x.com/2020/11/13/DpGj4U.png)](https://imgchr.com/i/DpGj4U)編輯完成之後,點選應用,儲存。
# 五、GitLab中建立測試專案
- 我這裡選擇從模板中建立一個Spring專案,專案名稱自擬
[![Dpt81g.png](https://s3.ax1x.com/2020/11/13/Dpt81g.png)](https://imgchr.com/i/Dpt81g)
- 我自己修改了部分pom檔案以及Dockerfile檔案
pom檔案:
```xml
4.0.0
com.example
demo
0.0.1-SNAPSHOT
jar
demo
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
2.0.1.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
SpringProject
org.springframework.boot
spring-boot-maven-plugin
org.apache.maven.plugins
maven-surefire-plugin
2.4.2
true
```
Dockerfile檔案:
```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中的專案
點選"流水線語法":
[![DpyCWR.png](https://s3.ax1x.com/2020/11/13/DpyCWR.png)](https://imgchr.com/i/DpyCWR)
選擇"git":
[![DpyT0O.png](https://s3.ax1x.com/2020/11/13/DpyT0O.png)](https://imgchr.com/i/DpyT0O)
填寫剛才在GitLab建立的專案地址,然後選擇"憑證"-->新增-->jenkins:
[![DpcJiQ.png](https://s3.ax1x.com/2020/11/13/DpcJiQ.png)](https://imgchr.com/i/DpcJiQ)
在彈窗中輸入對應資訊,然後點選"新增":
[![DpgsnP.png](https://s3.ax1x.com/2020/11/13/DpgsnP.png)](https://imgchr.com/i/DpgsnP)
點選"新增"後,在"憑據"下拉選擇剛才建立的憑據,然後點選"生成流水線指令碼",將生成的指令碼複製出來:
[![DpR5wV.png](https://s3.ax1x.com/2020/11/13/DpR5wV.png)](https://imgchr.com/i/DpR5wV)
- 回到配置頁面編寫pipeline指令碼:
```yaml
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: 'http://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的使用者名稱和密碼,然後再通過指令碼去獲取憑據中的使用者名稱和密碼
編寫完成後點選應用,儲存。
- 回到開發檢視頁面,構建剛才建立的流水線任務
[![Dkb9Pg.png](https://s3.ax1x.com/2020/11/16/Dkb9Pg.png)](https://imgchr.com/i/Dkb9Pg)
[![Dkj8U0.png](https://s3.ax1x.com/2020/11/16/Dkj8U0.png)](https://imgchr.com/i/Dkj8U0)
[![DkjrUx.png](https://s3.ax1x.com/2020/11/16/DkjrUx.png)](https://imgchr.com/i/DkjrUx)
- 第一次構建時間相對較久,因為maven構建時需要下載對應依賴,耐心等待構建完成,我這裡因為之前已經下載過相關依賴,所以時間較短
[![DAd5gs.png](https://s3.ax1x.com/2020/11/16/DAd5gs.png)](https://imgchr.com/i/DAd5gs)
# 七、檢驗
- 到harbor中檢視,發現映象已上傳
[![DAwQVf.png](https://s3.ax1x.com/2020/11/16/DAwQVf.png)](https://imgchr.com/i/DAwQVf)
[![DAwFUO.png](https://s3.ax1x.com/2020/11/16/DAwFUO.png)](https://imgchr.com/i/DAwFUO)
- 到另外一臺主機拉取映象,並以該映象建立容器
```bash
[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
```
- 訪問介面
[![DABW4O.png](https://s3.ax1x.com/2020/11/16/DABW4O.png)](https://imgchr.com/i/DABW4O)
[![DADiV0.png](https://s3.ax1x.com/2020/11/16/DADiV0.png)](https://imgchr.com/i