Jenkins-提交流水线[手动触发|自动触发|提交优化]

root
233
文章
0
评论
2021年10月6日18:53:07 评论 4306字阅读14分21秒

Jenkins-提交流水线[手动触发|自动触发|提交优化]

  • 下载代码
  • 构建
  • 单元测试
  • 扫描
  • 通知

1.配置参数

仓库url地址

分支选择

 

2.编写流水线

流水线 语法设置添加仓库语法

checkout([$class: 'GitSCM', 
           branches: [[name: '*/master']], 
                                     extensions: [], 
              userRemoteConfigs: [[credentialsId: 'gitlab-root', 
                                url: 'http://192.168.1.110:9080/gitops/gitops-demo-service.git']]])

 

1.触发器配置

参考文章:Jenkins-[配置作业触发器|解析GET/HEADER/POST请求数据]

目的: 开启trigger后,就可以实现其他系统通过一个指定的URL进行自动触发构建了;

新建一个文件夹存放对应GitLab仓库组中的流水线。这里建议用仓库组的名称作为文件夹的名称devops03;

用Gitlab项目名称与流水线命名; devops03-demo-service项目;

(Jenkins流水线截图)

  • 开启Generic webhook;
  • 配置触发Token,例如:作业名称devops03-demo-service (这个token是流水线触发需要传递的);
  • 生成的触发URL;

Jenkins-提交流水线[手动触发|自动触发|提交优化]

http://192.168.1.200:8080/generic-webhook-trigger/invoke?token=devops03-demo-service

(此时,已经生成了触发URL,接着可以使用Curl或者Postman进行触发测试了!)

2.配置GitLab WebHook[自动远程 触发流水线]

进入GitLab项目设置, 进入 webhook配置页面;

  • 配置要触发的URL,即Jenkins触发器接口URL;
  • 选择发生哪种GitLab事件后触发此Webhook;例如:Push提交代码、Tag创建标签等等;
  • 项目里找
  • 要是报Url is blocked: Requests to the local network are not allowed,解决办法  参考文章https://blog.csdn.net/anqixiang/article/details/104968469

事件:

  • Push 提交事件
  • Tag Push 创建事件
  • MergeRequest 合并事件
  • Issue 问题创建更新事件
  • 测试模拟触发

模拟事件触发,点击test按钮选择push事件,此时去看下Jenkins是否成功被触发。

触发成功则提示Hook executed successfully: HTTP 200, 此时可以看下Jenkins是否已经触发了一次构建

如果出现此FAQ:Url is blocked: Requests to the local network are not allowed

解决方法:进入admin管理页面设置 > network

找到"Outbound requests"勾选允许请求webhooks和服务。(更改后,重启触发即可)

3.Webhook问题排查调试

进入webhook添加页面的最下方,点击你所创建的webhook的 Edit按钮 ;

webhook历史记录: 此记录可以判断,当前动作提交是否产生了webhook。

点击 View details 可以看到此webhook发送给对端Jenkins的数据信息,和请求状态。

  • 200: 表示触发Jenkins请求成功;
  • Resend Request: 重新发送请求;(此处便于排查调试错误)
  • RequestBody: GitLab传递给Jenkins的数据信息;

假如请求由于xxx原因导致没有触发jenkins构建, 可以在这里点击 Resend Request 按钮进行重新发送请求,而不是再次提交代码。

如果Jenkins触发成功了之后,我们可以在Jenkins的构建日志中查看效果。 这些数据就是gitlab post传递过来的。

到此:你基本上已经知道了Gitlab如何触发Jenkins的了。(多看几遍,多练习几遍)

仓库发生变化自动触发

//gitlab传递的数据{}
println("${webhookdata}")

//数据格式化
webhookdata = readJSON text: "${webhookdata}"

//提取仓库信息
env.srcUrl= webhookdata["project"]["git_http_url"]   //项目地址
env.branchName= webhookdata["ref"]-"refs/heads/"      // 分支
env.commitId= webhookdata["checkout_sha"]            //提交id
env.commitUser= webhookdata["user_username"]         // 提交人
env.commitEmail= webhookdata["user_email"]             // 邮箱

currentBuild.description = "Trigger by Gitlab \n branch: ${env.branchName} \n user: ${env.commitUser} "
currentBuild.displayName = "${env.commitId}"

