前言
https://www.jianshu.com/p/2d89fd1b4403
在日常開發中,經常會有發布的需求,而且經常會碰到各種環境,比如:開發環境、測試環境、生產環境。雖然可以使用手動構建、上傳服務器部署的方式,但在微服務架構下一個項目經常包含多個微服務的部署,如果用手動方式就會非常繁瑣而且容易出錯。使用jenkins結合SCM可以實現代碼的整個自動化構建部署過程。
本文中自動構建部署過程大致完成了以下步驟:
- 提交spring boot項目代碼並打上git tag,上傳代碼及tag至gitlab
- gitlab通過webhook自動觸發jenkins執行任務
- jenkins獲取代碼,執行代碼編譯、構建docker鏡像、上傳docker鏡像至harbor鏡像倉庫、執行kubectl命令部署至k8s。
本文中采用jenkins pipeline執行整個jenkins的構建過程,在pipeline中使用docker執行maven構建。文中構建的docker鏡像的tag直接采用git中的tag。
下面的示例中,jenkins版本為2.121.3,gitlab版本為10.0.2-ce,如果使用的版本不一致可能會有部分設置差異。
部署Jenkins
這里采用docker的方式部署jenkins。
- 在終端中運行docker命令,使用jenkinsci/blueocean鏡像運行容器。
docker run \
-d \
-u root \
-p 8080:8080 \
-v jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
- 訪問 http://localhost:8080 地址,等待出現下面解鎖界面。
- 使用docker logs 命令從日志信息中 復制自動生成的密碼(在兩組星號之間)。
-
在 解鎖Jenkins 頁面, 粘貼密碼並繼續。
-
解鎖jenkins后,在界面中選擇“安裝建議的插件”。
-
最后,jenkins要求創建管理員用戶。創建新用戶或使用admin用戶,按照步驟完成后即可登錄使用jenkis了。
注:由於后面jenkins pipeline任務會上傳docker鏡像至harbor倉庫,如果harbor使用http需要在/etc/docker/daemon.json中將地址配置到insecure-registries;如果harbor使用自簽名https證書,需要將ca證書放入/etc/docker/certs.d/目錄下。設置完需要重啟docker服務。
准備java示例工程
下面新建spring boot示例工程,示例工程的代碼地址為:https://gitee.com/tinylk/pipeline-demo
創建spring boot示例工程
1.通過 https://start.spring.io/ 生成spring boot基礎工程,添加一個示例Controller類。package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@GetMapping("")
public String hello() {
return "Hello!";
}
}
2.修改application配置文件,設置端口。
spring.application.name=pipeline-demo
server.port=40080
3.編譯運行,訪問 http://localhost:40080 地址可以看到示例運行結果。
添加Dockerfile
在工程根目錄創建Dockerfile,用來構建docker鏡像。其中${JAR_FILE}參數在pipeline執行docker build時,通過build-arg參數傳入。
FROM openjdk:8-jdk-alpine
#構建參數
ARG JAR_FILE
ARG WORK_PATH="/opt/demo"
# 環境變量
ENV JAVA_OPTS="" \
JAR_FILE=${JAR_FILE}
#設置時區
RUN apk update && apk add ca-certificates && \
apk add tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
COPY target/$JAR_FILE $WORK_PATH/
WORKDIR $WORK_PATH
ENTRYPOINT exec java $JAVA_OPTS -jar $JAR_FILE
添加k8s的Deployment配置
在工程根目錄創建k8s-deployment.tpl文件,此文件用來作為k8s的yaml文件模板。在jenkens pipeline執行時,會先將tpl文件中{}括起來的自定義參數用sed命令替換為實際的內容。(由於對k8s的了解有限,不知道有沒有更好的方式來實現)
apiVersion: apps/v1
kind: Deployment
metadata:
name: {APP_NAME}-deployment
labels:
app: {APP_NAME}
spec:
replicas: 1
selector:
matchLabels:
app: {APP_NAME}
template:
metadata:
labels:
app: {APP_NAME}
spec:
containers:
- name: {APP_NAME}
image: {IMAGE_URL}:{IMAGE_TAG}
ports:
- containerPort: 40080
env:
- name: SPRING_PROFILES_ACTIVE
value: {SPRING_PROFILE}
添加Jenkinsfile
在工程根目錄創建Jenkinsfile,用來執行jenkins pipeline任務。Jenkinsfile文件的大概內容描述如下:
-
environment中變量說明,environment的文檔說明參見:https://jenkins.io/zh/doc/book/pipeline/jenkinsfile/#%E5%A4%84%E7%90%86%E5%87%AD%E8%AF%81 。
- HARBOR_CREDS為harbor鏡像倉庫的用戶密碼,數據保存為jenkins的“username and password”類型的憑據,用credentials方法從憑據中獲取。使用時通過HARBOR_CREDS_USR獲取用戶名,HARBOR_CREDS_PSW獲取密碼。
- K8S_CONFIG為k8s中kubectl命令的yaml配置文件內容,數據保存為jenkins的“Secret Text”類型的憑據,用credentials方法從憑據中獲取。這里保存的yaml配置文件內容以base64編碼格式保存,在設置憑據時先要進行base64編碼。(此base64編碼是非必須的,如果直接保存原文,下面Jenkinsfile中需要去掉base64 -d 解碼)
- GIT_TAG變量通過執行sh命令獲取當前git的tag值。由於后面構建docker鏡像時使用git的tag作為鏡像的標簽,所以這個變量也不能為空。
-
parameters中變量說明
HARBOR_HOST:harbor鏡像倉庫地址。
DOCKER_IMAGE:docker鏡像名,包含harbor項目名稱。
APP_NAME:k8s中的標簽名稱,對應k8s的yaml模板中的{APP_NAME}。
K8S_NAMESPACE:k8s中的namespace名稱,執行kubectl命令會部署至此命名空間。
- stages說明:
- Maven Build:使用docker的方式執行maven命令,args參數中將.m2目錄映射出來,避免執行時重復從遠端獲取依賴;stash步驟中將jar文件保存下來,供后面的stage使用。
- Docker Build:unstash獲取jar文件。通過sh依次執行docker命令登錄harbor、構建鏡像、上傳鏡像、移除本地鏡像。構建鏡像時,會獲取jar文件名傳入JAR_FILE參數。
- Deploy:使用docker的方式執行kubectl命令。在執行前先將K8S_CONFIG中的內容進行base64解密並存為~/.kube/config配置文件,然后執行sed命令將k8s-deployment.tpl文件中“{參數名}”形式參數替換為實際的參數值,最后執行kubectl命令部署至k8s。
parameters中的參數在pipeline任務執行一次后,第二次執行時可以在界面上修改參數值。
這里的stage都是一個接一個自動執行,如果需要手動執行可以使用input指令實現。參見:https://jenkins.io/zh/doc/book/pipeline/syntax/#input
// 需要在jenkins的Credentials設置中配置jenkins-harbor-creds、jenkins-k8s-config參數
pipeline {
agent any
environment {
HARBOR_CREDS = credentials('jenkins-harbor-creds')
K8S_CONFIG = credentials('jenkins-k8s-config')
GIT_TAG = sh(returnStdout: true,script: 'git describe --tags --always').trim()
}
parameters {
string(name: 'HARBOR_HOST', defaultValue: '172.23.101.66', description: 'harbor倉庫地址')
string(name: 'DOCKER_IMAGE', defaultValue: 'tssp/pipeline-demo', description: 'docker鏡像名')
string(name: 'APP_NAME', defaultValue: 'pipeline-demo', description: 'k8s中標簽名')
string(name: 'K8S_NAMESPACE', defaultValue: 'demo', description: 'k8s的namespace名稱')
}
stages {
stage('Maven Build') {
when { expression { env.GIT_TAG != null } }
agent {
docker {
image 'maven:3-jdk-8-alpine'
args '-v $HOME/.m2:/root/.m2'
}
}
steps {
sh 'mvn clean package -Dfile.encoding=UTF-8 -DskipTests=true'
stash includes: 'target/*.jar', name: 'app'
}
}
stage('Docker Build') {
when {
allOf {
expression { env.GIT_TAG != null }
}
}
agent any
steps {
unstash 'app'
sh "docker login -u ${HARBOR_CREDS_USR} -p ${HARBOR_CREDS_PSW} ${params.HARBOR_HOST}"
sh "docker build --build-arg JAR_FILE=`ls target/*.jar |cut -d '/' -f2` -t ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG} ."
sh "docker push ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG}"
sh "docker rmi ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG}"
}
}
stage('Deploy') {
when {
allOf {
expression { env.GIT_TAG != null }
}
}
agent {
docker {
image 'lwolf/helm-kubectl-docker'
}
}
steps {
sh "mkdir -p ~/.kube"
sh "echo ${K8S_CONFIG} | base64 -d > ~/.kube/config"
sh "sed -e 's#{IMAGE_URL}#${params.HARBOR_HOST}/${params.DOCKER_IMAGE}#g;s#{IMAGE_TAG}#${GIT_TAG}#g;s#{APP_NAME}#${params.APP_NAME}#g;s#{SPRING_PROFILE}#k8s-test#g' k8s-deployment.tpl > k8s-deployment.yml"
sh "kubectl apply -f k8s-deployment.yml --namespace=${params.K8S_NAMESPACE}"
}
}
}
}
配置jenkins pipeline任務
創建jenkins pipeline任務,並設置需要的參數。
新建pipeline任務
點擊“新建任務”,輸入名稱並選擇“流水線”(pipeline),然后點擊確定。
配置 pipeline任務
進入任務的配置界面,在流水線(pipeline)設置部分,選擇“Pipeline script from SCM”。SCM選項選為“Git”,配置好工程的git地址以及獲取代碼的憑證信息。然后在“Additional Behaviours”中添加“Clean before checkout”。
配置harbor賬號與密碼
選擇“憑據”,然后在下圖所示位置點擊“添加憑據”。在新憑據設置界面,類型選擇為“Username with password”,ID設置為“jenkins-harbor-creds”(此處的ID必須與Jenkinsfile中的保持一致)。Username與Password分別設置為harbor鏡像私庫的用戶名和密碼。添加憑證
設置habor賬號密碼
配置k8s的kube.config配置信息
k8s中使用kubectl命令時需要yaml格式的服務器及授權信息配置文件。這里將kubectl的yaml配置文件的內容以base64編碼后保存在jenkins的憑據中。pipeline任務執行時,先從jenkins憑據中獲取內容,進行base64解碼后將配置保存為~/.kube/config文件。kubectl的配置文件的內容如下:
apiVersion: v1
kind: Config
clusters:
- name: "test"
cluster:
server: "https://xxxxx"
api-version: v1
certificate-authority-data: "xxxxxx"
users:
- name: "user1"
user:
token: "xxxx"
contexts:
- name: "test"
context:
user: "user1"
cluster: "test"
current-context: "test"
可以在linux中采用下面命令將kubectl的yaml配置文件進行base64編碼。
base64 kube-config.yml > kube-config.txt
然后類似上一步,在jenkins憑據中增加配置文件內容。在憑據設置界面,類型選擇為“Secret text”,ID設置為“jenkins-k8s-config”(此處的ID必須與Jenkinsfile中的保持一致),Secret設置為上面經過base64編碼后的配置文件內容。
測試pipeline任務
在創建的pipeline任務中,點擊“立即構建”即可立即執行pipeline任務。
在jenkins中存在一個名為Blue Ocean的新界面,在新界面中也可以執行pipeline任務,而且新的界面中查看任務的執行結果更加清晰,所以執行結果日志建議在新界面中查看。點擊“Open Blue Ocean”菜單進入新界面。
在Blue Ocean新界面中,可以點擊“運行”執行pipeline任務。
在執行pipeline任務,執行“git describe --tags”命令出錯,這是由於上面示例的Jenkinsfile中要求必須有git的tag。在git中增加tag,並提交上傳至gitlab后即可解決。
在git中增加tag,並提交上傳至gitlab后重新執行pipeline任務,所有步驟都執行成功。
執行成功后,查看harbor鏡像倉庫,docker鏡像成功上傳至harbor。
執行成功后,查看k8s中pod運行日志,服務啟動成功。
設置gitlab自動觸發jenkins
前面的步驟中已經完成了手動執行jenkins執行pipeline任務完成構建部署任務,下面說明如何在代碼提交后讓gitlab自動觸發jenkins執行pipeline任務。
jenkins中安裝gitlab插件
要實現gitlab自動觸發jenkins任務,需要在jenkins中安裝gitlab插件。從jenkins的“系統管理”-“管理插件”中找到gitlab插件並下載安裝,重啟jenkins后生效。
在gitlab中創建訪問token
安裝的gitlab插件在配置時,需要gitlab的訪問token,先要在gitlab中創建訪問的token。點擊“用戶設置”-“Access Tokens”菜單,進入訪問token設置界面。然后輸入“Name”,並在“Scopes”中勾選“api”,點擊“Create ...”按鈕即可創建訪問token。創建成功后,一定要將生成的token保存下來,后面將無法再查看生成的token,如果未保存后面只能重新生成。
jenkins中配置gitlab插件
在jenkins中,進入“系統管理”-“系統設置”-“Gitlab”配置。
輸入“Connection name”、“Gitlab host URL”,在“Credentials”中點擊“Add”添加gitlab的授權token。
點擊添加后,會進入添加憑據界面。在添加界面,選擇類型為“GitLab API token”,API token設置為前面在gitlab中創建的token值。然后點擊“添加”按鈕創建憑據。
添加完gitlab api token,在Gitlab設置界面“Credentials”中選擇前面添加的token,然后點擊“Test Connection”測試是否成功。測試成功后保存。
配置pipeline任務,啟用觸發器
進入jenkins的任務設置界面,在“構建觸發器”中,勾上“Build when a change pushed to Gitlab.Gitlab webhook URL ...”(這里的webhook URL在后面配置gitlab時需要),根據自己的需要設置其它的選項。點擊“高級”按鈕,然后點擊“Generate”按鈕生成Secret token(這里的token后面配置gitlab時需要)。
gitlab配置webhook
在gitlab的項目設置中選擇“Integrations”,然后在URL和Secret token中填入上一步jenkins設置中的到的內容。由於本文中是在git上打了tag后才觸發jenkins執行任務,所以這里勾選“Tag push events”,然后去掉“Enable SSL verification”的勾選項,並點擊“Add webhook”按鈕添加。如果需要每次提交代碼都觸發則應該選“Push events”(注意:這里選擇Push events后,Jenkinsfile中也需要做相應的修改,去掉git的tag相關內容,否則執行時會出錯)。
webhook測試
添加完成后,在下面可以看到剛才添加的webhook,點擊“Test”按鈕在彈出的菜單中選擇“Tag push events”發送測試請求,發送成功后會顯示“Hook executed successfully”信息。
Tag push Test
push成功
webhook發送成功后,到jenkins中可以看到正在執行觸發的任務。配置成功后,后面只要有git的tag提交到gitlab即可直接觸發jenkins執行pipline任務。
webhook觸發執行
作者:tinylk 原文:www.jianshu.com/p/2d89fd1b4403
前言
在日常開發中,經常會有發布的需求,而且經常會碰到各種環境,比如:開發環境、測試環境、生產環境。雖然可以使用手動構建、上傳服務器部署的方式,但在微服務架構下一個項目經常包含多個微服務的部署,如果用手動方式就會非常繁瑣而且容易出錯。使用jenkins結合SCM可以實現代碼的整個自動化構建部署過程。
本文中自動構建部署過程大致完成了以下步驟:
- 提交spring boot項目代碼並打上git tag,上傳代碼及tag至gitlab
- gitlab通過webhook自動觸發jenkins執行任務
- jenkins獲取代碼,執行代碼編譯、構建docker鏡像、上傳docker鏡像至harbor鏡像倉庫、執行kubectl命令部署至k8s。
本文中采用jenkins pipeline執行整個jenkins的構建過程,在pipeline中使用docker執行maven構建。文中構建的docker鏡像的tag直接采用git中的tag。
下面的示例中,jenkins版本為2.121.3,gitlab版本為10.0.2-ce,如果使用的版本不一致可能會有部分設置差異。
部署jenkins
這里采用docker的方式部署jenkins。
- 在終端中運行docker命令,使用jenkinsci/blueocean鏡像運行容器。
docker run \
-d \
-u root \
-p 8080:8080 \
-v jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
-
訪問 http://localhost:8080 地址,等待出現下面解鎖界面。
解鎖jenkins -
使用docker logs 命令從日志信息中 復制自動生成的密碼(在兩組星號之間)。
默認密碼 -
在 解鎖Jenkins 頁面, 粘貼密碼並繼續。
-
解鎖jenkins后,在界面中選擇“安裝建議的插件”。
-
最后,jenkins要求創建管理員用戶。創建新用戶或使用admin用戶,按照步驟完成后即可登錄使用jenkis了。
注:由於后面jenkins pipeline任務會上傳docker鏡像至harbor倉庫,如果harbor使用http需要在/etc/docker/daemon.json中將地址配置到insecure-registries;如果harbor使用自簽名https證書,需要將ca證書放入/etc/docker/certs.d/目錄下。設置完需要重啟docker服務。
准備java示例工程
下面新建spring boot示例工程,示例工程的代碼地址為:https://gitee.com/tinylk/pipeline-demo
創建spring boot示例工程
- 通過 https://start.spring.io/ 生成spring boot基礎工程,添加一個示例Controller類。
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@GetMapping("")
public String hello() {
return "Hello!";
}
}
- 修改application配置文件,設置端口。
spring.application.name=pipeline-demo
server.port=40080
- 編譯運行,訪問 http://localhost:40080 地址可以看到示例運行結果。
添加Dockerfile
在工程根目錄創建Dockerfile,用來構建docker鏡像。其中${JAR_FILE}參數在pipeline執行docker build時,通過build-arg參數傳入。
FROM openjdk:8-jdk-alpine
#構建參數
ARG JAR_FILE
ARG WORK_PATH="/opt/demo"
# 環境變量
ENV JAVA_OPTS="" \
JAR_FILE=${JAR_FILE}
#設置時區
RUN apk update && apk add ca-certificates && \
apk add tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
COPY target/$JAR_FILE $WORK_PATH/
WORKDIR $WORK_PATH
ENTRYPOINT exec java $JAVA_OPTS -jar $JAR_FILE
添加k8s的Deployment配置
在工程根目錄創建k8s-deployment.tpl文件,此文件用來作為k8s的yaml文件模板。在jenkens pipeline執行時,會先將tpl文件中{}括起來的自定義參數用sed命令替換為實際的內容。(由於對k8s的了解有限,不知道有沒有更好的方式來實現)
apiVersion: apps/v1
kind: Deployment
metadata:
name: {APP_NAME}-deployment
labels:
app: {APP_NAME}
spec:
replicas: 1
selector:
matchLabels:
app: {APP_NAME}
template:
metadata:
labels:
app: {APP_NAME}
spec:
containers:
- name: {APP_NAME}
image: {IMAGE_URL}:{IMAGE_TAG}
ports:
- containerPort: 40080
env:
- name: SPRING_PROFILES_ACTIVE
value: {SPRING_PROFILE}
添加Jenkinsfile
在工程根目錄創建Jenkinsfile,用來執行jenkins pipeline任務。Jenkinsfile文件的大概內容描述如下:
- environment中變量說明,environment的文檔說明參見:https://jenkins.io/zh/doc/book/pipeline/jenkinsfile/#%E5%A4%84%E7%90%86%E5%87%AD%E8%AF%81 。
- HARBOR_CREDS為harbor鏡像倉庫的用戶密碼,數據保存為jenkins的“username and password”類型的憑據,用credentials方法從憑據中獲取。使用時通過HARBOR_CREDS_USR獲取用戶名,HARBOR_CREDS_PSW獲取密碼。
- K8S_CONFIG為k8s中kubectl命令的yaml配置文件內容,數據保存為jenkins的“Secret Text”類型的憑據,用credentials方法從憑據中獲取。這里保存的yaml配置文件內容以base64編碼格式保存,在設置憑據時先要進行base64編碼。(此base64編碼是非必須的,如果直接保存原文,下面Jenkinsfile中需要去掉base64 -d 解碼)
- GIT_TAG變量通過執行sh命令獲取當前git的tag值。由於后面構建docker鏡像時使用git的tag作為鏡像的標簽,所以這個變量也不能為空。
- parameters中變量說明
- HARBOR_HOST:harbor鏡像倉庫地址。
- DOCKER_IMAGE:docker鏡像名,包含harbor項目名稱。
- APP_NAME:k8s中的標簽名稱,對應k8s的yaml模板中的{APP_NAME}。
- K8S_NAMESPACE:k8s中的namespace名稱,執行kubectl命令會部署至此命名空間。
- stages說明:
- Maven Build:使用docker的方式執行maven命令,args參數中將.m2目錄映射出來,避免執行時重復從遠端獲取依賴;stash步驟中將jar文件保存下來,供后面的stage使用。
- Docker Build:unstash獲取jar文件。通過sh依次執行docker命令登錄harbor、構建鏡像、上傳鏡像、移除本地鏡像。構建鏡像時,會獲取jar文件名傳入JAR_FILE參數。
- Deploy:使用docker的方式執行kubectl命令。在執行前先將K8S_CONFIG中的內容進行base64解密並存為~/.kube/config配置文件,然后執行sed命令將k8s-deployment.tpl文件中“{參數名}”形式參數替換為實際的參數值,最后執行kubectl命令部署至k8s。
parameters中的參數在pipeline任務執行一次后,第二次執行時可以在界面上修改參數值。
這里的stage都是一個接一個自動執行,如果需要手動執行可以使用input指令實現。參見:https://jenkins.io/zh/doc/book/pipeline/syntax/#input
// 需要在jenkins的Credentials設置中配置jenkins-harbor-creds、jenkins-k8s-config參數
pipeline {
agent any
environment {
HARBOR_CREDS = credentials('jenkins-harbor-creds')
K8S_CONFIG = credentials('jenkins-k8s-config')
GIT_TAG = sh(returnStdout: true,script: 'git describe --tags --always').trim()
}
parameters {
string(name: 'HARBOR_HOST', defaultValue: '172.23.101.66', description: 'harbor倉庫地址')
string(name: 'DOCKER_IMAGE', defaultValue: 'tssp/pipeline-demo', description: 'docker鏡像名')
string(name: 'APP_NAME', defaultValue: 'pipeline-demo', description: 'k8s中標簽名')
string(name: 'K8S_NAMESPACE', defaultValue: 'demo', description: 'k8s的namespace名稱')
}
stages {
stage('Maven Build') {
when { expression { env.GIT_TAG != null } }
agent {
docker {
image 'maven:3-jdk-8-alpine'
args '-v $HOME/.m2:/root/.m2'
}
}
steps {
sh 'mvn clean package -Dfile.encoding=UTF-8 -DskipTests=true'
stash includes: 'target/*.jar', name: 'app'
}
}
stage('Docker Build') {
when {
allOf {
expression { env.GIT_TAG != null }
}
}
agent any
steps {
unstash 'app'
sh "docker login -u ${HARBOR_CREDS_USR} -p ${HARBOR_CREDS_PSW} ${params.HARBOR_HOST}"
sh "docker build --build-arg JAR_FILE=`ls target/*.jar |cut -d '/' -f2` -t ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG} ."
sh "docker push ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG}"
sh "docker rmi ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG}"
}
}
stage('Deploy') {
when {
allOf {
expression { env.GIT_TAG != null }
}
}
agent {
docker {
image 'lwolf/helm-kubectl-docker'
}
}
steps {
sh "mkdir -p ~/.kube"
sh "echo ${K8S_CONFIG} | base64 -d > ~/.kube/config"
sh "sed -e 's#{IMAGE_URL}#${params.HARBOR_HOST}/${params.DOCKER_IMAGE}#g;s#{IMAGE_TAG}#${GIT_TAG}#g;s#{APP_NAME}#${params.APP_NAME}#g;s#{SPRING_PROFILE}#k8s-test#g' k8s-deployment.tpl > k8s-deployment.yml"
sh "kubectl apply -f k8s-deployment.yml --namespace=${params.K8S_NAMESPACE}"
}
}
}
}
配置jenkins pipeline任務
創建jenkins pipeline任務,並設置需要的參數。
新建pipeline任務
點擊“新建任務”,輸入名稱並選擇“流水線”(pipeline),然后點擊確定。

