回到目錄
將練習jenkins使用pipeline項目,結合k8s發(fā)布一個簡單的springboot項目
前提:jenkins的環(huán)境和k8s環(huán)境都已經安裝完成,提前準備了gitlab和一個簡單的springboot項目
創(chuàng)建一個流水線項目
?流水線中選擇git,并選擇gitlab的test項目,拉取分支為main
?后端代碼整體結構如下
?jenkinsfile
在代碼根目錄下創(chuàng)建一個Jenkinsfile文件
需要注意的是environment中的value比如gitlab訪問憑證gitlab-root一定要和jenkins中配置的憑證名稱一致
pipeline {
//agent 選擇jenkins節(jié)點進行構建
//any表示任意
agent any
//環(huán)境變量
environment {
//gitlab訪問憑證
GIT_CREDENTIAL_ID = 'gitlab-root'
//gitlab地址
GIT_REPO_URL = '10.190.9.23:28080'
//gitlab分組
GIT_GROUP = 'devops'
//gitlab項目名稱
GIT_NAME = 'test'
//harbor憑證
HARBOR_ID = 'harbor-admin'
//harbor地址
HARBOR_URL = '30.14.181.51:8858'
//harbor項目
HARBOR_REPO = 'repo'
//發(fā)送delpoment.yml到k8s服務器上的地址
K8S_FILE_PATH = '/usr/local/k8s'
//gitlab發(fā)送到服務器的目錄
GITLAB_DEPLOYMENT_FILE = 'deploy'
}
parameters {
//git插件 分支參數
gitParameter(
branchFilter: '.*',
defaultValue: "${env.BRANCH_NAME ?: 'main'}",
name: 'BRANCH_NAME',
type: 'PT_BRANCH',
description: '請選擇要發(fā)布的分支'
)
//git插件 標簽參數
gitParameter(
branchFilter: '.*',
defaultValue: "${env.TAG_NAME ?: 'v:1.0.0'}",
name: 'TAG_NAME',
type: 'PT_TAG',
description: '請選擇要發(fā)布的標簽'
)
}
stages {
stage("基本信息輸出"){
steps{
echo '選定待發(fā)布信息'
echo "項目地址 ${GIT_REPO_URL}"
echo "項目組 ${GIT_GROUP}"
echo "項目名 ${GIT_NAME}"
echo "分支 ${BRANCH_NAME}"
echo "TAG ${TAG_NAME}"
}
}
stage('拉取gitlab代碼') {
steps {
//拉取gitlab代碼,選擇分支
checkout scmGit(
branches: [
[name: env.BRANCH_NAME]
],
extensions: [],
userRemoteConfigs: [
[
credentialsId: env.GIT_CREDENTIAL_ID,
url: "http://${env.GIT_REPO_URL}/${env.GIT_GROUP}/${env.GIT_NAME}.git"
]
]
)
echo '拉取gitlab代碼 --SUCCESS'
}
}
stage('Maven構建項目') {
steps {
//maven構建項目打包
//maven命令位置 /var/jenkins_home/apache-maven-3.9.3
sh "/var/jenkins_home/apache-maven-3.9.3/bin/mvn clean package -DskipTests"
echo 'Maven構建項目 --SUCCESS'
}
}
stage('通過docker制作鏡像') {
steps {
//docker制作鏡像
//將maven打包的jar移動到docker目錄下
//使用dockerfile進行構建鏡像,鏡像名稱為 項目名:標簽
sh """
mv target/*.jar docker/
docker build -t ${env.GIT_NAME}:${env.TAG_NAME} docker/
"""
echo '通過docker制作鏡像 --SUCCESS'
}
}
stage('推送鏡像到harbor') {
steps {
//使用harbor憑證推送鏡像
withCredentials([
usernamePassword(
credentialsId: env.HARBOR_ID,
passwordVariable: 'DOCKER_PASSWORD',
usernameVariable: 'DOCKER_USERNAME'
)
]) {
//打標簽為遠程倉庫標簽
//登陸到harbor
//推送鏡像
sh """
docker tag ${env.GIT_NAME}:${env.TAG_NAME} ${env.HARBOR_URL}/${env.HARBOR_REPO}/${env.GIT_NAME}:${env.TAG_NAME}
echo "\$DOCKER_PASSWORD" | docker login -u "\$DOCKER_USERNAME" -p "\$DOCKER_PASSWORD" ${env.HARBOR_URL}
docker push ${env.HARBOR_URL}/${env.HARBOR_REPO}/${env.GIT_NAME}:${env.TAG_NAME}
"""
}
echo '推送鏡像到harbor --SUCCESS'
}
}
stage('發(fā)送k8s部署yml文件至目標服務器') {
steps {
//使用ssh插件 發(fā)送deploy目錄下的部署yml文件到目標服務器
//須提前配置ssh免密登陸
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'k8s',
transfers: [
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: '',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: "${env.GITLAB_DEPLOYMENT_FILE}/*yml"
)
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false
)
]
)
echo '發(fā)送yml文件至目標服務器 --SUCCESS'
}
}
stage('遠程執(zhí)行k8s部署yaml命令') {
steps {
//替換發(fā)送過來的部署文件
//部署
sh """
ssh root@10.199.99.200 sed -i'' "s#REGISTRY#${env.HARBOR_URL}#" ${env.K8S_FILE_PATH}/${env.GITLAB_DEPLOYMENT_FILE}/deployment.yml
ssh root@10.199.99.200 sed -i'' "s#DOCKERHUB_NAMESPACE#${env.HARBOR_REPO}#" ${env.K8S_FILE_PATH}/${env.GITLAB_DEPLOYMENT_FILE}/deployment.yml
ssh root@10.199.99.200 sed -i'' "s#APP_NAME#${env.GIT_NAME}#" ${env.K8S_FILE_PATH}/${env.GITLAB_DEPLOYMENT_FILE}/deployment.yml
ssh root@10.199.99.200 sed -i'' "s#BUILD_NUMBER#${env.TAG_NAME}#" /${env.K8S_FILE_PATH}/${env.GITLAB_DEPLOYMENT_FILE}/deployment.yml
ssh root@10.199.99.200 kubectl apply -f ${env.K8S_FILE_PATH}/${env.GITLAB_DEPLOYMENT_FILE}/
"""
echo '遠程執(zhí)行k8s部署yaml命令 --SUCCESS'
}
}
}
}
deployment.yml
說明:
imagePullSecrets:
? ? ? ? - name: harbor-secret
因為將鏡像上傳到私人鏡像倉庫,所以k8s中拉取鏡像時從harbor中拉取,需要進行配置harbor的secret
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: mytest
component: devops
tier: backend
name: mytest
spec:
progressDeadlineSeconds: 600
replicas: 1
selector:
matchLabels:
app: mytest
component: devops
tier: backend
strategy:
rollingUpdate:
maxSurge: 100%
maxUnavailable: 100%
type: RollingUpdate
template:
metadata:
labels:
app: mytest
component: devops
tier: backend
spec:
imagePullSecrets:
- name: harbor-secret
containers:
- name: mytest
image: REGISTRY/DOCKERHUB_NAMESPACE/APP_NAME:BUILD_NUMBER
readinessProbe:
httpGet:
path: /test
port: 8080
timeoutSeconds: 10
failureThreshold: 30
periodSeconds: 5
imagePullPolicy: Always
ports:
- containerPort: 8080
protocol: TCP
resources:
limits:
cpu: 300m
memory: 600Mi
requests:
cpu: 100m
memory: 100Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
terminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
labels:
app: mytest
component: devops
name: mytest
spec:
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: mytest
component: devops
tier: backend
sessionAffinity: None
type: NodePort
dockerfile
用于構建docker鏡像
FROM eclipse-temurin:8-jre
LABEL org.opencontainers.image.authors="fooleryang@139.com"
COPY mytest.jar /usr/local/
WORKDIR /usr/local
CMD java -jar mytest.jar
發(fā)布
修改代碼后提交,版本修改為v6.0.0
?在gitlab中新加標簽v6.0.0
在jenkins中構建,選擇v6.0.0
??查看
?總結
目前使用了jenkins的pipeline項目,發(fā)布項目到k8s中文章來源:http://www.zghlxwxcb.cn/news/detail-626763.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-626763.html
到了這里,關于jenkins pipeline項目的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!