jenkins

jenkins BlueOcean修复Pipeline不支持中文的问题

问题

在Jenkins的BlueOcean中,修改Pipeline,结果发现,如果编写过程中,凡是能导致jenkinsFile有中文信息的,点击 save and run之后 Console 中出现错误,无法保存。

分析

根据错误信息,定位到问题来源jenkins-js-extension.js,该问题和 js的btoa和atob 不支持unicode有关。

解决

  1. 将jenkins的./webapps/plugins/blueocean-pipeline-editor/WEB-INF/lib/blueocean-pipeline-editor.jar下载到本地,
  2. 解压出jenkins-js-extension.js,搜索btoa,有两处一样的代码,搜索atob也是一样的,成对出现。
  3. 修改代码,将两处encode和decode修改为以下结果:
  4. 将修改之后的jenkins-js-extension.js拖入blueocean-pipeline-editor.jar。
  5. 将修改之后的blueocean-pipeline-editor.jar上传到Jenkins的原处:./webapps/plugins/blueocean-pipeline-editor/WEB-INF/lib/blueocean-pipeline-editor.jar
var Base64 = {
    encode: function encode(data) {
        return btoa(unescape(encodeURIComponent(data)));
    },
    decode: function decode(str) {
        return decodeURIComponent(escape(atob(str)));
    }
};

An error occurred during installation: No such plugin: cloudbees-folder

在启动jenkins时候报错

An error occurred during installation: No such plugin: cloudbees-folder
1
字面意思是没有找到cloudbees-folder这个插件。有一些文章说下载这个插件到本地就好了。

然而jenkins启动的时候不仅仅有这一个插件。

https://github.com/jenkinsci/docker/issues/424 github issues里有一些讨论。似乎重启jenkins就可以了

# 访问这个地址就是重启
http://yourhost:8080/restart
1
2
然后我这里看来并不管用。

最后无意中发现我拉取的镜像是jenkins…并非jenkins/jenkins。我用的是docker…

当尝试拉取后者并启动之后,就没有这个报错了。

Jenkins教程 安装BlueOcean与Maven构建

前言

本文旨在使用BlueOcean实现构建可视化与使用Maven构建上一节Jenkins教程(三)添加凭据与流水线拉取Git代码拉下来的代码

什么是Blue Ocean

Blue Ocean 重新思考Jenkins的用户体验,从头开始设计Jenkins Pipeline, 但仍然与自由式作业兼容,Blue Ocean减少了混乱而且进一步明确了团队中每个成员 Blue Ocean 的主要特性包括:

  • 持续交付(CD)Pipeline的 复杂可视化 ,可以让您快速直观地理解管道状态。
  • Pipeline 编辑器 – 引导用户通过直观的、可视化的过程来创建Pipeline,从而使Pipeline的创建变得平易近人。
  • 个性化 以适应团队中每个成员不同角色的需求。
  • 在需要干预和/或出现问题时 精确定位 。 Blue Ocean 展示 Pipeline中需要关注的地方, 简化异常处理,提高生产力
  • 本地集成分支和合并请求, 在与GitHub 和 Bitbucket中的其他人协作编码时实现最大程度的开发人员生产力。

简言之:简化复杂可视化,提供更个性直观的界面,可以精准定位构建失败的位置

安装Blue Ocean

  • 准备条件:是管理员用户,或拥有安装插件的权限

Manage Jenkins > Manage Plugins

过滤输入Blue Ocean> 勾选第一个Blue Ocean > 直接安装 > 安装完成返回首页

这里提示有很多Blue Ocean的插件,我们是无需手动安装的,通过安装Blue Ocean会自动安装官方推荐的其它组件

此时我们可以使用 <host>:<port>/blue进行访问到Blue Ocean的页面

这里先不讲,配置好Maven后,我们再来使用它来构建一次

使用Maven构建工具

这里使用docker的maven镜像来进行构建工程,以减少多个构建工程使用同一构建工具时的冲突问题

另一方面是演示下agent的使用😆

准备条件:

  • 安装Docker
  • 添加Jenkins到Docker用户组sudo usermod -aG docker jenkins && newgrp docker
  • 重启Jenkins

创建自定义maven的配置文件/home/jenkins/mvnrepo/settings.xml,使用了阿里的镜像源,本地仓库这个不用改,这里会被容器映射到容器内/root/.m2

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                      https://maven.apache.org/xsd/settings-1.0.0.xsd">
  <mirrors>
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>*</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
  </mirrors>