配置 pipeline任務
進入任務的配置界面,在流水線(pipeline)設置部分,選擇“Pipeline script from SCM”。SCM選項選為“Git”,配置好工程的git地址以及獲取代碼的憑證信息。然后在“Additional Behaviours”中添加“Clean before checkout”。

配置harbor賬號與密碼
選擇“憑據”,然后在下圖所示位置點擊“添加憑據”。在新憑據設置界面,類型選擇為“Username with password”,ID設置為“jenkins-harbor-creds”(此處的ID必須與Jenkinsfile中的保持一致)。Username與Password分別設置為harbor鏡像私庫的用戶名和密碼。


配置k8s的kube.config配置信息
k8s中使用kubectl命令時需要yaml格式的服務器及授權信息配置文件。這里將kubectl的yaml配置文件的內容以base64編碼后保存在jenkins的憑據中。pipeline任務執行時,先從jenkins憑據中獲取內容,進行base64解碼后將配置保存為~/.kube/config文件。kubectl的配置文件的內容如下:
apiVersion: v1
kind: Config
clusters:
- name: "test"
cluster:
server: "https://xxxxx"
api-version: v1
certificate-authority-data: "xxxxxx"
users:
- name: "user1"
user:
token: "xxxx"
contexts:
- name: "test"
context:
user: "user1"
cluster: "test"
current-context: "test"
可以在linux中采用下面命令將kubectl的yaml配置文件進行base64編碼。
base64 kube-config.yml > kube-config.txt
然后類似上一步,在jenkins憑據中增加配置文件內容。在憑據設置界面,類型選擇為“Secret text”,ID設置為“jenkins-k8s-config”(此處的ID必須與Jenkinsfile中的保持一致),Secret設置為上面經過base64編碼后的配置文件內容。

