为了避免权限上的报错先设置权限
gitlab创建app
jenkins设置
这时候也可以在 gitlab 上注册账户直接登入到 jenkins
准备代码在github中下载地址: https:/github.com/zeyangli/simple-java-maven-app.git
jenkinsfile
#!groovy
@Library('jenkinslib@master') _
//func from sharelibrary
def build = new org.devops.build()
def deploy = new org.devops.deploy()
def tools = new org.devops.tools() //引用共享库设置的函数
//env
String buildType = "${env.buildType}"
String buildShell = "${env.buildShell}"
String deployHosts = "${env.deployHosts}"
//String deployHosts = "server1.server2"
String srcUrl = "${env.srcUrl}" //设置变量
String branchName = "${branchName}"
//pipeline
pipeline {
agent { node { label "master"}}
stages{
stage("CheckOut"){
steps{
script{
//使用引入的字体修改
tools.PrintMes("获取代码","green")
//用jenkins 流水线语法生成
checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], extensions: [], userRemoteConfigs: [[credentialsId: '9f0c031f-924e-4a84-a9ea-4957d27a9d54', url: "${srcUrl}"]]])
}
}
}
stage("Build"){
steps{
script{
tools.PrintMes("执行打包","green")
build.Build(buildType,buildShell)
deploy.AnsibleDeploy("${deployHosts}","-m ping")
}
}
}
}
}
gitlab 进行 webhook设置
Hook executed successfully: HTTP 200
目的:通过Jenkins 参数、shell、git实现单job自动切换不同的分支
#!groovy
@Library('jenkinslib@master') _
//func from sharelibrary
def build = new org.devops.build()
def deploy = new org.devops.deploy()
def tools = new org.devops.tools()
def runOpts
//env
String buildType = "${env.buildType}"
String buildShell = "${env.buildShell}"
String deployHosts = "${env.deployHosts}"
//String deployHosts = "server1.server2"
String srcUrl = "${env.srcUrl}"
String branchName = "${branchName}"
//pipeline
pipeline {
agent { node { label "master"}}
stages{
stage("CheckOut"){
steps{
script{
//判断如果获取到gitpush的信息,重新定义分支名
if ("${runOpts}" == "GitlabPush"){
branchName = branch - "refs/heads/"
}
println("${branchName}")
tools.PrintMes("获取代码","green")
checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], extensions: [], userRemoteConfigs: [[credentialsId: '9f0c031f-924e-4a84-a9ea-4957d27a9d54', url: "${srcUrl}"]]])
}
}
}
}
}
这样设置,就可以实现不同分支提交代码,jenkins获取到gitlab推送的json信息,打印对应的分支代码
流水线添加描述 流水线语法—全局变量参考—currentBuild—description
jenkins设置
变量名称: currentBuild.description
jenkinsfile
在pipeline外增加 currentBuild.description 描述信息
if ("${runOpts}" == "GitlabPush"){
branchName = branch - "refs/heads/"
println("${branchName}")
//
currentBuild.description = "构建用户:${userName} 分支:${branchName}"
}
//pipeline
官方文档地址: https://docs.gitlab.com/ee/api/commits.html
curl --request POST --header "PRIVATE-TOKEN: " "https://gitlab.example.com/api/v4/projects/17/statuses/18f3e63d05582537db6d183d9d557be09e1f90c8?state=success"
# 编辑:更改提交状态,然后HTTP发送请求
# 解释:在gitlab上创建了一个token,然后存在jenkins中,把凭据的数值赋值给这个变量,最后请求的时候加到head里面!
引用共享仓库(gitlab.groovy)
package org.devops
//(1)封装HTTP请求
def HttpReq(reqType,reqUrl,reqBody){
//1) Gitlab Api地址
def gitServer = "http://121.40.207.133:8010/api/v4"
//2) gitlab上创建一个凭据,存在给jenkins上,凭据名字(gitlab-token),赋值给gitlabToken变量
withCredentials([string(credentialsId: 'gitlab-token', variable: 'gitlabToken')]) {
// 发送HTTP请求-->请求类型、等等信息-->请求的时候加到Header里面
result = httpRequest customHeaders: [[maskValue: true, name: 'PRIVATE-TOKEN', value: "${gitlabToken}"]],
httpMode: reqType,
contentType: "APPLICATION_JSON",
consoleLogResponseBody: true,
ignoreSslErrors: true,
requestBody: reqBody,
url: "${gitServer}/${reqUrl}"
//quiet: true
}
return result
}
//(2)更改提交状态-->利用HTTP的请求
def ChangeCommitStatus(projectId,commitSha,status){
//参照:curl --request POST --header "PRIVATE-TOKEN: "
//"https://gitlab.example.com/api/v4/projects/17/statuses/18f3e63d05582537db6d183d9d557be09e1f90c8?state=success"
//1) 定义CommitApi
commitApi = "projects/${projectId}/statuses/${commitSha}?state=${status}"
//2) 发送HTTP的POST请求
//response = HttpReq("POST",commitApi,'').content
response = HttpReq("POST",commitApi,'')
println("${response}")
}
Jenkinsfile
#!groovy
@Library('jenkinslib@master') _
//func from sharelibrary
def build = new org.devops.build()
def deploy = new org.devops.deploy()
def tools = new org.devops.tools()
def gitlab = new org.devops.gitlab()
//env
String buildType = "${env.buildType}"
String buildShell = "${env.buildShell}"
String deployHosts = "${env.deployHosts}"
String srcUrl = "${env.srcUrl}"
String branchName = "${branchName}"
if ("${runOpts}" == "GitlabPush"){
branchName = branch - "refs/heads/"
println("${branchName}")
currentBuild.description = "构建用户:${userName} 分支:${branchName}"
//函数格式为ChangeCommitStatus(projectId,commitSha.status)
gitlab.ChangeCommitStatus(projectId,commitSha,"running")
}
//pipeline
pipeline {
agent { node { label "master"}}
stages{
stage("CheckOut"){
steps{
script{
tools.PrintMes("获取代码","green")
checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], extensions: [], userRemoteConfigs: [[credentialsId: '9f0c031f-924e-4a84-a9ea-4957d27a9d54', url: "${srcUrl}"]]])
}
}
}
stage("Build"){
steps{
script{
tools.PrintMes("执行打包","green")
build.Build(buildType,buildShell)
deploy.AnsibleDeploy("${deployHosts}","-m ping")
}
}
}
}
post {
always {
script{
println("always")
}
}
aborted {
script{
println("aborted")
gitlab.ChangeCommitStatus(projectId,commitSha,"canceled")
}
}
success {
script{
println("success")
gitlab.ChangeCommitStatus(projectId,commitSha,"success")
}
}
failure {
script{
println("failure")
gitlab.ChangeCommitStatus(projectId,commitSha,"failure")
}
}
}
}
Contributing variables:
branch = refs/heads/master
commitSha = a8797285168116c5954275e6264c1bfc1966f595
projectId = 7
runOpts = GitlabPush
runOpts_0 = GitlabPush
userName = bianmc
...
目的:gitlab创建支线后会自动进行push,随即触发了jenkins构建,通过gitlab请求变量过滤这个操作
Generic Webhook Trigger 触发构建插件代码中有过滤的正则
根据给定的过滤器配置为文本和过滤器配置为表达式来配置jenkins
Given the following generic variables are configured:
| variable | expression | expressionType | defaultValue | regexpFilter |
| object_kind | $.object_kind | JSONPath | | |
| before | $.before | JSONPath | | |
| after | $.after | JSONPath | | |
| ref | $.ref | JSONPath | | |
| git_ssh_url | $.repository.git_ssh_url | JSONPath | | |
Given filter is configured with text: $object_kind $before $after
Given filter is configured with expression: ^push\s(?!0{40}).{40}\s(?!0{40}).{40}$
gitlab设置
创建邮件共享库 toemail.groovy
package org.devops
//定义邮件内容
def Email(status,emailUser){
emailext body: """
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
<img src="http://****:28080/static/45c24286/images/headshot.jpeg">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
<td><br />
<b><font color="#0B610B">构建信息</font></b>
</td>
</tr>
<tr>
<td>
<ul>
<li>项目名称:${JOB_NAME}</li>
<li>构建编号:${BUILD_ID}</li>
<li>构建状态: ${status} </li>
<li>项目地址:<a href="${BUILD_URL}">${BUILD_URL}</a></li>
<li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
</ul>
</td>
</tr>
<tr>
</table>
</body>
</html> """,
subject: "Jenkins-${JOB_NAME}项目构建信息 ",
to: emailUser
}
jenkinsfile
#!groovy
@Library('jenkinslib@master') _
//func from sharelibrary
def build = new org.devops.build()
def deploy = new org.devops.deploy()
def tools = new org.devops.tools()
def gitlab = new org.devops.gitlab()
def toemail = new org.devops.toemail()
//env
String buildType = "${env.buildType}"
String buildShell = "${env.buildShell}"
String deployHosts = "${env.deployHosts}"
//String deployHosts = "server1.server2"
String srcUrl = "${env.srcUrl}"
String branchName = "${branchName}"
if ("${runOpts}" == "GitlabPush"){
branchName = branch - "refs/heads/"
println("${branchName}")
currentBuild.description = "构建用户:${userName} 分支:${branchName}"
//函数格式为ChangeCommitStatus(projectId,commitSha.status)
gitlab.ChangeCommitStatus(projectId,commitSha,"running")
env.runOpts = "GitlabPush"
} else {
userEmail = "[email protected]"
}
//pipeline
pipeline {
agent { node { label "master"}}
stages{
stage("CheckOut"){
steps{
script{
tools.PrintMes("获取代码","green")
checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], extensions: [], userRemoteConfigs: [[credentialsId: '9f0c031f-924e-4a84-a9ea-4957d27a9d54', url: "${srcUrl}"]]])
}
}
}
stage("Build"){
steps{
script{
tools.PrintMes("执行打包","green")
build.Build(buildType,buildShell)
deploy.AnsibleDeploy("${deployHosts}","-m ping")
}
}
}
}
post {
always {
script{
println("always")
}
}
aborted {
script{
println("aborted")
gitlab.ChangeCommitStatus(projectId,commitSha,"canceled")
toemail.Email("流水线被取消了!!!",userEmail)
}
}
success {
script{
println("success")
gitlab.ChangeCommitStatus(projectId,commitSha,"success")
toemail.Email("流水线成功",userEmail)
}
}
failure {
script{
println("failure")
gitlab.ChangeCommitStatus(projectId,commitSha,"failure")
//邮件提醒
toemail.Email("流水线失败了!!!",userEmail)
}
}
}
}