</settings>

在Github的仓库中我创建了chapter2分支,里面的Jenkinsfile如下

pipeline {
    agent { //这里使用docker镜像来启动maven,这样有个好处就是多个工程同时构建时不会出现冲突而失败
        docker {
            image 'maven:3.6-alpine' 
            args '-u root -v /home/jenkins/mvnrepo:/root/.m2'  //持载到本地,减少重复下载量,使用ali源
        }
    }
    stages {
        stage('Pull Git Demo') {
            steps{
                //拉取代码
            	git 'https://github.com/hellxz/springboot-demo1.git'
            }
        }
        stage('Build') { 
            steps {
                //执行构建命令
                sh 'mvn -B -DskipTests clean package' 
            }
        }
    }
}

持载的那个位置下的settings.xml会被maven容器使用,从而修改镜像源,另外在settings.xml中指不指定本地仓库都没区别,亲测

创建流水线

指定Jenkinsfile所在的版本控制与分支,这里我使用的是https://github.com/hellxz/JenkinsfileTutorials.git

分支是chapter2,检出到chapter2目录下,Jenkinsfile直接就在仓库的根目录内

启动测试

输入http://<host>:<port>/blue, 点击刚才创建的maven build demo项目

点击运行

构建成功,我们查看Build步骤,可以看到构建成功了

由于在公司里我使用的是本地配置的maven,所以查hub.docker.com,对Jenkinsfile中使用maven镜像的部分修改了几次,不然你会看到拉取的jar包都是从阿里源中拉出来的

查看构建目录

本文结束

后记

被maven-docker的文档小坑了一下,文档中提到的自定义settings.xml文件是持载到另一个目录下

还有就是maven容器内使用的用户是非root用户,如果按官方文档中不加-u root,那么容器内的/root/.m2目录是持载不出来的!

当前我们的构建属于脏构建,即上次的构建结果与代码拉取结果都在同一个工作目录中,这样是需要修改的,现在为了简单演示没有添加,可以在拉代码前加一个清理空间的步骤,使用cleanWs()命令

下篇准备写把微服务项目打成Docker镜像,静请期待

引文

Devops自动化集成部署-jenkins与jira集成

1.jenkins安装jira插件

系统管理->插件管理
在这里插入图片描述
可选插件
搜索jira
勾选JIRA Trigger
点击直接安装
在这里插入图片描述

2.jenkins配置

2.1系统设置

系统管理->系统设置
在这里插入图片描述
找到JIRA Trigger Configuration
填入jira的url、用户名、密码信息
点击保存
在这里插入图片描述

2.2任务配置

对任务进行配置
找到构建触发器
勾选Build when an issue is updated in JIRA(JIRA问题更新)
JQL filter为问题过滤
Changelog matcher 为更改日志匹配器
Parameter mapping为参数映射
具体怎么填在3.jira配置里介绍
在这里插入图片描述

3.jira配置

3.1网络钩子WebHooks配置

左上角点击设置->系统
在这里插入图片描述
在左边导航栏找到网络钩子
在这里插入图片描述
点击创建网络钩子
在这里插入图片描述
基础信息填写
填入网络钩子名称
状态开启
URL填入: http://[jenkins ip地址:端口]/jira-trigger-webhook-receiver/
描述非必填
在这里插入图片描述
jenkins那边配置的是问题事件,其它事件就不介绍了,根据需要勾选

问题事件配置
component = workflow是jenkins那边配置的JQL filter
已更新对应jenkins里Build when an issue is updated in JIRA触发器
在这里插入图片描述
JQL filter还有很多参数,我填的component是模块
因为是spring cloud项目,问题更改了哪个模块,就去重新部署某个微服务项目
参数一览
在这里插入图片描述
配置完之后点击最下面的创建
在这里插入图片描述
出现以下页面,点击一下链接,验证一下是否成功
在这里插入图片描述
出现以下页面就表示配置成功
在这里插入图片描述

3.2问题状态配置

在jenkins触发器配置的时候,我配置了问题状态为完成的时候触发构建
在这里插入图片描述
这个状态来自设置->问题
在这里插入图片描述
问题属性->状态
在这里插入图片描述
点击状态我可以看到下图,可以添加状态,编辑状态
在这里插入图片描述
点击完成状态的编辑按钮,可以看到我们在jenkins填的Done就是状态的名称
在这里插入图片描述

3.3工作流配置