測試pipeline任務
在創建的pipeline任務中,點擊“立即構建”即可立即執行pipeline任務。

在jenkins中存在一個名為Blue Ocean的新界面,在新界面中也可以執行pipeline任務,而且新的界面中查看任務的執行結果更加清晰,所以執行結果日志建議在新界面中查看。點擊“Open Blue Ocean”菜單進入新界面。

在Blue Ocean新界面中,可以點擊“運行”執行pipeline任務。

在執行pipeline任務,執行“git describe --tags”命令出錯,這是由於上面示例的Jenkinsfile中要求必須有git的tag。在git中增加tag,並提交上傳至gitlab后即可解決。

在git中增加tag,並提交上傳至gitlab后重新執行pipeline任務,所有步驟都執行成功。

執行成功后,查看harbor鏡像倉庫,docker鏡像成功上傳至harbor。

執行成功后,查看k8s中pod運行日志,服務啟動成功。

設置gitlab自動觸發jenkins
前面的步驟中已經完成了手動執行jenkins執行pipeline任務完成構建部署任務,下面說明如何在代碼提交后讓gitlab自動觸發jenkins執行pipeline任務。
jenkins中安裝gitlab插件
要實現gitlab自動觸發jenkins任務,需要在jenkins中安裝gitlab插件。從jenkins的“系統管理”-“管理插件”中找到gitlab插件並下載安裝,重啟jenkins后生效。


