golang 操作Jenkins

news2024/11/24 4:48:35

1.創建Agent/Node

func CreateAgent(username string, password string, nodeName string, nodeDescription string, numExecutors string, remoteFS string, labelString string, host string) {

	var obj string

	obj = "{'name':+'" + nodeName + "',+'nodeDescription':+'" + nodeDescription + "',+'numExecutors':+'" + numExecutors + "',+'remoteFS':+'" + remoteFS + "',+'labelString':+'" + labelString + "',+'mode':+'NORMAL',+'':+['hudson.plugins.sshslaves.SSHLauncher',+'0'],+'launcher':+{'stapler-class':+'hudson.plugins.sshslaves.SSHLauncher',+'$class':+'hudson.plugins.sshslaves.SSHLauncher',+'host':+'" + host + "',+'includeUser':+'false',+'credentialsId':+'" + credentialsId + "',+'':+'0',+'sshHostKeyVerificationStrategy':+{'stapler-class':+'hudson.plugins.sshslaves.verifiers.KnownHostsFileKeyVerificationStrategy',+'$class':+'hudson.plugins.sshslaves.verifiers.KnownHostsFileKeyVerificationStrategy'},+'port':+'" + port + "',+'javaPath':+'',+'jvmOptions':+'',+'prefixStartSlaveCmd':+'',+'suffixStartSlaveCmd':+'',+'launchTimeoutSeconds':+'',+'maxNumRetries':+'',+'retryWaitTime':+'',+'tcpNoDelay':+true,+'workDir':+''},+'retentionStrategy':+{'stapler-class':+'hudson.slaves.RetentionStrategy$Always',+'$class':+'hudson.slaves.RetentionStrategy$Always'},+'nodeProperties':+{'stapler-class-bag':+'true'},+'type':+'hudson.slaves.DumbSlave',+'Submit':+''}"

	jenkinsUser := "Jenkins的用户"
	jenkinsAPIToken := "Jenkins的token"
	jsonObject := obj
	jenkinsURL := "http://127.1.1:80" //Jeknins地址
	data := fmt.Sprintf(`json=%s`, jsonObject)

	req, err := http.NewRequest("POST", jenkinsURL+"/computer/doCreateItem?name="+nodeName+"&type=hudson.slaves.DumbSlave", bytes.NewBufferString(data))
	if err != nil {
		Err("CreateAgent error : %v\n", err)
		return req.Response.StatusCode
	}

	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
	req.Header.Set("Authorization", fmt.Sprintf("Basic %s", base64.StdEncoding.EncodeToString([]byte(jenkinsUser+":"+jenkinsAPIToken))))

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		Err("CreateAgent error : %v\n", err)
		return resp.StatusCode
	}
	defer resp.Body.Close()
	 body, err := io.ReadAll(resp.Body)
	 if err != nil {
	 	fmt.Println("读取响应失败:", err)
	 	return
	 }
	 fmt.Println("响应内容:", string(body))
	 fmt.Println("\n\n响应状态码 ", resp.StatusCode)


}

nodeName                你创建的node的名字

nodeDescription        描述,空也可以

numExecutors           一般1

remoteFS                远程控制的目录,类似 home/Aaron

labelString               不写也可以

host                        远程主机的host

credentialsId          凭证,用来连接到远程主机的

2.创建凭证

func  CreateCredentials(username string, password string, id string)  {
	var obj string

	obj = "{'':+'0',+'credentials':+{'scope':+'GLOBAL',+'username':+'" + username + "',+'usernameSecret':+false,+'password':+'" + password + "',+'$redact':+'password',+'id':+'" + id + "',+'description':+'',+'stapler-class':+'com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl',+'$class':+'com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl'},+'Submit':+''}"

	jenkinsUser := "Jenkins的用户"
	jenkinsAPIToken := "Jenkins的token"
	jsonObject := obj
	jenkinsURL := "http://127.1.1:80" //Jeknins地址
	data := fmt.Sprintf(`json=%s`, jsonObject)

	req, err := http.NewRequest("POST", jenkinsURL+"/manage/credentials/store/system/domain/_/createCredentials", bytes.NewBufferString(data))
	if err != nil {
		Err("CreateCredentials error : %v\n", err)
		return 
	}

	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
	req.Header.Set("Authorization", fmt.Sprintf("Basic %s", base64.StdEncoding.EncodeToString([]byte(jenkinsUser+":"+jenkinsAPIToken))))

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		Err("CreateCredentials error : %v\n", err)
		return 
	}
	defer resp.Body.Close()

}

username        创建凭证的用户名

password        创建凭证的密码

id                     凭证的id,唯一,创建node的时候会用到

3.创建Job


func  CreateJob(jobName string, agent string, command string)  {
	jenkinsURL := "http://127.1.1:80" //Jeknins地址

	url := jenkinsURL + "/createItem?name=" + jobName

	data := `<project>
				<actions/>
				<description></description>
				<keepDependencies>false</keepDependencies>
				<properties/>
				<scm class="hudson.scm.NullSCM"/>
				<assignedNode>` + agent + `</assignedNode>
				<canRoam>false</canRoam>
				<disabled>false</disabled>
				<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
				<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
				<triggers/>
				<concurrentBuild>false</concurrentBuild>
				<builders>
				<hudson.tasks.Shell>
					<command>` + command + `
					</command>
					<configuredLocalRules/>
				</hudson.tasks.Shell>
				</builders>
				<publishers/>
				<buildWrappers>
				<hudson.plugins.timestamper.TimestamperBuildWrapper plugin="timestamper@1.25"/>
				</buildWrappers>
				</project>`



	jenkinsUser := "Jenkins的用户"
	jenkinsAPIToken := "Jenkins的token"

	req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(data)))
	if err != nil {
		Err("Error creating request:", err)
		return req.Response.StatusCode
	}

	req.Header.Set("Content-Type", "application/xml")
	req.SetBasicAuth(jenkinsUser, jenkinsAPIToken)

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println("Error sending request:", err)
		return
	}
	defer resp.Body.Close()
}

jobName                你创建的Job的名字

agent                      你的Job要跑在那个agent/node上面

command                执行的命令,类似 “ls  pwd”等

4.执行Job

func  BuildNow(jobName string)  {
	jenkinsURL := "http://127.1.1:80" //Jeknins地址

	url := jenkinsURL + "/job/" + jobName + "/build?delay=0sec"

	jenkinsUser := "Jenkins的用户"
	jenkinsAPIToken := "Jenkins的token"

	req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte("")))
	if err != nil {
		return
	}

	req.Header.Set("Content-Type", "application/xml")
	req.SetBasicAuth(jenkinsUser, jenkinsAPIToken)

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return
	}
	defer resp.Body.Close()

}

5.获取Job信息

url := fmt.Sprintf("http://%s@%s:%d/%s/api/json", Token, Addr, Port, api)

url = fmt.Sprintf("%s?depth=%d", url, 2)

		req, err := http.NewRequest("GET", url, bytes.NewBuffer([]byte("")))

Token        jenkins的token

Addr        jenkins地址

Port        jenkins端口号

api        固定写“computer”

这边会返回很多信息,都是json信息,然后你可以自己分析其中的内容。

PS:

这些API 你都可以自己去找,打开Jenkins,打开浏览器开发选项(选择network),然后做你要做的时候,就可以找到对应的API的动作了。Reuqest URL就是 API的地址,往下拉可以看到请求的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1304831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

洛谷 P8802 [蓝桥杯 2022 国 B] 出差

文章目录 [蓝桥杯 2022 国 B] 出差题目链接题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 思路解析CODE [蓝桥杯 2022 国 B] 出差 题目链接 https://www.luogu.com.cn/problem/P8802 题目描述 A \mathrm{A} A 国有 N N N 个城市&#xff0c;编号为 1 … N …

抖音跑腿小程序开发指南:从零开始到上线

如今&#xff0c;抖音跑腿小程序的开发已经成为一项具有巨大潜力的领域。本文将为您提供一份详尽的开发指南&#xff0c;从零开始引导您完成一个成功的抖音跑腿小程序的开发和上线过程。 第一步&#xff1a;确定目标和需求 了解用户的期望&#xff0c;确定小程序的功能模块&a…

ROS-ROS通信机制-小乌龟

文章目录 1.话题发布2.话题订阅3.服务调用4.参数设置5.通信机制比较 1.话题发布 需求描述: 编码实现乌龟运动控制&#xff0c;让小乌龟做圆周运动。 实现分析: 乌龟运动控制实现&#xff0c;关键节点有两个&#xff0c;一个是乌龟运动显示节点 turtlesim_node&#xff0c;另…

在RHEL8中如何使用 SELinux

本章主要介绍在RHEL8中如何使用 SELinux。 了解什么是 SELinux 了解 SELinux 的上下文 配置端口上下文 了解SELinux的布尔值 了解SELinux的模式 在 Windows系统中安装了一些安全软件后&#xff0c;当执行某个命令时&#xff0c;如果安全软件认为这个 命令对系统是一种危害&a…

【广州华锐互动】3D虚拟还原井下复杂事故:提高安全意识,预防事故再次发生

随着科技的不断发展&#xff0c;3D虚拟现实技术已经逐渐应用于各个领域&#xff0c;为我们的生活带来了诸多便利。在钻井行业&#xff0c;3D虚拟现实技术的应用也日益受到重视。通过3D虚拟还原井下复杂事故&#xff0c;可以帮助我们更直观地了解事故发生的原因和过程&#xff0…

Python3开发环境的搭建

1&#xff0c;电脑操作系统的确认 我的是win10、64位的&#xff0c;你们的操作系统可自寻得。 2&#xff0c;Python安装包的下载 &#xff08;1&#xff09;浏览器种输入网址&#xff1a;https://www.python.org 选择对应的系统&#xff08;我的是win10/64位) &#xf…

如何精准找企业线索?你缺一个法宝

如何找企业数据、找客户&#xff1f;近年来&#xff0c;经常会听到认识的销售朋友抱怨&#xff0c;每天花费大量时间从各种渠道找企业信息、找客户线索&#xff0c;结果总是不如意&#xff0c;投入大量时间&#xff0c;产出却0&#xff1b;创业成功的老板也抱怨优秀人才越来越难…

CSS特效027:超可爱的小狗狗,女孩子都喜欢

为什么当初选择计算机行业&#xff1f; 科技总是迷人的&#xff0c;通过计算机可以造出各种美妙的设计。 后来工作&#xff0c;更加感觉到可视化的魅力&#xff0c;于是乎更加的专注于canvas&#xff0c;CSS&#xff0c;openlayers&#xff0c;leaflet&#xff0c;cesium。。。…

Axure系列(二)之 元件库的介绍以及个人简介案例展示

目录 一. 元件介绍 二. 基本元件的使用 2.1 形状元件 2.2 图片元件 2.3 占位符 2.4 文本 2.5 线段元件 2.6 热区文件 三. 表单元件的使用 3.1 文本框 3.2 文本域 3.3 下拉列表 3.4 列表框 3.5 复选框 3.6 单选按钮 四. 菜单与表格元件的使用 4.1 树 4.2 表格…

大模型元年压轴盛会定档12月28日,第十届WAVE SUMMIT即将启航

回望2023年&#xff0c;大语言模型或许将是科技史上最浓墨重彩的一笔。从技术、产业到生态&#xff0c;大语言模型在突飞猛进中加速重构万物。随着理解、生成、逻辑、记忆四大能力显著提升&#xff0c;大语言模型为通用人工智能带来曙光。 AI开发者们正在用算法和代码书写一个…

