1.申请Api的Key
要想把应用程序集成到Rancher中去就必须得到Rancher的认可,所以就需要一个凭证,也就是Token
1.点击这里的API&Keys
2.点击添加Key (在右上角)
3.填写描述(规范一点的命名,后续有用的)
4.选择作用范围,这里对安全性要求比较高或者各个集群的管理是不同的人员的话建议多将范围指定.
5.点击确定后 会出现 一段BearerToken的说,保存起来,这玩意丢了就要重新申请的。
到此为止Key就申请完毕了。
2.发布实现原理解析
jenkins 发布到Rancher中,在jenkins 插件中能搜到两个Rancher的插件,但是两个都有坑(不知道现在是不是修复好了,反正我做集成的时候是没有修复的)。
想去Github提一下这个问题,发现没有给我提交Bug的地方,无奈之下我只能去查阅了源码了,发现这个就是一个简单的一批的操作封装。
就是这个插件,这玩意是有坑的,在作者修复前,不建议使用
(这里我要吐槽Rancher的官方文档,Rancher-API的内容就是一笔带过,要不是我还是个半吊子前端,差点就要放弃了)
原理其实就是模拟Rancher的界面操作去调用Rancher界面的接口,这里要说一下Rancher的接口确实很规范。
秉承只要有界面,那就肯定有接口调用的精神,我打开了Chrome的F12,然后拿最常用的导入Yaml文件界面开刀了
当我看到了这一幕后我就瞬间恍然大悟了
这个玩意是不是很熟悉
就是一个Http请求接口,然后在Request的地方带上了你刚刚申请的那个Token,那这就好办了是不,只要将你想要执行的操作进行一次抓包就可以知道到底是哪些参数了。
然后再看URL中的参数 https://192.168.1.203/v3/clusters/c-6fkqr?action=importYaml
c-6fkqr
这玩意看起来很怪异,其实熟悉Restful的就应该知道这其实就是一个ID,就是这个集群在Rancher中ID (你要是看起来不熟悉,嘿嘿嘿......)。
3.发布脚本
按照上面的流程我又将重新配置,升级等接口抓了出来,然后经过测试写出了以下的发布脚本
我这里使用的是重新部署的接口,你们要是发布Yaml的话要去自己去写脚本,原理都说了,脚本不会写那我也没办法
const request = require('request');
const moment = require('dayjs');
var utc = require('dayjs/plugin/utc')
moment.extend(utc);
const argv = process.argv.splice(2);
const baseUrl = "https://192.168.1.203/v3"; // 这里写你们的Rancher那个截图上的EndPoint
const token = argv[1] || "token-xxxx:xxxxxx"; // 这里修改为刚刚保存下来的Token
const strictSSL = false; // 这里如果你们的有证书那就设置为true
let fullUrl = "";
function getPayload() {
console.log("开始获取Rancher远程参数");
return new Promise((res, rej) => {
request.get(fullUrl, {
headers: {
Authorization: `Bearer ${token}`
},
strictSSL: strictSSL
}, (error, response, body) => {
if (error)
rej(error);
let obj = body;
if (typeof (body) === "string")
obj = JSON.parse(body);
delete obj.actions;
res(obj);
});
});
}
function updateWorkLoad(data) {
console.log("开始重新部署");
let now = moment().utc().format();
data.annotations["cattle.io/timestamp"] = now;
request.put(fullUrl, {
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
strictSSL: strictSSL,
json: data
}, (error, response, body) => {
if (!error && response.statusCode === 200) {
console.log("重新部署成功!");
}
else {
console.log(error);
console.log("重新部署失败!");
}
});
}
function checkProject() {
// const argv = process.argv.splice(2);
if (argv && argv.length) {
let project = argv[0];
if (project.indexOf("http") >= 0) {
fullUrl = project;
} else {
fullUrl = `${baseUrl}${project}`;
}
}
else
throw new Error("没有找到Project参数");
}
checkProject();
getPayload().then((data) => {
updateWorkLoad(data);
});
小技巧:这里在界面上有一个API查看
的接口,你可以在里面找到这个项目的相关参数和配置.
建议:建议大家使用导入YAML的方式进行CD部署,我这里是因为已经写好了,又不是不能用,就懒得换了。
我这里是一个Node写的重新部署的例子,不会写就找你们前端来看这一段代码,然后扒拉扒拉,修修改改应该是可以用的。
接下来就就行CD集成,点开你jenkins 的配置。
这里勾上,如果你们jenkins 没有这玩意 就百度一下jenkins 安装Node打包环境
讲道理就是在插件管理中搜索 NodeJS plugin
这个插件安装后配置就完事了,配置这玩意在插件官方文档中写的清清楚楚明明白白的。
在你的构建打包最后面再加一个Shell框,然后在框中执行写好的脚本。
如果是使用我写好的脚本的话,你要先导入yaml文件 然后将API的那个地址用参数的形式传递进去。
我这里是Build过后的无依赖脚本,你们如果是运行源码的话还要加上
npm i request dayjs
node ./scripts/builded/publish.js /project/xxxxxx/xxxx/xxxx
脚本
echo "############################################ 开始发布 ############################################"
node ./scripts/builded/publish.js /project/xxxxxx/xxxx/xxxx
echo "############################################ 发布成功 ############################################"
到这里你就自动将你CI打包后的产物发布到了Rancher中了。
本文只讲了原理,和我自己的实践,我不能保证这是最佳实践,但是这玩意能用,这实践也不一定适合你,但是原理是讲清楚了的,可以自己动手写自己的脚本。