在问题->工作流
在这里插入图片描述
具体怎么配看需求,在哪一步需要重新构建部署,把那一步的流程状态名称填入jenkins构建触发器配置里

3.4创建项目

点击项目->创建项目
在这里插入图片描述
选择Scrum开发方法
点击下一步
在这里插入图片描述
点击选择
在这里插入图片描述
填入名称、关键字
点击提交
在这里插入图片描述

3.5模块配置

点击模块,在上方填入需要增加的模块信息,点击添加
前面我们配置的模块名称是workflow,这里新建了一个workflow模块
在这里插入图片描述

4.验证

点击顶部导航栏的新建按钮
在这里插入图片描述
填入必填信息,模块选择我们已经配置好的workflow,点击新建
在这里插入图片描述
点击问题,找到新建的问题,点击完成来触发jenkins构建
在这里插入图片描述
在jenkins里workflow构建任务开始构建了,配置成功!
在这里插入图片描述

版权声明:本文为

jenkins构建结果企业微信提醒

每当jenkin在构建之后我们想把构建结果SUCCESS/FAILURE或者其他信息通知给其他人,也许有人会说,不是有邮件提醒吗?但是我这里的环境邮件提醒的话所被通知者并不会第一时间去阅读,所以我们用“钉钉”,“企业微信”来第一时间去通知你想通知的小伙伴们。

因为我这里的环境用的是企业微信所以本文都是基于企业微信来说的,不过在钉钉上也可以使用,也可以利用钉钉在jenkins上的插件,那样更方便些。

进入正题

我们要获得jenkin的构建结果是SUCCESS还是FAILURE是需要jenkin构建完毕才能获取到的,那么我们从哪里能获得构建结果以及其他信息呢?

我们可以用日志信息或者api的构建信息来获取

我们 我们可以用日志信息或者api的构建信息来获取,这里我们是基于查看日志来查看构建结果以及其他信息,我这里以windows环境以及jenkins默认安装环境来举例

每一次日志文件的位置我们可以在如图位置找到

我们去最后一次构建结果查看日志文件

在结果查看构建结果是否成功

那么我们可以用python来写个读取结果的脚本,用jenkins来自动运行

import requests import json import urllib.request import urllib.error import time # 获取构建结果 def getResult(): fname = pathGitLab with open(fname, ‘rb’) as f: #打开文件 first_line = f.readline() #读第一行 #print (first_line) off = -50 #设置偏移量 while True: f.seek(off, 2) #seek(off, 2)表示文件指针:从文件末尾(2)开始向前50个字符(-50) lines = f.readlines() #读取文件指针范围内所有行 # print (lines) if len(lines)>=2: #判断是否最后至少有两行,这样保证了最后一行是完整的 last_line = lines[-1] #取最后一行 print (last_line) break off *= 2 if ‘FAILURE’ in last_line.decode() : return 1 # else: # return 0 #获取下一次构建的Number和当前构建的number def getNextNumber(): f = open(r’C:\Program Files (x86)\Jenkins\jobs\Developer\nextBuildNumber’, ‘r’) currentNumber=int(f.read())-1 return currentNumber #网络模块,用于企业微信发送信息 def jenkins(result): url=‘https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=2ef5c862-b2a6-45bc-a183-ee6666666666666666’ # 企业微信机器人的webhook if result==1: con={“msgtype”: “text”,“text”: {“content”: “站点构建提醒\r\n构建站点:Developer\r\n构建结果:FAILURE\r\n构建失败,请您检查代码并重新构建,谢谢”},} # else : # con={“msgtype”: “text”,”text”: {“content”: “developer构建结果:构建失败,请检查代码后重试!”},} jd=json.dumps(con).encode(‘utf-8’) req=urllib.request.Request(url,jd) req.add_header(‘Content-Type’, ‘application/json’) response=urllib.request.urlopen(req) if __name__ == ‘__main__’: jobCurrentNumber=getNextNumber() #获取当前构建number # print (jobCurrentNumber) # myDict=getDict()#获取同事所有联系方式 #获取当前构建的目录比如D:\Jenkins\jobs\gk_check\builds\153, path=“C:\\Program Files (x86)\\Jenkins\\jobs\\Developer\\builds\\”+str(jobCurrentNumber)+“\\” pathGitLab=path+“log” # 获取svn版本和id信息的文件路径 pathAuthor=path+“changelog.xml” # 获取递交者信息的文件路径 result=getResult() # 读取构建结果 # print (result) jenkins(result) # 最后执行函数 getResult()

