zoukankan      html  css  js  c++  java
  • Jenkinsfile里定义对象和函数,获取git提交人, 发送钉钉通知

    自从开始使用Jenkinsfile作为Jenkins配置后就一发不可收,因为开发者自定义CI脚本实在太方便了。

    比如,最近开发的以一个项目涉及多人,提交冲突挺多的,有的人自己没编译通过就提交了,导致后面的人被阻塞,所以我们需要告诉他: 提交失败了。

    首先,Jenkinsfile应该怎么用呢, 参见: https://www.cnblogs.com/woshimrf/p/gitlab-with-jenkins.html

    定义Jenkinsfile的时候想要钉钉通知,首先获取git提交人:

    最外层:
    
    class MyChange {
       String author;
       String msg;
    }
    @NonCPS
    def getChanges()
    {
        def changeLogSets = currentBuild.changeSets
        for (int i = 0; i < changeLogSets.size(); i++)
        {
            def entries = changeLogSets[0].items
            for (int j = 0; j < entries.length; j++)
            {
                def entry = entries[0]
                def change = new MyChange()
                change.author = entry.author
                change.msg = entry.msg
                return change
            }
        }
    
    }
    
    然后在node节点里定义变量
    
    ding_group_access_token = "c20d35654da77a99d8869e04xxxxxxxd1a81aasssa2"
    ding_jenkinsUrl = "http://jenkins.ryan.com/view/我的view名称/"
    
    最后在失败的时候通知:
    
    
    stage('Compile And UnitTest') {
        echo "2.Compile the code"
        try {
            sh "mvn clean install"
        } catch (Exception ex) {
            updateGitlabCommitStatus name: 'build', state: 'failed'
            def change = getChanges()
            dingTalk accessToken: "${ding_group_access_token}", imageUrl: '', jenkinsUrl: "${ding_jenkinsUrl}", message: "@所有人 构建失败@$change.author $change.msg" , notifyPeople: "$change.author"
            throw ex;
        } finally {
    
        }
    
        updateGitlabCommitStatus name: 'build', state: 'success'
    }
    

    最终Jenkinsfile可能是这个样子的

    文件位置
    my-project
    - .deploy
       - Jenkinsfile
    - src
    

    在jenkins里创建pipeline job, 并指定Jenkinsfile

    Jenkinsfile

    
    
    class MyChange {
       String author;
       String msg;
    }
    @NonCPS
    def getChanges()
    {
        def changeLogSets = currentBuild.changeSets
        for (int i = 0; i < changeLogSets.size(); i++)
        {
            def entries = changeLogSets[0].items
            for (int j = 0; j < entries.length; j++)
            {
                def entry = entries[0]
                def change = new MyChange()
                change.author = entry.author
                change.msg = entry.msg
                return change
            }
        }
    
    }
    
    node {
        properties([gitLabConnection('gitlab-bigdata')])
    
        stage('Prepare') {
            echo "1.Prepare Stage"
            checkout scm
            updateGitlabCommitStatus name: 'build', state: 'pending'
            mvn_module = '多模块项目mvn子模块'
            pom = readMavenPom file: "${mvn_module}/pom.xml"
            k8s_label = "项目在k8s集群中的名称"
            docker_host = "自己的docker私服"
            ding_group_access_token = "c20d35654da77a99d8869e041xxxac7d6699xxxxxx"
            ding_jenkinsUrl = "http://jenkins.ryan.com/view/job所在的view/"
            //要部署的k8s集群, 默认是杭州(config-hangzhou), 可选上海(config-shanghai)
            k8s_cluster_node = "config-hangzhou"
            //部署环境
            profile=""
            if(env.BRANCH_NAME == 'dev') {
                profile = "dev"
                k8s_cluster_node = "config-dev"
            }
            if(env.BRANCH_NAME == 'test') {
                profile = "test"
                k8s_cluster_node = "config-shanghai"
            }
            if(env.BRANCH_NAME == 'master') {
                profile = "prod"
                k8s_cluster_node = "config-hangzhou"
            }
    
            img_name = "${pom.groupId}-${pom.artifactId}"
            docker_img_name = "${docker_host}/${img_name}"
            echo "group: ${pom.groupId}, artifactId: ${pom.artifactId}, version: ${pom.version}"
            echo "docker-img-name: ${docker_img_name}"
            script {
                build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
                build_tag = "${env.BRANCH_NAME}-${build_tag}"
    
                currentBuild.displayName = BUILD_NUMBER + "_" +build_tag
            }
        }
    
        stage('Compile And UnitTest') {
            echo "2.Compile the code"
            try {
                sh "mvn clean install"
            } catch (Exception ex) {
                updateGitlabCommitStatus name: 'build', state: 'failed'
                def change = getChanges()
                dingTalk accessToken: "${ding_group_access_token}", imageUrl: '', jenkinsUrl: "${ding_jenkinsUrl}", message: "@所有人 构建失败@$change.author $change.msg" , notifyPeople: "$change.author"
                throw ex;
            } finally {
    
            }
    
            updateGitlabCommitStatus name: 'build', state: 'success'
        }
    
    
    
        if (env.BRANCH_NAME == 'dev' ||env.BRANCH_NAME == 'test' || env.BRANCH_NAME == 'master') {
            stage('Build Docker Image') {
                echo "4.Build Docker Image Stage"
                sh "docker build -t ${docker_img_name}:${build_tag} " +
                        " --build-arg JAR_FILE=target/${mvn_module}.jar " +
                        " --build-arg profile=${profile} " +
                        " -f ${mvn_module}/.deploy/Dockerfile ./${mvn_module}"
            }
    
            stage('Push Docker Image') {
                echo "5.Push Docker Image Stage"
                //sh "mvn deploy -Dmaven.test.skip=true"
                sh "docker tag ${docker_img_name}:${build_tag} ${docker_img_name}:latest"
                sh "docker tag ${docker_img_name}:${build_tag} ${docker_img_name}:${pom.version}"
                withCredentials([usernamePassword(credentialsId: 'docker-register-sz-shuwei', passwordVariable: 'dockerPassword', usernameVariable: 'dockerUser')]) {
                    sh "docker login -u ${dockerUser} -p ${dockerPassword} ${docker_host}"
                    sh "docker push ${docker_img_name}:latest"
                    sh "docker push ${docker_img_name}:${pom.version}"
                    sh "docker push ${docker_img_name}:${build_tag}"
                }
            }
    
    
            stage("Deploy to k8s - ${profile}") {
                echo "6. Deploy Stage"
    
                updateGitlabCommitStatus name: 'deploy', state: 'pending'
                sh "sed -i 's/<IMG_NAME>/${img_name}/g;s/<IMG_TAG>/${build_tag}/g;s/<k8s-label>/${k8s_label}/g' ${WORKSPACE}/${mvn_module}/.deploy/${profile}-k8s.yaml"
                sh "kubectl --kubeconfig /home/jenkins/.kube/${k8s_cluster_node} " +
                        "apply -f ${WORKSPACE}/${mvn_module}/.deploy/${profile}-k8s.yaml --record"
                sh "sleep 5"
                echo "创建的实例:"
                sh "kubectl --kubeconfig /home/jenkins/.kube/${k8s_cluster_node}  get po -o wide | grep ${k8s_label}"
                echo "您的应用svc: "
                sh "kubectl --kubeconfig /home/jenkins/.kube/${k8s_cluster_node}  get svc | grep ${k8s_label}"
    
                updateGitlabCommitStatus name: 'deploy', state: 'success'
            }
        }
    
    
    
    }
    
    
    
    
    
  • 相关阅读:
    ASP.NET中JSON的序列化和反序列化
    Git 本地项目上传至托管平台(OsChina/GitHub)
    Android Gradle 完整指南(转)
    开发错误记录13:java.lang.UnsatisfiedLinkError: Couldn't load xxx.so: findLibrary returned null
    Android其它新控件 (转)
    一个Activity掌握Design新控件 (转)
    一个Activity掌握Android5.0新控件 (转)
    一个Activity掌握Android4.0新控件 (转)
    开发错误日记 12: Unsupported major.minor version 52.0
    Linux 下各个目录的作用及内容
  • 原文地址:https://www.cnblogs.com/woshimrf/p/jenkinsfile-customize-notify-with-git-commit-author.html
Copyright © 2011-2022 走看看