Jenkins 实现 Gitlab API 调用及共享库应用

original

Author:rab
Gitlab 版本:15.1.2
Jenkins 版本:2.332.3

Jenkins 官方文档
Gitlab 官方文档



我们可通过 Branches API 接口来创建分支,先进行接口调试,调试完成后以 Jenkins Pipeline 的方式执行,并最终通过进一步优化实现 Jenkins 共享库构建效果。

一、Branches API

1.1 获取接口地址

此时,就可以根据官方接口文档,获取如下创建分支的接口地址。

image-20220720212457723

curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/repository/branches?branch=newbranch&ref=main"

1.2 创建 Token

然后在 Gitlab 上创建 Token,操作步骤如下图:

image-20220720210637927

创建完成后会生成一个 Token,复制到接口地址

image-20220720211017865

curl --request POST --header "PRIVATE-TOKEN: DxVUpBnVmg4NUNfBdyxx" "https://192.168.56.133/api/v4/projects/5/repository/branches?branch=newbranch&ref=main"

# 这个toke与上图不符,是因为上图的toke被我删了,然后这是我重新创建的token
  • 接口地址中 /projects/5 就是 Gitlab 的项目 ID,如果你要对下图项目做相关操作,应修改为 /projects/3
  • newbranch 表示你要创建的分支名称(自定义);
  • main 表示你以哪个分支为基础来创建新分支。

image-20220720211901227

所以最终地址为:

curl --request POST --header "PRIVATE-TOKEN: DxVUpBnVmg4NUNfBdyxx" "https://192.168.56.133/api/v4/projects/3/repository/branches?branch=rab_test&ref=main"

# 我定义了一个名为rab_test的新分支,且以main分支为基础进行创建
# 如果你的Gitlab没有开启443认证,那需要把https--->http
# curl --request POST --header "PRIVATE-TOKEN: DxVUpBnVmg4NUNfBdyxx" "http://192.168.56.133/api/v4/projects/3/repository/branches?branch=rab_test&ref=main"

1.3 接口调试

1.3.1 shell 终端调试

此时,你在任意 shell 终端进行调试,最终看是否生成预期分支,这里我就在 Jenkins 服务器上执行上述接口地址。

image-20220720213450615

看样子是没什么问题,然后到 Gitlab 上看看有没有创建指定的分支。

image-20220720213716467

看到上图结果,完全是没问题的,说明调试已经调通了。

1.3.2 Postman 调试

1、新建 POST 请求

image-20220720215246034

2、请求头添加 Token 信息(k-v)

image-20220720215715183

3、配置好后点击 Send

image-20220720220019813

4、Gitlab 查看结果

image-20220720215923496

也是能够成功构建的。

postman 有一个好处就是,可以根据你的接口地址生成对应的语言片段,入下图,生成 cURL 格式的片段:

image-20220721074130645

当然,它还支持其他语言片段,如 python、Java等

image-20220721074618259

1.4 Pipeline 实现

以上接口都调通后,接下来就可以通过 Jenkins 流水线来实现了,写一个简单的案例,创建分支rab_test-2

pipeline {
	agent any
	stages {
		stage("create branch"){
			steps{
				// 复制刚刚postman调通的接口地址
				sh """
					curl --location --request POST \
					"http://192.168.56.133/api/v4/projects/3/repository/branches?branch=rab_test-2&ref=main" \
					--header "PRIVATE-TOKEN: DxVUpBnVmg4NUNfBdyxx"
				"""
			}
		}
	}
}

进行 Jenkins 构建操作,如图构建成功。

image-20220720221858742

接下来去 Gitlab 上看看是否生成新的分支。

image-20220720222025108

完全没问题,由于我的分支在 Pipeline 脚本中写死了,后面你可以自己优化一下,比如传递一些参数进行动态创建。

二、优化 Pipeline

你会发现,上面的 Pipeline 脚本的接口都是写死的,也就是说如果你想修改相关参数值的话,需要进入脚本中修改,比较麻烦,因此我们再次进行优化。

2.1 参数化构建