pipeline{
    //指定运行此流水线的节点,指定标签的名字
    agent { node { label "build"}}
    stages{
        //阶段1 获取代码
        stage("CheckOut"){
            //定义阶段1的变量
            environment {
                NAME = "hwf01"
                VERSION = "1.1.11"
                ENVTYPE = "DEV1"
            }
            steps{
                script{
                    //branchName = "${params.branchName}"
                    //srcUrl = "${params.srcUrl}"
                    checkout([$class: 'GitSCM', branches: [[name: "${env.branchName}"]],
                              extensions: [],
                              userRemoteConfigs: [[credentialsId: 'gitlab-root',
                                                   url: "${env.srcUrl}"]]])
                }
            }
        }
        stage("Build") {
            //input加到这里就是选择是否运行
            input {
                message '选择部署的环境'
                ok '提交'
                submitter 'hwf'
                parameters {
                    choice choices: ["${env.srcUrl}"], name: "${env.branchName}"
                }
            }
            steps {
                script {
                    println("运行构建")
                    //要是想获取input的值,打印他的环境变量
                }
            }
        }
        stage("Test"){
            steps{
                script {
                    println("运行测试")

                }
            }
        }

    }
    post {
        always{
            script{
                println("流水线结束后,经常做的事情")
                sh "rm -rf ${env.nworkspace} "
            }
        }

        success{
            script{
                println("流水线成功后,要做的事情")
            }

        }
        failure{
            script{
                println("流水线失败后,要做的事情")
            }
        }

        aborted{
            script{
                println("流水线取消后,要做的事情")
            }

        }
    }
}

 

4.提交流水线优化

过滤新建分支和tag的触发

你可能发现问题了,新建一个分支或者标签也会出现构建,这个构建是没有意义的。我们需要排除掉。没错,jenkins 的 Generic webHook 也是支持的。

参考官方的说明:https://github.com/jenkinsci/generic-webhook-trigger-plugin/blob/master/src/test/resources/org/jenkinsci/plugins/gwt/bdd/gitlab/gitlab-push-ignore-create-remove-branch.feature

新建分支触发流水线,gitlab上传递 的流水线 参数  会多一个before全0,after为全0就是,合并分支请求

添加三个变量,获取当前的提交信息 $object_kind $before $after

此步骤一定要注意下参数名和值后面的空格,要去掉

通过正则表达式配置触发条件:Expression ^push\s(?!0{40}).{40}\s(?!0{40}).{40}$ Text $object_kind $before $after。 push请求只有after和before的值都不是40个0的时候触发构建(为40个0的情况是删除分支或者新建分支)

新建tag的时候触发 流水线需要勾选参数 

 

如何支持多个分支触发构建?

创建多个gitlab webhook, 设置不同的分支,最终指向同一个jenkins 作业;

gitlab通过webhook限制自动触发的分支

其他集成

代码下载部分

找一个pipeline 类型的项目进入流水线语法, 找到片段生成器中的 checkout 。 我们使用checkout方法来进行代码下载(svn也是支持的哦)

我们的代码库是私有类型的,需要一个具有clone 代码权限的用户账号来下载代码。(测试场景你可以将gitlab admin用户的账号存储在Jenkins的凭据中用于后期代码下载, 线上环境最好创建一个单独的reporter角色的用户进行代码下载,机器人账号。)

然后我们来生成代码片段吧,

  • 1 填写项目仓库地址
  • 2 指定访问项目仓库的账号
  • 3 指定要下载的代码库分支
  • 4 点击生成代码

一个基本的下载代码的demo示例:

pipeline {
    agent { label "build" }

    stages{
        stage("CheckOut"){
            steps{
                script {
                    //仓库信息
                    branchName = "${params.branchName}"
                    srcUrl = "${params.srcUrl}"

                    //下载代码
                    checkout([$class: 'GitSCM', 
                            branches: [[name: branchName]], 
                            extensions: [], 
                            userRemoteConfigs: [[
                                credentialsId: '7eaa6c7f-f954-4a65-bcd7-15f27edb680b', 
                                url: srcUrl]]])

                    //验证
                    sh "ls -l "
                }
            }
        }

        // 代码构建
        stage("Build"){
            steps{
                script{
                    echo "build"
                }
            }
        }

        //单元测试
        stage("UnitTest"){
            steps{
                script{
                    echo "unit test"
                }
            }
        }
    }
}

 

继续阅读
weinxin
我的微信
这是我的微信扫一扫
  • 文本由 发表于 2021年10月6日18:53:07
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
jenkins-邮件通知|gitlab配置邮箱 Jenkins

jenkins-邮件通知|gitlab配置邮箱

jenkins-邮件通知|gitlab配置邮箱 gitlab-配置邮箱地址 默认情况可能每个Gitlab用户没有配置邮箱的, 需要Gitlab用户要配置好邮箱。 点击头像进入 edit profile...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: