從0開始構(gòu)建一條完成的CI CD流水線
tools { maven 'apache-maven-3.8.6' }
docker pull jenkins/agent:latest
wget https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
- central:中央倉(cāng)庫(kù),是由Maven社區(qū)提供的資源倉(cāng)庫(kù),它包含了大量的常用程序庫(kù)組件(jar包)。默認(rèn)Maven的中央倉(cāng)庫(kù)地址為:http://repo1.maven.org/maven2/
- local:本地倉(cāng)庫(kù),是存放maven環(huán)境本地的一個(gè)文件夾,此文件夾在第一次運(yùn)行Maven命令時(shí)就創(chuàng)建了。Maven在執(zhí)行構(gòu)建任務(wù)時(shí),根據(jù)依賴關(guān)系從中心倉(cāng)庫(kù)、或遠(yuǎn)程倉(cāng)庫(kù)下載依賴組件到本地倉(cāng)庫(kù),然后本地倉(cāng)庫(kù)的內(nèi)容供項(xiàng)目引用。
- remote:遠(yuǎn)程倉(cāng)庫(kù),例如項(xiàng)目需要指定外部其他公司、或開源組織的jar包,這些依賴組件通用性等原因,未納入Maven中央倉(cāng)庫(kù),這個(gè)時(shí)候就要手動(dòng)指定一個(gè)私有的遠(yuǎn)程倉(cāng)庫(kù)來(lái)拉取依賴。

<mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
<repositories> <repository> <id>springsource-repos</id> <name>SpringSource Repository</name> <url>http://repo.spring.io/release/</url> </repository> </repositories>

mvn clean install -Dmaven.repo.local=/home/maven/local_repo/
mvn clean install -s /home/maven/settings.xml
[root@node01 agent-jenkins]# ls apache-maven-3.8.6.tar.gz Dockerfile jenkins-agent kubectl.tar.gz
[root@node01 agent-jenkins]# cat Dockerfile FROM jenkins/agent:latest USER root ADD apache-maven-3.8.6.tar.gz /opt/ ADD kubectl.tar.gz /usr/local/bin/ ENV PATH $PATH:/opt/apache-maven-3.8.6/bin/ COPY jenkins-agent /usr/local/bin/ CMD ["/bin/sh","-c","/usr/local/bin/jenkins-agent"]
# docker build -t registry.example.com:5000/jenkins/agent:v1 . # docker push registry.example.com:5000/jenkins/agent:v1
apiVersion: "v1"
kind: "Pod"
metadata:
name: jenkins-agent
namespace: "default"
spec:
containers:
- env:
- name: "MAVEN_HOME"
value: "/opt/apache-maven-3.8.6/"
image: "registry.example.com:5000/jenkins/agent:v1"
imagePullPolicy: "IfNotPresent"
name: "jnlp"
resources:
limits:
memory: "2G"
cpu: "1500m"
requests:
memory: "1G"
cpu: "100m"
volumeMounts:
- mountPath: "/root/.m2"
name: "m2"
readOnly: false
- mountPath: "/home/jenkins/agent"
name: "workspace-volume"
readOnly: false
- mountPath: "/usr/bin/docker"
name: "docker-client"
readOnly: true
- mountPath: "/var/run/docker.sock"
name: "docker-engine"
readOnly: true
volumes:
- hostPath:
path: "/root/.m2"
type: "DirectoryOrCreate"
name: "m2"
- hostPath:
path: "/home/jenkins"
name: "workspace-volume"
- hostPath:
path: "/usr/bin/docker"
type: File
name: "docker-client"
- hostPath:
path: "/var/run/docker.sock"
type: Socket
name: "docker-engine"
- m2:這個(gè)是用作maven的本地倉(cāng)庫(kù)路徑,使用hostpath掛載到了本地目錄,當(dāng)然也可以存儲(chǔ)到某些共享存儲(chǔ)中,目的就是讓依賴包只下載一次。
- workspace-volume:這個(gè)是將jenkins的工作目錄也使用hostpath掛載。
- docker-client:docker命令的掛載,用于build、push等命令
- docker-engine:docker engine的掛載,用于build、push等