在gitlab中創建訪問token
安裝的gitlab插件在配置時,需要gitlab的訪問token,先要在gitlab中創建訪問的token。點擊“用戶設置”-“Access Tokens”菜單,進入訪問token設置界面。然后輸入“Name”,並在“Scopes”中勾選“api”,點擊“Create ...”按鈕即可創建訪問token。創建成功后,一定要將生成的token保存下來,后面將無法再查看生成的token,如果未保存后面只能重新生成。


jenkins中配置gitlab插件
在jenkins中,進入“系統管理”-“系統設置”-“Gitlab”配置。

輸入“Connection name”、“Gitlab host URL”,在“Credentials”中點擊“Add”添加gitlab的授權token。

點擊添加后,會進入添加憑據界面。在添加界面,選擇類型為“GitLab API token”,API token設置為前面在gitlab中創建的token值。然后點擊“添加”按鈕創建憑據。

添加完gitlab api token,在Gitlab設置界面“Credentials”中選擇前面添加的token,然后點擊“Test Connection”測試是否成功。測試成功后保存。

配置pipeline任務,啟用觸發器
進入jenkins的任務設置界面,在“構建觸發器”中,勾上“Build when a change pushed to Gitlab.Gitlab webhook URL ...”(這里的webhook URL在后面配置gitlab時需要),根據自己的需要設置其它的選項。點擊“高級”按鈕,然后點擊“Generate”按鈕生成Secret token(這里的token后面配置gitlab時需要)。


在gitlab中配置webhook
在gitlab的項目設置中選擇“Integrations”,然后在URL和Secret token中填入上一步jenkins設置中的到的內容。由於本文中是在git上打了tag后才觸發jenkins執行任務,所以這里勾選“Tag push events”,然后去掉“Enable SSL verification”的勾選項,並點擊“Add webhook”按鈕添加。如果需要每次提交代碼都觸發則應該選“Push events”(注意:這里選擇Push events后,Jenkinsfile中也需要做相應的修改,去掉git的tag相關內容,否則執行時會出錯)。

webhook測試
添加完成后,在下面可以看到剛才添加的webhook,點擊“Test”按鈕在彈出的菜單中選擇“Tag push events”發送測試請求,發送成功后會顯示“Hook executed successfully”信息。


webhook發送成功后,到jenkins中可以看到正在執行觸發的任務。配置成功后,后面只要有git的tag提交到gitlab即可直接觸發jenkins執行pipline任務。

參考地址
作者:tinylk
鏈接:https://www.jianshu.com/p/2d89fd1b4403
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。