实现功能:使用者可以灵活自定义新分支名、基础分支,而不需要再次进入修改 Pipeline 脚本,只需要传递参数即可值。

1、配置参数化配置

image-20220722160509602

最终效果如下图:

image-20220722161159292

2、修改 Pipeline 脚本

上述参数定义好后,接下来就需要把参数名写进 Pipeline 脚本对应位置,实现参数传递。

pipeline {
	agent any
	stages {
		stage("create branch"){
			steps{
				// 复制刚刚postman调通的接口地址
				sh """
					curl --location --request POST \
					"http://192.168.56.133/api/v4/projects/3/repository/branches?branch=${env.NewBranchName}&ref=${env.BaseBranchName}" \
					--header "PRIVATE-TOKEN: DxVUpBnVmg4NUNfBdyxx"
				"""
			}
		}
	}
}

3、构建验证

  • Jenkins 构建

    image-20220722163726215

  • Gitlab 查看是否创建成功

    image-20220722163829870

2.2 Token 加密

上面的 Token 是以明文形式传输传输的,并不安全,我们需要用到凭证方式来代替明文方式。

1、在安全设置中找到管理凭据

image-20220722164231089

2、具体配置

image-20220722164704419

3、通过 Jenkins 自带的片段生成器来生成相关片段语句

image-20220722165500385

4、修改 Pipeline 脚本

pipeline {
	agent any
	stages {
		stage("Create Branch"){
			steps{
				script{
					withCredentials([string(credentialsId: 'gitlab-create-branch', variable: 'Gitlab_Token')]) {
						// 创建分支
						sh """
							curl --location --request POST \
							"http://192.168.56.133/api/v4/projects/3/repository/branches?branch=${env.NewBranchName}&ref=${env.BaseBranchName}" \
							--header "PRIVATE-TOKEN: ${Gitlab_Token}"
						"""
					}
				}
			}
		}
	}
}

5、构建验证

  • Jenkins 构建

    image-20220722170212203

  • Gitlab 查看是否创建成功

    image-20220722170244315

2.3 定义函数(方法)

函数的作用在于更加灵活的传递参数、减少书写代码量。

1、定义函数

注意:函数体的参数名要和定义函数中的参数保持一致

// 创建分支
def CreateBranch(ProjectID, NewBranchName, BaseBranchName) {
	withCredentials([string(credentialsId: 'gitlab-create-branch', variable: 'Gitlab_Token')]) {
		sh """
			curl --location --request POST \
			"http://192.168.56.133/api/v4/projects/${ProjectID}/repository/branches?branch=${NewBranchName}&ref=${BaseBranchName}" \
			--header "PRIVATE-TOKEN: ${Gitlab_Token}"
		"""
	}
}

// 流水线(主)
pipeline {
	agent any
	stages {
		stage("Create Branch") {
			steps {
				script {
					ProjectID = 3
					// 调用函数时,如果定义的参数类型为字符串时需夹双引号,为数字时则不需要
					CreateBranch(ProjectID, "${env.NewBranchName}", "${BaseBranchName}")
				}
			}
		}
	}
}

2、构建验证

  • Jenkins 构建

    image-20220722171720258

  • Gitlab 查看是否创建成功

    image-20220722171903832

到这里,Gitlab 的工程 ID 还是被写死的,因此我们需要通过 Gitlab 的项目名动态获取 Gitlab 项目对应的 ID 值,这也需要调用 Gitlab 的相关接口,如下图。

image-20220722174810022

curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects?search=test"

# 参数说明
# PRIVATE-TOKEN:Token值
# test:表示你要填入的项目名称

# 修改一下
curl --header "PRIVATE-TOKEN: DxVUpBnVmg4NUNfBdyxx" "http://192.168.56.133/api/v4/projects?search=Tq"

现在命令行测试一下,看看该接口返回的结果;

可看到,已经返回了 Gitlab 中 Tq 项目的 id 值了,说明该接口可用。

image-20220722175431433

Postman 上更直观一点

image-20220722180306186

3、再次优化

