jenkins动态节点添加配置和使用方式为docker in docker

jenkins动态节点添加配置和使用

  1. 安装docker模块
  2. 配置
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    mounts内容解释:
type=bind,source=/etc/jenkins/users.yaml,target=/etc/jenkins/users.yaml  #控制user权限
type=bind,source=/usr/bin/check.py,target=/usr/bin/check.py     #控制user权限脚本
type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock #docker in docker 
type=bind,source=/usr/bin/docker,target=/usr/bin/docker       #docker in docker 
type=bind,source=/usr/lib64/libltdl.so.7,target=/usr/lib/x86_64-linux-gnu/libltdl.so.7  #docker in docker 
type=bind,source=/data/jenkins_build_cache/.cache,target=/data/jenkins_build_cache/.cache  #容器node启动参数
type=bind,source=/data/lib/composer,target=/data/lib/composer         #容器node启动参数
type=bind,source=/home/jenkins/repo,target=/home/jenkins/repo         #dockerfile文件路径
type=bind,source=/root/.docker/config.json,target=/root/.docker/config.json #docker login 文件上传,下载
type=bind,source=/bin/kubectl,target=/bin/kubectl         #k8s操作命令
type=bind,source=/root/.kube/,target=/root/.kube/          #k8s config文件

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
pipline文件解释


#!/usr/bin/env groovy
import groovy.json.JsonOutput

String gitRepositryURL = 'https://gitlab.ssm/dtkgroup/dtk-chrome-plugin.git' #代码路径
String dockerRegistry = 'registry.bce.com'      #harbor仓库地址
String dockerRegistryURL = 'https://registry.bce.com'   #harbor url仓库地址
String dockerRegistryNameSpace = 'datae-test'          #harbor仓库名字

String kubeManifestsRepo = '/home/jenkins/repo/dtkst/app'  #dockerfile文件路径
Map dockerImages = [:]
boolean notify = false

String jobBaseName = env.JOB_NAME[4..-1]
String jobK8sName = jobBaseName.replaceAll('_', "-") 

Map commitInfo = [:]
Map buildInfo = [:]

commitInfo.projectName = gitRepositryURL.replaceFirst(/^.*\/([^\/]+?).git$/, '$1') 
commitInfo.gitRepositryURL = gitRepositryURL
buildInfo.buildId = currentBuild.id

@NonCPS
def newSh(String cmd) {
    
    
	def script = '#!/bin/sh +x\n' << cmd
	result = sh(returnStdout: true, script: script.toString())
	return result
}

