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是最好的语言,学习了一点点,还不敢说这样的话,不过确实蛮好用的. 做了一个简单的对数据库的增删改查的操作,主要是将四种操作写成了独立的函数,之后直接调用函数.以下是代码 ...
随机推荐
- Android 开发服务类 03_ServletForGETMethod
接收并处理用户通过 GET 方式上传的数据,一般小于 2K,并且安全性要求不高. package com.wangjialin.internet.servlet; import java.io.IOE ...
- 分区助手里如何从临近盘(如D盘)抽取一定的空间给已经快满了的盘(如E盘)(博主推荐)(图文详解)
不多说,直接上干货! 分区助手是什么?(博主推荐)(图文详解) 分区助手各版本比较(图文详解) 分区助手官网使用教程(专业版.绿色版和WinPE版)(图文详解) 安装分区助手时出现“分区助手已安装到你 ...
- mysql预编译
一.背景: 用Mybatis+mysql的架构做开发,大家都知道,Mybatis内置参数,形如#{xxx}的,均采用了sql预编译的形式,举例如下: <select id=”aaa” param ...
- px、pt和em的区别
(转载)http://www.1z1b.com/one-blog-a-week/px-em-pt/ 这里引用的是Jorux的“95%的中国网站需要重写CSS”的文章,题目有点吓人,但是确实是现在国内网 ...
- readtimeout
请求头去掉content-length,未找到明确原因.
- Jsp&Servlet入门级项目全程实录第3讲
惯例广告一发,对于初学真,真的很有用www.java1234.com,去试试吧! 1.建立数据表及数据(略) 2.装载驱动,建立数据表 <link rel="stylesheet&qu ...
- Oracle - 为子查询提供动态结果集
曾经遇到过这样一个需求:要求为method传入String,内容如"用户ID0,用户ID1,用户ID2...",然后根据这些ID返回一个结果集作为数据表供别人查询. SELECT ...
- [android] 手机卫士黑名单功能(列表展示)
先把要拦截的电话号码保存到数据库中,拦截模式用个字段区分,1 电话拦截,2 短信拦截,3全部拦截 新建Activity类CallSmsSafeActivity.java 新建布局文件activity_ ...
- Java JDK 配置环境变量
使用了java也有了两年了,安装了很多次jdk都记不住安装步骤 = =,刚刚又配置了一次,码一下步骤: 1.右击"此电脑" ---> "属性" ----& ...
- 【转】使用Freemarker实现网页静态化
使用Freemarker实现网页静态化 2017年08月20日 20:45:51 阅读数:1981 1.1. 什么是freemarker FreeMarker是一个用Java语言编写的模板引擎,它基于 ...