// 请求地址
def HttpReq(ApiUrl, Method) {
	GitlabAPI = "http://192.168.56.133/api/v4"
	withCredentials([string(credentialsId: 'gitlab-create-branch', variable: 'Gitlab_Token')]) {
		response = sh returnStdout: true, script: """
			curl --location --request ${Method} \
				"${GitlabAPI}/${ApiUrl}" \
				--header "PRIVATE-TOKEN: ${Gitlab_Token}"
		"""
	}
	return response
}

// 创建分支
def CreateBranch(ProjectID, NewBranchName, BaseBranchName) {
	ApiUrl = "projects/${ProjectID}/repository/branches?branch=${NewBranchName}&ref=${BaseBranchName}"
	Method = "POST"
	HttpReq(ApiUrl, Method)
}

// 获取项目ID
def GetProjectID(ProjectName) {
	ApiUrl = "projects?search=${ProjectName}"
	Method = "GET"
	result = HttpReq(ApiUrl, Method)
	result = readJSON text: result
	return result[0]["id"]
}

// 流水线(主)
pipeline {
	agent any
	stages {
		stage("Create Branch") {
			steps {
				script {
					ProjectID = GetProjectID("${ProjectName}")
					CreateBranch(ProjectID, "${env.NewBranchName}", "${BaseBranchName}")
				}
			}
		}
	}
}
  • 进行构建

    image-20220723141300754

  • Gitlab 上查看是否生成

    image-20220723145203412

注意:如果你使用了 readJSON JSON 解析,那你需要安装如下插件,否则报错。

image-20220723144954347

错误现象:提示没有 readJDSON 这个方法,这种报错类型一般是缺少插件导致的,安装对应插件即可。

image-20220723145457812

三、共享库

上面已经做了相关优化了,但是在生产环境中的代码量远比上面多,而且定义的函数也会越来越多,因此,我们就需要使用 Jenkins 的共享库,共享库的作用是将具备同样性质或很少改动的函数(方法)归档于 Git 仓库管理,并在 Jenkinsfile 中调用(引用)的手段,这将大大减少 Pipeline 代码量。

3.1 创建共享库

1、创建项目仓库

image-20220723150155668

2、添加目录/文件

  • 点击 Web IDE

image-20220723151049250

  • 创建目录

    image-20220723150944708

  • 添加文件

    image-20220723152250816

3、将定义好的方法提交到代码仓库

image-20220723152849499

3.2 加载共享库

1、流水线脚本加载共享库

// 加载共享库,其中jenkinslib要与Jenkins系统配置中保持一致(jenkinslib可自定义),@amin表示共享库所在分支
@Library("jenkinslib@main") _
// 导入jenkinsfile.groovy。这里要注意:下面的jenkinsfile()名字必须与你共享库中jenkinsfile.groovy名一致,否则报错
def myjenkinsfile = new org.devops.jenkinsfile()

// 流水线(主)
pipeline {
	agent any
	tools {
		git 'git'
	}
	stages {
		stage("Create Branch") {
			steps {
				script {
					// 然后就可以调用共享库中的方法了 myjenkinsfile 即为我上面引用的方法(可在上面自定义)
					ProjectID = myjenkinsfile.GetProjectID("${env.ProjectName}")
					myjenkinsfile.CreateBranch(ProjectID, "${env.NewBranchName}", "${env.BaseBranchName}")
				}
			}
		}
	}
}

2、同样将流水线脚本也进行 Git 版本管理

这样的话便于管理 Jenkinfile 及共享库

image-20220723153913871

image-20220723162121271

3.3 Jenkins 配置

1、Jenkins 流水线配置

因为我们的流水线脚本进行了 Git 版本管理,所以你可以在 Jenkins 流水线配置中配置 URL 即可。

image-20220723155806926

2、Jenkins 系统配置

image-20220723161609360

3.4 Jenkins 构建

以上都配置好之后,接下来就开始构建了。

1、Jenkins 构建

image-20220723190934794

2、Gitlab 查看是否构建成功

image-20220723190856525

至此,已实现 Jenkins 如何调用 Gitlab API 及 Jenkins 共享库的最终应用。

<点击跳转至开头>

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云计算-Security

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值