草庐IT

实现Jenkins集成企业微信-消息通知的功能

Chris0Yang 2023-09-28 原文

Jenkins集成微信,工作中档git有新代码提交会触发钩子自动完成上线,运维和开发人员不须时刻盯着Jenkins,通过企业微信的方式显示给运维和开发人员

  1. 注册企业微信的公众号 申请地址:https://mp.weixin.qq.com/
    搜索微信公众平台->注册->选择企业微信
    image.png

选择完成后把下面信息进行完善->使用自己微信扫描二维码进行管理后-点注册


image.png

注册成功登陆后点击应用管理->创建应用


image.png

上传图片->填写应用名称-可见范围->创建应用-保存好agentld和secret写入py脚本


image.png

更改py脚本内对应的内容 touser 为账号名称


image.png
image.png

Corpid为企业ID 这里只把corpid写入对应的位置


image.png

python脚本内容

#!/usr/bin/python2.7
#_*_coding:utf-8 _*_
 
import requests,sys,json
import urllib3
urllib3.disable_warnings()
 
reload(sys)
sys.setdefaultencoding('utf-8')
 
def GetToken(Corpid,Secret):
    Url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
    Data = {
        "corpid":Corpid,
        "corpsecret":Secret
    }
    r = requests.get(url=Url,params=Data,verify=False)
    Token = r.json()['access_token']
    return Token
 
def SendMessage(Token,Subject,Content, ProName):
    Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token
    #Data = {
    #    "chatid": "JenkinsAlarm",  # 此处不明白请参考企业微信官网
    #    "msgtype": "text",
    #    "text": {
    #        "content": "[项目名称] : " + ProName + '\n' + "[项目地址] : " + Subject + '\n' + Content + '\n'
    #    },
    #    "safe": "0"
    #}
    data = {
        "touser" : "XXXXXX",
        "msgtype" : "text",
        "agentid" : 1000002,
        "text" : {
           "content" : "[项目名称] : " + ProName + '\n' + "[项目地址] : " + Subject + '\n' + 
Content + '\n'
        },
        "safe":0
    }
    r = requests.post(url=Url,data=json.dumps(data),verify=False)
    return r.text
 
def action_from_file(filename):
    try:
        str1 = '[变更日志] : '
        with open(filename, 'r') as f:
            for i in f.readlines():
                str1 += i
        print str1
        if len(str1) == 17:
            str1 += " 无变更"
    # print str1
        return str1
    except Exception as e:
        #print('[ERROR] {0}'.format(e))
    str1 += str(e)
 
if __name__ == '__main__':
    Corpid = "企业ID"
    Secret = "Secret"
 
    Subject = sys.argv[1]
    Content = action_from_file(sys.argv[2])
    ProName = sys.argv[3]
 
    Token = GetToken(Corpid, Secret)
    Status = SendMessage(Token,Subject,Content,ProName)
    print Status

完成后配置Jenkins

1.由于Jenkins没有官网的插件来完成此功能,所以我们只能用网络上一些开源的插件(线下班不需要以下步骤,已集合在plugins)
Github下载代码:https://github.com/daniel-beck/changelog-environment-plugin
解压到某个目录 -> 进入目录执行以下操作
cdchangelog-environment-plugin-master 下,执行mvn verify时间较长,会在changelog-environment-plugin-master/target/下有个changelog-environment.hpi 文件,上传到Jenkins即可使用

2、配置jenkins
Jenkins进入到项目中->构建环境多了Add Changelog Information to Environment->点击选择

Entry Format中添加 %3$s(at %4$s via %1$s),参数分别为ChangeLog内容,时间,提交人。 
Date Format中添加 yyyy‐MM‐dd HH:mm:ss 就是时间格式。
image.png

构建后操作选择Post build task, 如果没有此选择请安装Hudson Post build task插件,SCM_CHANGELOG须安装changelog插件

上传py脚本->jenkins服务器上安装python requests模块。
如果网络速比较慢的,可以找国内源下载

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 
yum -y install python-pip 
pip2.7 install requests

参考文档:Python安装流程 - python2 安装 pip
https://www.jianshu.com/p/0dc71548b213

1) 是使用gitlab 配置自动触发构建、需要设置安全令牌Secret token

image.png

image.png

2) gitee 配置自动触发构建 Generic Webhook Trigger

image.png

配置远程仓库的钩子


image.png

进入到我们的远程仓库中,选择左侧的WebHooks后,配置URL,URL的格式为:

http://JENKINS_URL/generic-webhook-trigger/invoke?token=owner_token

JENKINS_URL指的是你的IP地址和服务器的端口号
owner_token指的是之前在上一步配置的token


image.png

配置完成后,点击更新/完成。然后测试一下请求是否成功,如果成功的话,可以在请求历史中看到对应的请求结果


image.png

如果遇到请求状态是403的话,就需要检查一下返回的错误信息,看一下jenkins那边的配置有没有问题了。
可以试一下重启一下Jenkins,或者是检查一下关于Jenkins安全相关的配置,在跨站请求伪造保护模块中,选择启用代理兼容。需要注意的是,由于我的Jenkins版本比较高,所以不一定和你们的页面完全一样,如果这里解决不了你的问题的话,还是另外需要百度解决。


image.png

image.png

实现信息推送的操作(Gitee、GitLab等)

添加 Post build task

echo "==========Start Notify=============="
echo ${SCM_CHANGELOG} > /tmp/${JOB_NAME}_change.log
python /data/script/jenkins_notify.py ${BUILD_URL} /tmp/${JOB_NAME}_change.log ${JOB_NAME}
rm -fv /tmp/${JOB_NAME}_change.log
image.png

1) Gitee WebHooke发送请求

image.png
# 企业微信收到的信息
[项目名称] : Java-Project01
[项目地址] : http://JenkinsIP:端口/job/Java-Project01//
[变更日志] : XXXXXXXXXXXXXX

2)GitLab Webhook发送请求

# 手动上传代码库
git tag -a v1.X -m "v1.x稳定版"
git commit -m "update index.html"
git push -u origin v1.x

# 企业微信收到的信息
[项目名称] : Java-Project01
[项目地址] : http://JenkinsIP:端口/job/Java-Project01//
[变更日志] : XXXXXXXXXXXXXX

有关实现Jenkins集成企业微信-消息通知的功能的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  4. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  5. ruby-on-rails - 我如何将 Hoptoad 与 DelayedJob 和 DaemonSpawn 集成? - 2

    我一直很高兴地使用DelayedJob习惯用法:foo.send_later(:bar)这会调用DelayedJob进程中对象foo的方法bar。我一直在使用DaemonSpawn在我的服务器上启动DelayedJob进程。但是...如果foo抛出异常,Hoptoad不会捕获它。这是任何这些包中的错误...还是我需要更改某些配置...或者我是否需要在DS或DJ中插入一些异常处理来调用Hoptoad通知程序?回应下面的第一条评论。classDelayedJobWorker 最佳答案 尝试monkeypatchingDelayed::W

  6. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  7. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

    我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

  8. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

    有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

  9. Ruby - 如何将消息长度表示为 2 个二进制字节 - 2

    我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi

  10. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

随机推荐