目录
一、目的:
二、钉钉表单设计:
三、Jenkins设置(插件Role-based ):
四、服务器部署:
五、Python3定时检测脚本:
一、目的:
公司目前的软件版本发布是通过Jenkins来执行的,生产环境发布版本需要通过相关的OA流程,审批通过后由运维管理员操作。该流程审批过程通知不及时,运维管理员工作量大。
为了简化jenkins版本发布流程,使开发人员能更灵活的控制版本的更新迭代,现准备将Jenkins的版本发布流程,从OA系统转到钉钉软件。在钉钉的OA工作台上提交版本发布流程,审批通过过,钉钉将自动发送Jenkins登陆帐号密码给申请人,帐号密码有一定的有效期,到期后帐号权限自动收回。
本方案涉及技术点:钉钉表单设计、钉钉二次开发、Jenkins二次开发、Python脚本等。
本文干货较多,另有完整代码付费下载,感谢大家打赏支持。也可根据本文介绍,自行研究调试程序。该系统目前已正式运行多月,实测有效!!!
二、钉钉表单设计:
1、登陆钉钉后台管理界面(钉钉管理员或授权),工作台 -- OA审批 -- 创建新表单
请注意,表单的名称(PROJECT、SERVER_1等)在后面的脚本中会使用到,如需改名,则脚本中也需要同步修改。另外,PROJECT的项目名称,需和脚本中调用的数据库的项目名称一至。
发布服务名称,可设置多个,如SERVER_2、SERVER_3等
流程审批:根据公司各部门具体情况,可添加主管审批、测试审批。注意,最后再增加1个发起人的审批流程,这样,在主管、测试审批通过后,在申请人准备发布版本时,再点确认后,5分钟内钉钉就会发送帐号密码(由于密码有时效性,这样可以避免过早接收密码)
2、创建1个H5应用,用于钉钉发送消息通知
需填写钉钉的应用凭证:AgentId、AppKey、AppSecret
审批流程通过后,系统将会发送通知,告知流程发起人Jenkins平台的帐号、密码。钉钉将通过工作通知发送,见下图。
三、Jenkins设置(插件Role-based ):
1、Jenkins版本需大于V2.204,否则无法安装相关插件
2、关闭跨站请求伪造保护:
系统设置—全局安全设置 –关闭跨站请求伪造保护
注意,最新版本的Jenkins,无法在控制台关闭跨站请求,修改方法如下:
vi /usr/local/bin/jenkins.sh
找到exec java那行(大概是在第37行),添加
-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
最终的效果如下
exec java -Duser.home="$JENKINS_HOME" -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true "${java_opts_array[@]}" -jar ${JENKINS_WAR} "${jenkins_opts_array[@]}" "$@"
然后重启jenkins,登陆Jenkins,系统设置—全局安全设置,如显示以下内容,则跨站请求已关闭
3、权限设置:
a、安装插件:Role-based Authorization Strategy
b、系统设置—全局安全配置--授权策略 将 安全矩阵换成:Role-based
c、配置Roles:
重新进入系统管理界面,可看的Manage and Assign Roles,点击进入
Manage Roles管理角色 中新建角色 ding (设置 全部read及视图read权限)-- 角色名称对应脚本中的交互命令
新建 Item roles:Role=DingDing;Pattern=prod.* ; 权限(无 Create、Delete、Configure、Move)
说明:Role名称必须为DingDing(该名称和后面的脚本对应),Pattern的名称,”prod.*” 则表示,所有prod开头的jenkins任务,将会分配给指定用户
四、服务器部署:
1、操作系统:Centos 7.6
2、Python安装:
脚本需python3执行,python3安装可参考:centos下安装python3详细教程_大蛇王的博客-CSDN博客_centos如何安装python
安装相关组件:
pip3 install PyMySQL==0.10.1
pip3 install DBUtils==1.3
pip3 install requests
3、Mysql安装:
脚本中将记录及Jenkins信息储存在Mysql数据库中,请部署mysql,创建数据库oa_data,表结构见下图:(建表SQL可在最后的链接下载资源,付费下载,介意的可自行手动创建)
4、API接口:
脚本共用到钉钉API及Jenkins cli接口。钉钉API可到钉钉开发者后台下载,Jenkins接口可登陆jenkins后,系统管理 -- Jenkins命令行 下载,下载后的文件可copy到脚本所在目录(/data/dingding-python)
4、Jenkins授权测试:
Jenkins配置完成后,可手动发送相关命令,测试授权、取消授权是否有效。
相关变量:根据情况调整修改(Jenkins地址、用户名、密码)
jenkins_url=http://user:password@jenkins.test.com:9880/
user=zhouch@sao.so
passwd=xxxxxx
重置密码:(需jenkins-cli支持,可在Jenkins控制台下载)
echo 'jenkins.model.Jenkins.instance.securityRealm.createAccount("'$user'", "'$passwd'")' | java -jar jenkins-cli.jar -s $jenkins_url groovy =
授权:共3条命令
curl -X POST "${jenkins_url}role-strategy/strategy/assignRole" --data "type=projectRoles&roleName=DingDing&sid=$user"
curl -X POST "${jenkins_url}role-strategy/strategy/assignRole" --data "type=globalRoles&roleName=ding&sid=$user"
curl -X POST "${jenkins_url}reload"
授权后,重置该用户密码,即可以此用户、密码登陆该Jenkins
取消授权:
curl -X POST "${jenkins_url}role-strategy/strategy/unassignRole" --data "type=projectRoles&roleName=DingDing&sid=$user"
curl -X POST "${jenkins_url}role-strategy/strategy/unassignRole" --data "type=globalRoles&roleName=ding&sid=$user"
curl -X POST "${jenkins_url}reload"
取消授权后,可同时重置1个随机密码,这样,该用户就无法登陆了
五、Python3定时检测脚本:
1、每5分钟定时运行脚本,检测是否有新OA申请表单
*/5 * * * * nohup python3 -u /data/dingding-python/check_dingtalk_jenkins.py >/dev/null 2>&1 &
2、主要参数:
#MYSQL参数
MYSQL_HOST = '127.0.0.1'
MYSQL_PORT = 3306
MYSQL_USER = 'root'
MYSQL_PASS = 'xxxxxxxx'
MYSQL_DATA = 'oa_data'
#钉钉API参数
CORPID = "ding......................."
CORPSECRET = "g-................................."
APPKEY = "xxxxxxxxxxxxxxxxxxxx"
APPSECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-jE"
# AgentId -- 后台管理H5应用中,Jenkins助手的AgentId,10位数字
AGENTID = 1111111111
#审批表单CODE -- 通过钉钉管理员后台编辑表单获取
PROCESS_CODE = "PROC-F913BB80-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
脚本下载后,需要先修改以上主要参数:
Mysql相关参数,数据库oa_data需提前创建完成,对应创建所需的2个表。
参数 CORPID、CORPSECRET、APPKEY、APPSECRET,可咨询本公司钉钉后台管理员。
参数 AGENTID,为后台管理H5应用中,创建的Jenkins助手的AgentId,10位数字
参数 PROCESS_CODE,可在创建,编辑表单时获取;如链接地址为
https://aflow.dingtalk.com/dingtalk/web/query/oaDesigner?from=oaAdminHomeWeb&processCode=PROC-BD4B519A-531F-47CF-80DD-F27553BF77B&isCopyPublic=true#/z
则 PROCESS_CODE 为 PROC-BD4B519A-531F-47CF-80DD-F27553BF77B
后面的脚本,定时检测该表单,有没有新的OA申请流程并处理。
3、主要处理流程:
- 调用函数getprocessinstance(),检测过去24小时内,有没有新的OA申请表单
- 根据表单编号procinstid,调用函数get_streaminfo()来获取表单内的具体信息
- 根据表单内的申请用户ID,originator_userid,调用函数get_user()来获取该用户的具体信息(登记的Email信息将作为Jenkins的登录用户名)
- 调用函数check_business_id()判断此表单信息是否已在数据库中,新表单可新增记录到数据库,状态stanus=0
- 如果表单流程已结束,即 task_status == "COMPLETED",这判断此流程状态:通过、拒绝。
- 如果流程状态通过task_result == "agree",则调用函数get_jenkin_info(),获取表单中需要发布的项目的Jenkins服务器相关信息,然后调用Jenkins API相关命令(见本文第四部分),来授权流程申请人的账号、密码,并直接将账号密码通过钉钉工作通知发送给用户。
- 授权后,更新数据库中的表单记录,将状态设置为 stanus=1
- 如果数据库中的表单记录,状态已经为1了,则判断授权是否已超过2小时,超过2小时,则调用Jenkins API相关命令,收回权限,并通知用户。收回权限后,更新数据库中的表单记录,将状态设置为 stanus=2
4、相关API接口
脚本中的相关API接口,已重新封装为def函数,便于调用。可下载本文最后提供的资源脚本,稍加修改即可使用(脚本中含大量注释,有一定Python编程基础即可)。
喜欢自行研究的,可查看钉钉API文档 : API总览 - 钉钉开放平台
附本脚本使用的def函数及对应的API
#先调用API获取到token
def getaccseetoken(): ==> dingtalk.api.OapiGettokenRequest
#获取24小时内的审批表单列表
def getprocessinstance(access_token): ==> dingtalk.api.OapiProcessinstanceListidsRequest
#获取审批表单具体内容
def get_streaminfo(access_token, procinstid): ==> dingtalk.api.OapiProcessinstanceGetRequest
#根据userid获取用户详情
def get_user(access_token, userid): ==> dingtalk.api.OapiUserGetRequest
#获取Jenkins助手发送消息所需Token
def getAPItoken(): ==> dingtalk.api.OapiGettokenRequest
#通过Jenkins助手发送给指定用户相关信息
def post_message(access_token,userid,msg_str): ==>
脚本及相关API接口控件,可直接下载使用 ,感谢支持!
钉钉OA流程审批,Jenkins自动授权通知用户密码-Python文档类资源-CSDN下载