Skip to content
SRE运维进阶之路SRE运维进阶之路
github icon
  • Jenkins

    • Jenkins 学习笔记
      • 1 Jenkins 简介

        • 1.1 DevOps、CI、CD都是什么鬼?
          • 1.2 Jenkins简介
          • 2 安装 Jenkins

            • 2.1 yum 安装 jenkins
              • 2.2 war 包安装 jenkins
                • 2.3 使用 ansible 安装 jenkins
                  • 2.4 使用docker安装jenkins
                  • 3 使用 Jenkins

                    • 3.1 Jenkins用户权限管理
                      • 3.2 访问 API
                      • 4 流水线核心语法

                        • 4.1 开始编写Jenkinsfile
                          • 4.2 Jenkins流水线语法
                            • 4.3 Groovy 简明教程
                              • 4.4 Jenkins共享库应用
                                • 4.5 共享库之钉钉消息推送
                                  • 下载配置相关依赖插件
                                    • 创建配置共享库
                                      • 编写Groovy脚本
                                        • 在 Jenkins 中配置将共享库
                                          • 在流水线中导入共享库
                                          • 遇到的问题
                                          • 4.6 流水线开发工具
                                            • 4.7 pipeline 生产配置实例
                                              • 4.8 在 VS Code 中校验 Jenkinsfile
                                              • 5 流水线集成篇

                                                • 5.1 构建发布工具集成
                                                  • 5.2 用户认证系统集成
                                                  • 6 管理 jenkins

                                                    • 6.1 Jenkins 关闭和重启的实现方式
                                                    • 7 日常维护

                                                      • 7.1 Jenkins Job迁移
                                                      • 8 Jenkins 常见问题
                                                      • Ansible

                                                        • Ansible 学习笔记
                                                          • 1 初识Ansible
                                                            • 2 Ansible Inventory配置详解
                                                              • 3 Ansible Ad-hoc命令集

                                                                • 3.1 Ansible Ad-hoc 常用命令集
                                                                  • 3.2 Ansible lineinfile模块详解
                                                                  • 4 Ansible Playbook

                                                                    • 4.1 Playbook的结构及handler用法
                                                                      • 4.2 Playbook循环语句
                                                                        • 4.3 Playbook条件语句
                                                                          • 4.4 Playbook高级用法
                                                                            • 4.5 Playbook之tags
                                                                              • 4.6 巧用Roles
                                                                                • 4.7 Jinja2 模板
                                                                                  • 4.8 yaml语法
                                                                                  • 5 Ansible变量

                                                                                    • 5.1 自定义变量
                                                                                      • 5.2 Fact变量
                                                                                        • 5.3 魔法变量
                                                                                          • 5.4 使用lookup生成变量
                                                                                            • 5.5 使用vault配置加密
                                                                                            • 6 Ansible使用优化
                                                                                              • 7 常见问题
                                                                                                • 8 综合项目

                                                                                                  • 使用 ansible 快速安装 k8s 机器

                                                                                                4.5 共享库之钉钉消息推送

                                                                                                author iconClaycalendar icon2021年5月11日category icon
                                                                                                • 自动化工具
                                                                                                tag icon
                                                                                                • Jenkins
                                                                                                timer icon大约 3 分钟

                                                                                                此页内容
                                                                                                • 下载配置相关依赖插件
                                                                                                • 创建配置共享库
                                                                                                  • 编写Groovy脚本
                                                                                                  • 在 Jenkins 中配置将共享库
                                                                                                  • 在流水线中导入共享库
                                                                                                • 遇到的问题

                                                                                                # 4.5 共享库之钉钉消息推送

                                                                                                起因:执行完流水线后进行一定程度的消息推送,所以选择钉钉进行jenkins构建结构的消息推送

                                                                                                # 下载配置相关依赖插件

                                                                                                相关环境:

                                                                                                • Jenkins 2.277.3,安装文档见上篇
                                                                                                • DingTalk 插件 2.4.3
                                                                                                • build user vars plugin 插件 1.7
                                                                                                1. 在Jenkins中安装钉钉插件DingTalkopen in new window

                                                                                                  ⚠️ 请确保你的 Jenkins 版本 >= 2.176.4

                                                                                                2. 钉钉机器人配置,说明文档open in new window

                                                                                                  找到 Jenkins 首页 >> 系统管理 >> 钉钉,我的配置如下图

                                                                                                  image-20210426164341273

                                                                                                  ⚠️ ​注意手动输入机器人的id,不要自动生成,否则重启后,robot的id将发生变化

                                                                                                3. 安装build user vars pluginopen in new window插件,插件可能有相关版本依赖,需要重启一下 Jenkins 才能继续安装

                                                                                                  在流水线中,使用wrap,获取BUILD_USER变量

                                                                                                  wrap([$class: 'BuildUser']) {
                                                                                                  }
                                                                                                  
                                                                                                  1
                                                                                                  2

                                                                                                # 创建配置共享库

                                                                                                # 编写Groovy脚本

                                                                                                项目目录结构如下:

                                                                                                $ tree jenkinslibrary
                                                                                                jenkinslibrary
                                                                                                ├── README.md
                                                                                                └── src
                                                                                                    └── org
                                                                                                        └── devops
                                                                                                            └── dingmes.groovy
                                                                                                
                                                                                                3 directories, 2 files
                                                                                                
                                                                                                1
                                                                                                2
                                                                                                3
                                                                                                4
                                                                                                5
                                                                                                6
                                                                                                7
                                                                                                8
                                                                                                9

                                                                                                dingme.groovy文件内容如下

                                                                                                package org.devops
                                                                                                
                                                                                                def GetChangeString() {
                                                                                                    MAX_MSG_LEN = 100
                                                                                                    def changeString = ""
                                                                                                    def changeLogSets = currentBuild.changeSets
                                                                                                    for (int i = 0; i < changeLogSets.size(); i++) {
                                                                                                        def entries = changeLogSets[i].items
                                                                                                        for (int j = 0; j < entries.length; j++) {
                                                                                                            def entry = entries[j]
                                                                                                            truncated_msg = entry.msg.take(MAX_MSG_LEN)
                                                                                                            commitTime = new Date(entry.timestamp).format("yyyy-MM-dd HH:mm:ss")
                                                                                                            changeString += "> - ${truncated_msg} [${entry.author} ${commitTime}]\n"
                                                                                                        }
                                                                                                    }
                                                                                                    if (!changeString) {
                                                                                                        changeString = "> - No new changes"
                                                                                                    }
                                                                                                    return changeString
                                                                                                }
                                                                                                
                                                                                                def DingdingReq(RobotID, Status) {
                                                                                                    wrap([$class: 'BuildUser']) {
                                                                                                        def changeString = GetChangeString()
                                                                                                        dingtalk (
                                                                                                            robot: RobotID,
                                                                                                            type: 'MARKDOWN',
                                                                                                            title: '你有新的消息,请注意查收',
                                                                                                            text: [
                                                                                                                "### 构建信息",
                                                                                                                "> - 应用名称:**${env.JOB_NAME}**",
                                                                                                                "> - 构建结果:**${Status}**",
                                                                                                                "> - 当前版本:**${env.BUILD_NUMBER}**",
                                                                                                                "> - 构建发起:**${env.BUILD_USER}**",
                                                                                                                "> - 持续时间:**${currentBuild.durationString}**",
                                                                                                                "> - 构建日志:[点击查看详情](${env.BUILD_URL}console)",
                                                                                                                "### 更新记录:",
                                                                                                                "${changeString}"
                                                                                                            ],
                                                                                                            at: [
                                                                                                                'xxxxxxxxxxx'
                                                                                                            ]
                                                                                                        )
                                                                                                    }
                                                                                                }
                                                                                                
                                                                                                1
                                                                                                2
                                                                                                3
                                                                                                4
                                                                                                5
                                                                                                6
                                                                                                7
                                                                                                8
                                                                                                9
                                                                                                10
                                                                                                11
                                                                                                12
                                                                                                13
                                                                                                14
                                                                                                15
                                                                                                16
                                                                                                17
                                                                                                18
                                                                                                19
                                                                                                20
                                                                                                21
                                                                                                22
                                                                                                23
                                                                                                24
                                                                                                25
                                                                                                26
                                                                                                27
                                                                                                28
                                                                                                29
                                                                                                30
                                                                                                31
                                                                                                32
                                                                                                33
                                                                                                34
                                                                                                35
                                                                                                36
                                                                                                37
                                                                                                38
                                                                                                39
                                                                                                40
                                                                                                41
                                                                                                42
                                                                                                43
                                                                                                44
                                                                                                45

                                                                                                文本中xxxxxxxxxxx请根据实际情况更换为钉钉群组里面,具体人的手机号,可以添加多个

                                                                                                # 在 Jenkins 中配置将共享库

                                                                                                找到 Jenkins 首页 >> 系统管理 >> Global Pipeline Libraries,我的配置如下图

                                                                                                image-20210426171913350

                                                                                                # 在流水线中导入共享库

                                                                                                导入方法@Library('pipeline-library-demo')_,这样就可以使用共享库中的代码了

                                                                                                具体的 pipeline 脚本如下:

                                                                                                #!groovy
                                                                                                
                                                                                                @Library('pipeline-library-demo')_
                                                                                                
                                                                                                //func from shareibrary
                                                                                                def dingmes = new org.devops.dingmes()
                                                                                                
                                                                                                //env
                                                                                                String branchName = "master"
                                                                                                String gitlabCredentialsId = "xxx"
                                                                                                String gitUrl = "http://xxx/xxx/jenkinslibrary.git"
                                                                                                String robotId = "2e0e11c4-2211-4687-b317-cacf58197288"
                                                                                                
                                                                                                pipeline {
                                                                                                    agent any
                                                                                                    
                                                                                                    stages {
                                                                                                        stage('Git Clone') {
                                                                                                            steps {
                                                                                                                git branch: "${branchName}",
                                                                                                                credentialsId: "${gitlabCredentialsId}",
                                                                                                                url: "${gitUrl}"
                                                                                                            }
                                                                                                        }
                                                                                                    }
                                                                                                    post {
                                                                                                        success {
                                                                                                            script {
                                                                                                                dingmes.DingdingReq(robotId, "构建成功 ✅")
                                                                                                            }
                                                                                                        }
                                                                                                        failure {
                                                                                                            script {
                                                                                                                dingmes.DingdingReq(robotId, "构建失败 ❌")
                                                                                                            }
                                                                                                        }
                                                                                                    }
                                                                                                }
                                                                                                
                                                                                                1
                                                                                                2
                                                                                                3
                                                                                                4
                                                                                                5
                                                                                                6
                                                                                                7
                                                                                                8
                                                                                                9
                                                                                                10
                                                                                                11
                                                                                                12
                                                                                                13
                                                                                                14
                                                                                                15
                                                                                                16
                                                                                                17
                                                                                                18
                                                                                                19
                                                                                                20
                                                                                                21
                                                                                                22
                                                                                                23
                                                                                                24
                                                                                                25
                                                                                                26
                                                                                                27
                                                                                                28
                                                                                                29
                                                                                                30
                                                                                                31
                                                                                                32
                                                                                                33
                                                                                                34
                                                                                                35
                                                                                                36
                                                                                                37
                                                                                                38

                                                                                                至此完成,构建效果如下图:

                                                                                                image-20210426172713667

                                                                                                # 遇到的问题

                                                                                                1. currentBuild.durationString的值传递不进去,一开始先用withEnv包裹一下

                                                                                                  后来找到原因 Groovy 在单引号的字符串里面是不支持插值的,所以要用双引号

                                                                                                  单引号中的env.JOB_NAME会引用失败,双引号则引用成功

                                                                                                  单、双引号引用JOB_NAME都引用成功

                                                                                                  推荐所有变量都用""双引号

                                                                                                  三引号也是一样,''' 三单引号不支持插值,"""三双引号支持插值

                                                                                                参考链接:https://www.ssgeek.com/post/jenkinssharelibrary-shi-jian-zhi-zi-ding-yi-tong-zhi-qi/

                                                                                                edit icon编辑此页open in new window
                                                                                                上次编辑于: 2022/4/27 15:33:00
                                                                                                贡献者: clay-wangzhi
                                                                                                上一页
                                                                                                4.4 Jenkins共享库应用
                                                                                                下一页
                                                                                                4.6 流水线开发工具
                                                                                                备案号:冀ICP备2021007336号
                                                                                                Copyright © 2023 Clay