这里的企业微信的webhook地址我们可以在如下的地方添加机器人

这样就可以获得webhook的地址来进行来进行企业微信提醒

接下来我们在jenkins的构建模块进行构建后操作

ping 127.1 -n 5 >nul # 延迟5秒,目的是的等jenkins构建完成来获取结果 @echo off D: cd D:\test start python developer_error.py #执行脚本

这里再简单说下curl 进行企业微信提醒

可以在构建最开始和结尾执行curl的命令

ios和Android的自动化构建结果也可以企业微信通知,如下图

还可以增加其他功能,等待大家去尝试,如果有什么问题或者创新想法大家可以说一哈

jenkins 通过shell启动java应用程序会随着job完成而被自动关闭的解决方法

我们使用jenkins进行构建打包后,实现自动部署,但 通过shell启动应用程序后,构建job完成应用程序也会自动关闭。下面以tomcat为例

如上执行后,tomcat先关闭,而后部署启动成功,可以访问。但构建job只完成后,tomcat自动关闭。

解决如下:

在脚本前面添加上BUILD_ID=XXXXX,即可如下:

这样job结束后,tomcat不会自动关闭。

jenkins集成jira

一、插件准备

1、jira中安装插件

Jenkins Integration for JIRA Server

2、Jenkins中安装插件

JIRA Integration for Jenkins
Jira Issue Updater
JIRA Pipeline Steps
JIRA plugin
JIRA Trigger Plugin
JiraTestResultReporter plugin
https://repository.marvelution.org/content/repositories/releases/org/marvelution/jji/assemblies/jenkins-jira-plugin/

二、jenkins中的配置

1、创建API token(jira中可使用api token,亦可使用用户名密码认证)

系统管理-全局安全配置-取消掉“防止跨站点请求伪造”选项(否则使用API跨站点请求的时候,会返回403)-允许创建api token

用户-设置-API Token-Add new Token(后续在jira中使用token时,可到此处复制token)

2、系统管理-系统设置-JIRA-Steps中添加JIRA sites并测试连接

 

Jira Trigger Configuration-输入jira路径及用户名密码

三、Jira中配置

1、添加应用程序连接:

应用程序-应用程序链接-输入jenkins地址-创建新链接

配置传出认证:点击编辑-传出认证-基本访问-输入jenkins用户名、密码

2、配置Jenkins configuration:应用程序-Jenkins configuration-Add Site-输入jenkins地址及用户名密码(亦可使用api token)

3、添加网络钩子:

设置-系统-WebHook-创建WebHook,填写详细信息并设置触发规则

其中url为http://你的Jenkins地址/jira-trigger-webhook-receiver/

四、jenkins中创建job

1、构建触发器

跟jira相关的触发器有两类:

(1)Build when a comment is added to JIRA

JQL filter:指定触发对象,project=WUZ指的是jira中项目关键字为WUZ的项目

Comment pattern:jira备注中填写的comment,当用户在jira中添加指定备注时,会触发jenkins构建

Jenkins parameter:jenkins中的参数名称

Issue attribute path:jira issue中提取出得需要传给jenkins的属性值

下图样例中,当关键字为”TES”的项目中添加了备注信息:”build this please”,将触发jenkins构建,并将jira issue的ID传给参数JIRA_ISSUE_KEY,可在后面的pipeline中调用;

(2)Build when an issue is updated in JIRA

JIRA fiels ID:变更项

Compare new value:新的状态值

Compare old value:原始状态值

下图样例中,选择status作为jenkins构建的触发项,即issue的状态由TO DO 变更为In Progress时,触发jenkins构建建,并将此时的issue状态传给参数JIRA_ISSUE_KEY1

3、编写构建pipeline

  1. node {
  2. stage(‘Preparation’) {
  3. echo “${WORKSPACE}”
  4. echo “${JIRA_ISSUE_KEY}”
  5. }
  6. }
  7. node {
  8. stage(‘TransitionIssue’) {
  9. withEnv([‘JIRA_SITE=jira1’]) {
  10. def transitionInput =
  11. [
  12. transition: [
  13. id: ’31’
  14. ]
  15. ]
  16. jiraTransitionIssue idOrKey:”${params.JIRA_ISSUE_KEY}” , input: transitionInput
  17. }
  18. }
  19. }

4、样例效果

jenkins编译结果:

 

jira变更记录: