Jenkins操作,实现增删改查
Jenkins的版本是:Jenkins2.138.1
实现的操作接口:
using System;
using System.Collections.Generic; namespace iHRPublish.Utility
{
/// <summary>
/// Jenkins上创建项目
/// </summary>
public interface IJenkinsOperate: IDisposable
{
/// <summary>
/// 构建jenkins项目
/// </summary>
/// <param name="projectName"></param>
/// <returns></returns>
bool BuildJenkinsProject(string projectName);
/// <summary>
/// 在jenkins上创建项目
/// </summary>
/// <param name="projectName">项目名称</param>
/// <param name="info"></param>
/// <returns></returns>
bool CreateJenkinsProject(string projectName, out string info);
/// <summary>
/// 删除jenkins上的项目
/// </summary>
/// <param name="projectName">项目名称</param>
/// <returns></returns>
bool DeleteJenkinsProject(string projectName); /// <summary>
/// Jenkins 项目列表
/// </summary>
/// <returns></returns>
List<JenkinsJobDto> ListJenkinsProject();
/// <summary>
/// 登录
/// </summary>
/// <param name="j_username">jenkins用户名</param>
/// <param name="j_password">jenkins密码</param>
/// <returns></returns>
bool LoginJenkins(string j_username, string j_password);
/// <summary>
/// 重新加载配置文件,用于手动修改项目的config文件后刷新数据用。
/// </summary>
/// <param name="projectName">项目名称</param>
/// <returns></returns>
bool ReloadJenkinsProject(string projectName);
}
}
实现类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web; namespace iHRPublish.Utility
{
/// <summary>
/// Jenkins上创建项目
/// </summary>
public class JenkinsOperate : IJenkinsOperate
{
/// <summary>
/// 写日志
/// </summary>
public static Action<string> writeLogAction;
private static void writeLog(string msg)
{
msg = "[JenkinsOperate]" + msg;
writeLogAction?.Invoke(msg);
Console.WriteLine(msg);
}
static string _j_username = "xxxxx";//这里填入用户名........................................
static string _j_password = "xxxxx";//这里填入密码...............................
static string jenkins_crumb = "568be69f9ad6a3a479c13e71d07b31f7";
static JenkinsOperate()
{
string j_usernameStr = System.Configuration.ConfigurationManager.AppSettings["j_username"];
string j_passwordStr = System.Configuration.ConfigurationManager.AppSettings["j_password"];
string jenkins_crumbStr = System.Configuration.ConfigurationManager.AppSettings["jenkins_crumb"];
_j_username = string.IsNullOrEmpty(j_usernameStr) ? _j_username : j_usernameStr;
_j_password = string.IsNullOrEmpty(j_passwordStr) ? _j_password : j_passwordStr;
//测试用从配置文件读取。
jenkins_crumb = string.IsNullOrEmpty(jenkins_crumbStr) ? jenkins_crumb : jenkins_crumbStr;
}
System.Net.Http.HttpClient client = new HttpClient(); string jenkinsBaseUrl = "http://127.0.0.1:8080/"; /// <summary>
/// Jenkins 操作
/// </summary>
/// <param name="_jenkinsBaseUrl">Jenkins地址,如:http://xxx.xxx.xxx.xxx:8080</param>
public JenkinsOperate(string _jenkinsBaseUrl)
{
string jenkinsBaseUrlStr = System.Configuration.ConfigurationManager.AppSettings["jenkinsBaseUrl"];
jenkinsBaseUrl = string.IsNullOrEmpty(jenkinsBaseUrlStr) ? jenkinsBaseUrl : jenkinsBaseUrlStr;
if (!string.IsNullOrEmpty(_jenkinsBaseUrl))
{
jenkinsBaseUrl = _jenkinsBaseUrl;
}
} /// <summary>
/// 登录
/// </summary>
/// <param name="j_username">jenkins用户名</param>
/// <param name="j_password">jenkins密码</param>
/// <returns></returns>
public bool LoginJenkins(string j_username, string j_password)
{
if (string.IsNullOrEmpty(j_username)) { j_username = _j_username; }
if (string.IsNullOrEmpty(j_password)) { j_password = _j_password; }
string loginUrl = string.Format("{0}/j_acegi_security_check", jenkinsBaseUrl);
object obj = new { j_username = j_username, j_password = j_password };
var objJson = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
List<KeyValuePair<String, String>> loginParamList = new List<KeyValuePair<String, String>>();
loginParamList.Add(new KeyValuePair<string, string>("j_username", j_username));
loginParamList.Add(new KeyValuePair<string, string>("j_password", j_password)); var loginPara = new FormUrlEncodedContent(loginParamList);
var loginResponseMessage = client.PostAsync(loginUrl, loginPara).Result;
var loginStr = loginResponseMessage.Content.ReadAsStringAsync().Result;
writeLog("[loginStr]" + loginStr);
if (loginStr.Contains("登录"))
{
return false;
} //获取Jenkins-Crumb
string jenkinsCrumbStr = "\"Jenkins-Crumb\", \"";
var index = loginStr.IndexOf(jenkinsCrumbStr);
writeLog("[loginStr] jenkinsCrumbStr Index:" + index);
if (index == -)
{
return false;
}
var indexStart = index + jenkinsCrumbStr.Length;
var indexEnd = loginStr.IndexOf("\");", indexStart);
writeLog("[loginStr] jenkinsCrumbStr indexEnd:" + indexEnd);
if (indexEnd == -)
{
return false;
}
string jenkinsCrumb = loginStr.Substring(indexStart, indexEnd - indexStart);
jenkins_crumb = jenkinsCrumb;
return true;
} /// <summary>
/// 在jenkins上创建项目
/// </summary>
/// <param name="projectName">项目名称</param>
/// <param name="info"></param>
/// <returns></returns>
public bool CreateJenkinsProject(string projectName, out string info)
{
info = "ok"; //验证名称
string checkNameUrl = string.Format("{0}/view/all/checkJobName?value={1}", jenkinsBaseUrl, projectName);
var checkResult = client.GetAsync(checkNameUrl).Result;
var checkStr = checkResult.Content.ReadAsStringAsync().Result; writeLog("[CreateJenkinsProject] checkStr:" + checkStr);
if (checkStr != "<div/>")
{
info = "已存在项目名称";
return false;
} //创建新项目
string createItemUrl = string.Format("{0}/view/all/createItem", jenkinsBaseUrl);
List<KeyValuePair<String, String>> createParamList = new List<KeyValuePair<String, String>>();
createParamList.Add(new KeyValuePair<string, string>("name", projectName));
createParamList.Add(new KeyValuePair<string, string>("mode", "hudson.model.FreeStyleProject"));
createParamList.Add(new KeyValuePair<string, string>("from", ""));
createParamList.Add(new KeyValuePair<string, string>("Jenkins-Crumb", jenkins_crumb));
createParamList.Add(new KeyValuePair<string, string>("json", string.Format("{{'name': '{0}', 'mode': 'hudson.model.FreeStyleProject', 'from': '', 'Jenkins-Crumb': '{1}'}}", projectName, jenkins_crumb)));
var createPara = new FormUrlEncodedContent(createParamList);
var createResponseMessage = client.PostAsync(createItemUrl, createPara).Result;
var createStr = createResponseMessage.Content.ReadAsStringAsync().Result; writeLog("[CreateJenkinsProject] createStr:" + createStr);
if (createResponseMessage.StatusCode == HttpStatusCode.OK)
{
return true;
}
return false;
} /// <summary>
/// 删除jenkins上的项目
/// </summary>
/// <param name="projectName">项目名称</param>
/// <returns></returns>
public bool DeleteJenkinsProject(string projectName)
{
//删除
string deleteUrl = string.Format("{0}/job/{1}/doDelete", jenkinsBaseUrl, projectName); List<KeyValuePair<String, String>> deleteParamList = new List<KeyValuePair<String, String>>();
deleteParamList.Add(new KeyValuePair<string, string>("Jenkins-Crumb", jenkins_crumb)); var deletePara = new FormUrlEncodedContent(deleteParamList);
var deleteResponseMessage = client.PostAsync(deleteUrl, deletePara).Result;
var deleteStr = deleteResponseMessage.Content.ReadAsStringAsync().Result; writeLog("[DeleteJenkinsProject] deleteStr:" + deleteStr);
if (deleteResponseMessage.StatusCode == HttpStatusCode.OK)
{
return true;
}
return false;
}
/// <summary>
/// 构建jenkins项目
/// </summary>
/// <param name="projectName"></param>
/// <returns></returns>
public bool BuildJenkinsProject(string projectName)
{
string buildUrl = string.Format("{0}/job/{1}/build?delay=0sec", jenkinsBaseUrl, projectName);
List<KeyValuePair<String, String>> buildParamList = new List<KeyValuePair<String, String>>(); var buildPara = new FormUrlEncodedContent(buildParamList);
client.DefaultRequestHeaders.Add("Jenkins-Crumb", jenkins_crumb);
var buildResponseMessage = client.PostAsync(buildUrl, buildPara).Result;
var buildStr = buildResponseMessage.Content.ReadAsStringAsync().Result;
writeLog("[BuildJenkinsProject] buildStr:" + buildStr);
if (buildResponseMessage.StatusCode == HttpStatusCode.Created)
{
return true;
}
return false;
}
/// <summary>
/// Jenkins 项目列表
/// </summary>
/// <returns></returns>
public List<JenkinsJobDto> ListJenkinsProject()
{
var listUrl = $"{jenkinsBaseUrl}/api/json?pretty=true";
var listResult = client.GetAsync(listUrl).Result;
var listStr = listResult.Content.ReadAsStringAsync().Result;
var jobList = Newtonsoft.Json.JsonConvert.DeserializeObject<JenkinsDto>(listStr);
if (jobList != null && jobList.jobs != null)
{
return jobList.jobs;
}
return new List<JenkinsJobDto>();
}
/// <summary>
/// 重新加载配置文件
/// </summary>
/// <param name="projectName">项目名称</param>
/// <returns></returns>
public bool ReloadJenkinsProject(string projectName)
{
var reloadUrl = $"{jenkinsBaseUrl}/job/{projectName}/reload"; List<KeyValuePair<String, String>> reloadParamList = new List<KeyValuePair<String, String>>();
reloadParamList.Add(new KeyValuePair<string, string>("Jenkins-Crumb", jenkins_crumb)); var reloadPara = new FormUrlEncodedContent(reloadParamList);
var reloadResponseMessage = client.PostAsync(reloadUrl, reloadPara).Result;
var reloadStr = reloadResponseMessage.Content.ReadAsStringAsync().Result; writeLog("[ReloadJenkinsProject] reloadStr:" + reloadStr);
if (reloadResponseMessage.StatusCode == HttpStatusCode.OK)
{
return true;
}
return false;
} /// <summary>
/// 销毁数据
/// </summary>
public void Dispose()
{
client.Dispose();
}
}
}
dto对象:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace iHRPublish.Utility
{
/// <summary>
/// Jenkins job
/// </summary>
public class JenkinsJobDto
{
/// <summary>
/// job类型
/// 如:hudson.model.FreeStyleProject
/// </summary>
public string _class { get; set; }
/// <summary>
/// 项目名称
/// 如:iHR-Hardware-GuangBen
/// </summary>
public string name { get; set; }
/// <summary>
/// jenkins地址
/// 如: http://127.0.0.1:8080/job/iHR-Hardware-GuangBen/
/// </summary>
public string url { get; set; }
/// <summary>
/// 状态
/// 如:notbuilt,blue
/// </summary>
public string color { get; set; }
}
/// <summary>
///
/// </summary>
public class JenkinsDto
{
/// <summary>
/// jobs
/// </summary>
public List<JenkinsJobDto> jobs { get; set; }
}
}
调用方法:
//在jenkins上创建项目
string jenkinsHost = "http://127.0.0.1:8080";
string jenkinsLoginUserName = "admin";
string jenkinsLoginPwd = "123456";
string projectName = "项目名称";
using (JenkinsOperate jOperate = new JenkinsOperate(dto.jenkinsHost))
{
bool loginSuccess = jOperate.LoginJenkins(jenkinsLoginUserName, jenkinsLoginPwd);
if (!loginSuccess)
{
return ResultHelper.QuickReturnError(false, "Login_Jenkins_Fail", "登录Jenkins失败");
}
string info;
//创建项目
bool createSuccess = jOperate.CreateJenkinsProject(projectName, out info);
if (!createSuccess)
{
return ResultHelper.QuickReturnError(false, "Create_Jenkins_Project_Fail", "创建Jenkins项目失败:" + info);
}
//生成项目
bool createSuccess = jOperate.BuildJenkinsProject(dto.projectName);
if (!createSuccess)
{
return ResultHelper.QuickReturnError(false, "Build_Jenkins_Project_Fail", "创建Jenkins项目失败");
}
//列出所有项目
var list = jOperate.ListJenkinsProject();
if(list == null || list.Count == 0)
{
return ResultHelper.QuickReturnError<List<JenkinsJobDto>>(null, "Not_Find_Any_Project", "未查询到任何项目");
}
//删除项目
bool createSuccess = jOperate.DeleteJenkinsProject(projectName);
if (!createSuccess)
{
return ResultHelper.QuickReturnError(false, "Delete_Jenkins_Project_Fail", "删除Jenkins项目失败");
}
}
Jenkins操作,实现增删改查的更多相关文章
- 使用python操作XML增删改查
使用python操作XML增删改查 什么是XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输 ...
- js操作indexedDB增删改查示例
js操作indexedDB增删改查示例 if ('indexedDB' in window) { // 如果数据库不存在则创建,如果存在但是version更大,会自动升级不会复制原来的版本 var r ...
- MySQL数据分析(16)— 数据操作之增删改查
前面我们说学习MySQL要从三个层面,四大逻辑来学,三个层面就是库层面,表层面和数据层面对吧,数据库里放数据表,表里放数据是吧,大家可以回忆PPT中jacky的这图,我们已经学完了库层面和表层面,从本 ...
- Redis简单的数据操作(增删改查)
#Redis简单的数据操作(增删改查): 字符串类型 string 1. 存储: set key value 127.0.0.1:6379> set username zhangsan OK 2 ...
- MongoDB基础入门002--基本操作,增删改查
一.这里只是演示最基本的操作,更多的信息可以去官网.https://docs.mongodb.com/manual 打开一个cmd,输入mongo命令打开shell,其实这个shell就是mongod ...
- 2. MongoDB基本操作 —— 用Mongo.exe操作数据库增删改查
一.开篇 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(collection).文档对象 ...
- Linq 数据库操作(增删改查)
Linq数据库增删改查 Linq是一种查询语言,集成包含在formwork中,包含在C#语言中,它的作用是降低查询的门槛,提高开发效率,是我们必须掌握的技术之一,下面是我自己对linq数据库操作的方法 ...
- SQLAlchemy表操作和增删改查
一.SQLAlchemy介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数 ...
- Django-Model操作数据库(增删改查、连表结构)
一.数据库操作 1.创建model表 基本结构 1 2 3 4 5 6 from django.db import models class userinfo(models.M ...
- 初次尝试PHP——一个简单的对数据库操作的增删改查例子
第一次学习PHP,很多人说PHP是最好的语言,学习了一点点,还不敢说这样的话,不过确实蛮好用的. 做了一个简单的对数据库的增删改查的操作,主要是将四种操作写成了独立的函数,之后直接调用函数.以下是代码 ...
随机推荐
- C/C++ -- Gui编程 -- Qt库的使用 -- 信号与槽的关联
Qt信号与槽的三种关联方法:1.设计界面关联,编辑信号/槽,自动关联 2.手动关联(1).头文件中定义槽 -----mywidget.h----- #ifndef MYWIDGET_H #define ...
- Java处理正则表达式特殊字符转义 转
正则需要转义字符:'$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|' 异常现象: java.util.reg ...
- 开源项目Log4j
一:Log4j入门简介学习 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务器.NT的事件记录器.UNIX ...
- webstorm皮肤外观样式快速设置,CMD的使用方法,webstorm11激活方法
一.皮肤外观设置 因为这里是上班时间写的,其客套话就不多bb.步入正题 1.首先设置webstorm整体面板颜色 file->settings->Appearance&Behavi ...
- 开例外!微信小程序登录绕过CAS单点登录(SSO)认证检查
1 为了让微信API能够绕过CAS认证检查,将微信api入口部分设计为独立的模块.放入controller目录下,命名为wechat.java文件为WechatController.java 文件大体 ...
- Node.js其他模块
清明假期过得挺快,3天说没就没了,天热了今天把房间打扫了一下,看着挺舒心的.周六了解了下进程管理的Process模块,由于进程管理知识也比较多,今天先把其他的一些模块了解一下,进程管理这块以后慢慢学. ...
- ClickOnce 发布WinForm应用程序(非签名方式)
ClickOnce IIS7发布WinForm应用程序,非签名方式(不勾选签名中的"为ClickOnce清单签名") 一.在D盘上建一个文件夹”MyAppPath”. 该 ...
- iOS 网络请求数据缓存
1. NSURLCache简介: iOS对NSURLRequest提供了7种缓存策略:(实际上能用的只有4种) NSURLRequestUseProtocolCachePolicy // 默认的缓存策 ...
- 线程5--GCD简介
/******************************************************/ 同步函数 (1)并发队列:不会开线程 (2)串行队列:不会开线程 异步函数 ...
- SQLSERVER查询整个数据库中某个特定值所在的表和字段的方法
这几天有业务部门需要使用一个SAP B1老系统 中的报表,但是由于此报表没有加时间条件,导致一旦开始查询 就会导致B1系统异常退出.由于报表对应的SQL 是存在数据库中,所以想通过查找到这个报表的S ...