- Git
- Git Parameter
- DingTalk
- build user vars plugin
pipeline { agent { kubernetes { cloud 'kubernetes-internal' //指定cloud name inheritFrom 'jenkins-agent' //指定podTemplate,新版本已經(jīng)不再用label指定 namespace 'default' } } environment { GIT_CERT = credentials('vfan-gitlab') //gitlab用戶憑證 HARBOR_HOST = 'registry.example.com:5000' SERVER_NAME = 'simple-java-maven-app' } /* tools { maven 'apache-maven-3.8.6' 鏡像有maven環(huán)境了,可以不指定 } */ options { buildDiscarder(logRotator(numToKeepStr: '10')) //保持歷史構(gòu)建的最大個(gè)數(shù) timeout(20) //默認(rèn)單位分鐘,20分鐘 timestamps() //Pipeline開始時(shí)間以及每個(gè)step執(zhí)行開始時(shí)間 } parameters { choice( name: 'GIT_REPO_URL', choices: 'http://10.85.122.128:880/vfan/simple-java-maven-app.git', description: 'Git Repo example environment' ) choice( name: 'GIT_TYPE', choices: ['branch', 'tag'], description: 'Git Repo example brance' ) choice( name: 'GIT_REPO_BRANCE', choices: ['master', 'dev', 'test'], description: 'Git Repo example brance' ) gitParameter name: 'GIT_TAG', type: 'PT_TAG', branch: 'master', branchFilter: '.*', defaultValue: '', selectedValue: 'TOP', sortMode: 'DESCENDING_SMART', listSize: '1', description: 'Select you git tag.' choice( name: 'ENVIRONMENT', choices: ['INT', 'DEV', 'PROD'], description: 'Select deployment environment' ) } stages { stage('git clone branch') { when { expression { params.GIT_TYPE == "branch" } } steps { git( branch: params.GIT_REPO_BRANCE, credentialsId: env.GIT_CERT, url: params.GIT_REPO_URL ) } post { success { sh ''' echo "use branch build" git status ''' } } } stage('git clone tag') { when { expression { params.GIT_TYPE == "tag" } } steps { checkout([$class: 'GitSCM', branches: [[name: "${GIT_TAG}"]], userRemoteConfigs: [[credentialsId: env.GIT_CERT, url: params.GIT_REPO_URL]]]) } post { success { sh ''' echo "use tag build" git status ''' } } } stage('Maven Build') { steps { sh 'mvn -B -DskipTests clean package' } } stage('Test') { steps { sh 'mvn test' } post { always { junit 'target/surefire-reports/*.xml' } } } stage('Deliver') { steps { sh './jenkins/scripts/deliver.sh' } } stage('Docker build && push') { steps { withCredentials([usernamePassword(credentialsId: 'harbor-auth', passwordVariable: 'HARBOR_PASSWD', usernameVariable: 'HARBOR_USER')]) { sh ''' echo "Other operations..." echo "Start building..." date -d "+8 hour" +%Y%m%d_%H%M%S > /tmp/date BUILD_TIME=`cat /tmp/date` docker build --build-arg APP_NAME=simple-java-maven-app -t ${HARBOR_HOST}/${SERVER_NAME}:${GIT_REPO_BRANCE}_${BUILD_TIME} . echo "Build complete." docker login $HARBOR_HOST -u $HARBOR_USER -p $HARBOR_PASSWD docker push ${HARBOR_HOST}/${SERVER_NAME}:${GIT_REPO_BRANCE}_${BUILD_TIME} docker rmi ${HARBOR_HOST}/${SERVER_NAME}:${GIT_REPO_BRANCE}_${BUILD_TIME} ''' } } } stage('Deploy to k8s'){ input{ message "Should we continue deploy?" ok "Yes, we should." } environment { // 提前創(chuàng)建好secret file類型的憑據(jù) KUBE_CONFIG_INT = credentials('mycluster_int') // KUBE_CONFIG_DEV = credentials('mycluster_dev') // KUBE_CONFIG_PROD = credentials('mycluster_prod') } steps{ sh''' BUILD_TIME=`cat /tmp/date` case $ENVIRONMENT in "INT") kubectl set image deployment ${SERVER_NAME} --kubeconfig=${KUBE_CONFIG_INT} app=${HARBOR_HOST}/${SERVER_NAME}:${GIT_REPO_BRANCE}_${BUILD_TIME} kubectl rollout status deployment ${SERVER_NAME} --kubeconfig=${KUBE_CONFIG_INT} ;; "DEV") kubectl set image deployment ${SERVER_NAME} --kubeconfig=${KUBE_CONFIG_DEV} app=${HARBOR_HOST}/${SERVER_NAME}:${GIT_REPO_BRANCE}_${BUILD_TIME} kubectl rollout status deployment ${SERVER_NAME} --kubeconfig=${KUBE_CONFIG_DEV} ;; esac echo "Deployment complete." ''' } } } post { success{ echo 'Deployment succeeded.' dingtalk ( robot: 'myapp-dingding-robot', type: 'MARKDOWN', // 發(fā)什么類型的消息,有TEXT、LINK、MARKDOWN、和ACTION_CARD,參考https://jenkinsci.github.io/dingtalk-plugin/guide/pipeline.html at: [], atAll: false, title: 'Jenkins發(fā)版成功', text: [ "## 構(gòu)建結(jié)果:**${currentBuild.result}**", '---', "## 構(gòu)建信息", '---', "- 項(xiàng)目名稱:${SERVER_NAME}", "- 構(gòu)建環(huán)境:${ENVIRONMENT}", "- 構(gòu)建分支:${GIT_REPO_BRANCE}", "- 構(gòu)建標(biāo)簽:${GIT_TAG}", "- 項(xiàng)目地址:${GIT_REPO_URL}", "- 構(gòu)建用戶:${env.BUILD_USER}" ], // messageUrl: '', // picUrl: '', // singleTitle: '', // btns: [], // btnLayout: '', // hideAvatar: false ) } failure{ echo "Deployment failed." dingtalk ( robot: 'myapp-dingding-robot', type: 'MARKDOWN', // 發(fā)什么類型的消息,有TEXT、LINK、MARKDOWN、和ACTION_CARD,參考https://jenkinsci.github.io/dingtalk-plugin/guide/pipeline.html at: [], atAll: false, title: 'Jenkins發(fā)版失敗', text: [ "## 構(gòu)建結(jié)果:**${currentBuild.result}**", '---', "## 構(gòu)建信息", '---', "- 項(xiàng)目名稱:${SERVER_NAME}", "- 構(gòu)建環(huán)境:${ENVIRONMENT}", "- 構(gòu)建分支:${GIT_REPO_BRANCE}", "- 構(gòu)建標(biāo)簽:${GIT_TAG}", "- 項(xiàng)目地址:${GIT_REPO_URL}", "- 構(gòu)建用戶:${env.BUILD_USER}" ], // messageUrl: '', // picUrl: '', // singleTitle: '', // btns: [], // btnLayout: '', // hideAvatar: false ) } } }
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-419448.html

文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-419448.html
到了這里,關(guān)于devops-5:從0開始構(gòu)建一條完成的CI CD流水線的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!