连连看游戏

连通块记忆性递归的综合运用 这里x&#xff0c;y的设置反我平常的习惯&#xff0c;搞得我有点晕 实际上可以一输入就交换x&#xff0c;y的数据的 如果设置y1为全局变量的话会warning&#xff1a; warning: built-in function y1 declared as non-function 所以我改成p和q了…

gin投票项目5

对应视频V3版本 1.优化用户注册的功能 增加扩展字段 1.增加一个UUID字段&#xff0c;vachar&#xff08;50&#xff09;。 2.增加一个UUID的唯一索引。 UUID具有全局唯一性&#xff1b; 方法&#xff1a;在数据库中新建一个列&#xff0c;名为uuid并移至主键下方&#xf…

CTF-misc(1)图片隐写

笔记目录 渗透测试工具(1)wireshark渗透测试工具(2)Nmap渗透测试工具(3)BurpsuiteAWD比赛(1)AWD入门攻略大纲CTF-Web(2)SQL注入CTF-Web(3)文件上传漏洞 图片隐写目录 (1)GIf和二维码隐写 二维码补全 二维码绘图 Gif规律分析 (2)文本附加图片隐写 (3)IHDR文件头修复图片宽高 (…

基于单片机智能视力保护台灯控制系统设计

**单片机设计介绍&#xff0c;基于单片机智能视力保护台灯控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机智能视力保护台灯控制系统是一种基于单片机技术的设备&#xff0c;在保证照明效果的同时&#xf…

企业API网关适用业务场景

什么是企业级API网关 企业级API网关是一种用于管理、保护和监控企业内部和外部API&#xff08;Application Programming Interface&#xff09;的解决方案。它提供了一套统一的接入点&#xff0c;帮助企业实现对API的安全性、流量控制、版本管理、监控和分析等方面的管理。企业…

STM32储存器和总线构架

一、引言 本篇文章旨在介绍STM32小容量、中容量和大容量的储存器和系统构架&#xff0c;文中涉及到一些专有名词和概念较为抽象和陌生&#xff0c;建议读者能够查阅相关资料和知识加深了解。 二、正文 &#xff08;一&#xff09;、系统构架 在小容量、中容量和 大容量产品中…

接口自动化测试之Yaml数据驱动封装!

一、数据驱动&#xff1a;pytest.mark.parametrize(&#xff09; 首先看个样本&#xff1a; import pytestclass TestData:# parametrize有两个值&#xff0c;一个是args_name:参数名&#xff0c;一个是args_value:参数值,可以有多个&#xff0c;进行数据解包# args_value可以…

Windows环境提示“‘mysql‘ 不是内部或外部命令,也不是可运行的程序或批处文理件” 简易记录

在Windows环境下使用DOS命令窗登入MYSQL&#xff0c;提示“mysql 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。” 这意味着系统无法找到 mysql.exe可执行文件&#xff0c;这是因为 MySQL 没有正确安装或未添加到系统PATH环境变量中所致。 处理方法&#x…

巧用ChatGPT系列丛书(由北京大学出版社出版)

前言 随着人工智能技术的迅速发展&#xff0c;越来越多的工具和应用程序被应用于职场中&#xff0c;以提高我们的工作效率。其中&#xff0c;ChatGPT作为一种先进的自然语言处理技术&#xff0c;正在逐渐引起人们的关注。 ✨巧用ChatGPT系列书籍&#xff1a; 《巧用chatGPT快…

文献速递:PET-影像组学专题--临床上在乳腺癌方面PET-MRI的进展

文献速递&#xff1a;PET-影像组学专题–临床上在乳腺癌方面PET-MRI的进展 01 文献速递介绍 成像在乳腺癌的筛查、诊断、分期和管理中扮演着关键角色。乳房X线摄影&#xff08;mammography&#xff09;、超声检查和动态增强乳腺MRI是主要的乳腺癌成像方法。对于怀疑或已知有…