pipeline {
    
    
		agent  
		{
    
    
	    node {
    
     
	      label 'dockercloud'          #指定jnlp节点
	    } 
	    }


	options {
    
                       #设置jenkins显示配置
		buildDiscarder logRotator(
			artifactDaysToKeepStr: '', 
			artifactNumToKeepStr: '', 
			daysToKeepStr: '10', 
			numToKeepStr: '10'
			)
	}

	parameters {
    
             #参数设置
        choice( 
        	name: 'PENV',
        	choices: [
        		'dev1',
        		'dev2',
        		'test1',
        		'test2', 
        		'test3', 
        		'test4',
        		'test5',
                        'test6',
                        'test7',
        		'huise',
'huise4',
                        'huise3'
        	], 
        	description: '选择发布环境,默认发布至dev1测试环境'
        	)

        gitParameter(         #分支获取
        	name: 'GIT_BRANCH', 
            type: 'PT_BRANCH_TAG',
            branchFilter: 'origin/(.*)',
            defaultValue: 'master',
            selectedValue: 'DEFAULT',
            sortMode: 'DESCENDING_SMART',
            quickFilterEnabled: true, 
            description: 'Select your branch or tag.'
        	)
        booleanParam(name: 'force', defaultValue: false, description: '代码重复强制发版')
    }

	stages {
    
    

		stage('预处理') {
    
    
			steps {
    
    
				script {
    
    
					def now = new Date()
					buildInfo.buildDate = now.format("yy-MM-dd HH:mm", TimeZone.getTimeZone('UTC'))

					def causes = currentBuild.getBuildCauses()
					buildInfo.buildUser = causes[0]['userName']
					userList = readYaml(file:'/etc/jenkins/users.yaml')
					if (!(PENV in userList.env.dev ) && !(buildInfo.buildUser in userList.user.allow)) {
    
    
						error(message: "开发只能发布环境到${userList.env.dev.join(',')}")			
					}
					if (PENV in userList.env.huise ) {
    
    
						ACTIVE = 'prod'
					}
					buildInfo.gitBranch = GIT_BRANCH
					buildInfo.publishEnv = PENV
					currentBuild.description = "k8s环境: ${PENV} 构建人:${buildInfo.buildUser} 分支: ${GIT_BRANCH}"
				// 	newSh("check.py -u ${buildInfo.buildUser} -e ${PENV}")
				}
			}
		}

		stage('同步代码仓库') {
    
    
			steps {
    
    
				script {
    
    
					def scmVars = checkout([
								$class: 'GitSCM', 
								branches: [[name: "${GIT_BRANCH}"]], 
								extensions: [[$class: 'CheckoutOption', timeout: 20], [$class: 'CloneOption', depth: 1]], 
								userRemoteConfigs: [[credentialsId: "541146d-3606-485-ab9c-2e44cd2880", url: "${gitRepositryURL}"]]
								])
					commitInfo.gitCommit = scmVars.GIT_COMMIT
					commitInfo.gitBranch = GIT_BRANCH
					commitInfo.xiangmu_name = env.JOB_BASE_NAME
					commitInfo.commitDate = newSh('git log --pretty=format:"%ci" -1')
					commitInfo.cmmitMessage = newSh('git log --pretty=format:"%s" -1')

					String gitDiff = newSh('git diff HEAD^ HEAD')
					def committer = [:]
					committer.name = newSh('git log --pretty=format:"%cn" -1')
					committer.email =  newSh('git log --pretty=format:"%ce" -1')
					commitInfo.committer = committer
					
					String consoleStdout = "\n\n---------SYNCHRONIZE GIT REPOSITORY---------\nGit repo sync successfully.\n\n" + JsonOutput.prettyPrint(JsonOutput.toJson(commitInfo))
					println(consoleStdout)

					consoleStdout = "\n\n---------CHANGE LOGS---------\nGit diff:\n\n" + gitDiff
					println(consoleStdout)
					getDatabaseConnection(type: 'GLOBAL') {
    
    
						def sqlString="select commit_seccec from jenkins_commit.jenkins_jilu where xm_name = ? and env = ?"
                        def params=[commitInfo.xiangmu_name,PENV]
                        def rest_null = sql sql:sqlString,parameters:params
						if (rest_null.size() == 0){
    
    
						  def sqlString2="insert  into  jenkins_commit.jenkins_jilu(xm_name,env,commit_seccec)   values(?,?,?)"
                          def params2=[commitInfo.xiangmu_name,PENV,commitInfo.gitCommit]
						  sql sql:sqlString2,parameters:params2
						  println("mysql插入数据")
						}
						if (rest_null.size() >= 1) {
    
    
							   def Map rest = rest_null.get(0)
							    if (rest.get("commit_seccec") == commitInfo.gitCommit && force == "false"){
    
    
                        currentBuild.description = "k8s环境: ${PENV} 构建人:${buildInfo.buildUser} 分支: ${GIT_BRANCH} 构建失败: 代码重复不发版"
							   println("代码没有变化不做发版")
                               error "上一个版本和现在正在发的版本一致,不做发版"
							   }
							 //  if (rest.get("commit_seccec") == commitInfo.gitCommit){
    
    
							 //  println("代码没有变化不做发版")
        //                       error "上一个版本和现在正在发的版本一致,不做发版"
							 //  }
						}
				
					}
				}
			}
		}

		stage('构建') {
    
    		
			agent {
    
    
          		docker {
    
     
              		image 'registrye.com/dt/node:14.19.3-alpine3.15'
                    args '--user root -v /data/jenkins_build_cache/.cache:${HOME}/.cache'
                    args '--user root -v /data/lib/composer:/root/.composer'
                    // reuseNode true
          		}	
      		}

        	steps {
    
    
            	script {
    
    
            		sh """
                    npm config set puppeteer_download_host=https://npm.taobao.org/mirrors
                    npm i --registry=https://registry.npm.taobao.org
                    npm run build:${ACTIVE}
                    """
					stash name: 'build-output', includes: '**'        #打包后的文件传给下一级使用
					
            // 		consoleStdout = "\n\n---------BUILD RESULTS---------\nBuild info generated successfully.\n\n" + JsonOutput.prettyPrint(JsonOutput.toJson(buildInfo))
            // 		println(consoleStdout)
        		}	
			}
		}
		

		stage('Docker') {
    
    
			steps {
    
    
				script {
    
    
				    unstash 'build-output'   #使用上级文件路径
				//	docker.withRegistry(dockerRegistryURL, '8f1a40fa-8-4717-f87299916d') {
    
    
					docker.withRegistry(dockerRegistryURL) {
    
    
						
						String dockerFile = kubeManifestsRepo + '/' + jobBaseName + '/' + 'Dockerfile.test'
						    
						if (!fileExists(dockerFile)) {
    
    
							dockerFile = kubeManifestsRepo + '/' + jobK8sName + '/' + 'Dockerfile.test'
						}

						String dockerRepository = dockerRegistry + '/' + dockerRegistryNameSpace + '/' + jobK8sName
						def customImage = docker.build(dockerRepository, "-f ${dockerFile} .")
							customImage.push(commitInfo.gitCommit)
							customImage.push('latest')

						dockerImages.nginx = dockerRepository + ':' + commitInfo.gitCommit

					}
				}
			}
		}

		stage('部署') {
    
    
			steps {
    
    
				script {
    
    
					dockerImages.each {
    
     k, v -> 
						newSh("kubectl -n ${PENV} set image deployment/${jobK8sName} ${k}=${v}")
						newSh("kubectl -n ${PENV} rollout status deployment/${jobK8sName} --timeout=2m")
					}
					String content = "![screenshot](https://comquent.de/wp-content/uploads/CQ-Pipeline-Kurs.png)\n\n### Jenkins Pipeline\n>**构建信息**:\n>- 构建项目: ${jobBaseName}\n>- 构建id: ${currentBuild.number}\n>- 构建人: ${buildInfo.buildUser}\n>- 构建分支: ${GIT_BRANCH}\n>- 发布环境: ${PENV}\n>**版本信息**:\n>- commit_hash: ${commitInfo.gitCommit}\n>- commit_date: ${commitInfo.commitDate}\n>- commit_message: ${commitInfo.cmmitMessage}\n>- committer: ${commitInfo.committer.name}"	
					def workflowMessage = [
						"msgtype": "actionCard",
						"actionCard":[
							"title":"构建信息",
							"text":content,
							"btnOrientation": "0",
							"btns": [
								[
									"title": "详细信息",
									"actionURL": "https://k8sje.qu.com/blue/organizations/jenkins/pp_api/detail/k8s_o_app_api/${currentBuild.number}/pipeline"
								],
								[
									"title": "日志监控",
									"actionURL": "http://k8skna.ojequ.com/app/kibana#/discover?_g=()&_a=(columns:!(_source),index:'18d519283c86fa1d0',interval:auto,query:(language:kuery,query:''),sort:!(!('@timestamp',desc)))"
								],
							]
						]
					]	

					String workflowMessageJSON = JsonOutput.toJson(workflowMessage)
					timeout(unit: 'SECONDS', time: 30) {
    
    
						newSh("curl 'https://oapi.dingtalk.com/robot/send?access_token=9e88df7a79749c' -s -H 'Content-Type: application/json' -d '${workflowMessageJSON}'")
					}
				}
			}
		}
		stage("commit入库"){
    
    
             steps {
    
    
                  script{
    
    
                        getDatabaseConnection(type: 'GLOBAL') {
    
    
				        def sqlString3="update jenkins_commit.jenkins_jilu set commit_seccec=?    where xm_name=? and env=?;"
                        def params3=[commitInfo.gitCommit,commitInfo.xiangmu_name,PENV]
                        sql sql:sqlString3,parameters:params3
				  }
				  }
			 }
		}
	}
}



在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43606975/article/details/129736556