文档章节

Jenkins工作相关

磁针石
 磁针石
发布于 2016/03/02 14:23
字数 1066
阅读 178
收藏 0
点赞 1
评论 0

Jenkins比较消耗资源,bug也比较多,公司后期会转向其他系统,暂时有些东东记录在这里。


轮询无法检测新提交的问题

现象是同时选中“Build when a change is pushed to GitHub”和 “Poll SCM", git有提交时,不会触发构建。

通常这种情况使用hook即可,在代码目录的hooks子目录配置post-commit即可。但是我这边不能完全控制git,所以只能用轮询的方法,Jenkins的轮询比较低效,经常出现内存溢出等不稳定情况,也需要外来脚本进行干预,为此用python脚本:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import logging
import logging.handlers
import time
import re
import os.path
import subprocess32
import sys
sys.path.append('../lib/')


from requests.auth import HTTPDigestAuth

dial_logger = logging.getLogger('MyLogger')
dial_logger.setLevel(logging.DEBUG)
fh = logging.handlers.RotatingFileHandler(
    '../logs/dial_log_server.log',
    maxBytes=10000000,
    backupCount=5)
fh.setLevel(logging.DEBUG)
formatter = logging.Formatter(u'%(asctime)s [%(levelname)s] %(message)s')
fh.setFormatter(formatter)
dial_logger.addHandler(fh)
dial_logger.info("Application starting! \n")


while True:

    for line in open("../conf/url.csv"):
        
        try:
        
            now = time.strftime("%Y-%m-%d_%H:%M:%S", time.gmtime())
            print(now)
    
            name, git_url, branch, jenkins_url = line.strip().split(',')
            # print(name, git_url, branch, jenkins_url)
            dial_logger.info("Beginning Scan {0}! \n".format(name))
            dial_logger.info("{0} {1} {2}! \n".format(git_url, branch, jenkins_url))
            cmd = "git ls-remote -h " + git_url
            result = subprocess32.check_output(cmd,shell=True)
            #print(result)
            version = re.findall(r'(\S+)\s+{0}'.format(branch), result, re.MULTILINE)[0]
            dial_logger.info("current version: {0}! \n".format(version))
            file_name = '/tmp/{0}'.format(name)
    
            if os.path.exists(file_name):
                old_version = open(file_name).read().strip()
                # print(old_version, version)
                dial_logger.info("old version: {0}! \n".format(old_version))
                if old_version == version:
                    dial_logger.info("Don not call {0} \n".format(name))
                    print("Don not call {0} \n".format(name))
                    continue
    
            f = open(file_name,'w')
            f.write(version)
            f.close()
            
            dial_logger.info("Call {0} \n".format(jenkins_url))
            cmd = "curl --user xurongzhong:123456 -s {0} &".format(jenkins_url)
            # print(cmd)
            dial_logger.info("command: {0}! \n".format(cmd))
            subprocess32.call(cmd, shell=True)
            time.sleep(1.5)
            
        except Exception as e:
            dial_logger.error(str(e), exc_info=True)        

    dial_logger.info("End Scan! \n")
    time.sleep(3 * 60)

注意点:

* curl后面的接的地址不要有换行。

* subprocess32是为了适应centos 6上面的python2.6.6

使用说明:

1,脚本dial_log_server.py放置在bin目录,同时建立同级目录:conf和logs。

2,bin目录中增加启停脚本:

shutdown.sh

#!/bin/sh

APP_MAIN=dial_log_server.py
PID=0

getPID(){
    pythonps=`ps aux | grep $APP_MAIN | grep -v grep`
    if [ -n "$pythonps" ]; then
        PID=`echo $pythonps | awk '{print $2}'`
    else
        PID=0
    fi
}

shutdown(){
    getPID
    echo "================================================================================================================"
    if [ $PID -ne 0 ]; then
        echo -n "Stopping $APP_MAIN(PID=$PID)..."
        kill -9 $PID
        if [ $? -eq 0 ]; then
            echo "[Success]"
            echo "================================================================================================================"
        else
            echo "[Failed]"
            echo "================================================================================================================"
        fi
        getPID
        if [ $PID -ne 0 ]; then
            shutdown
        fi
    else
        echo "$APP_MAIN is not running"
        echo "================================================================================================================"
    fi
}

shutdown
exit 0

startup.sh

#!/bin/sh

APP_MAIN=dial_log_server.py
APP_LOG=logs
PID=0

getPID(){
    pythonps=`ps aux | grep $APP_MAIN | grep -v grep`
    if [ -n "$pythonps" ]; then
        PID=`echo $pythonps | awk '{print $2}'`
    else
        PID=0
    fi
}


startup(){
    getPID
    echo "================================================================================================================"
    if [ $PID -ne 0 ]; then
        echo "$APP_MAIN already started(PID=$PID)"
        echo "================================================================================================================"
    else
        echo -n "Starting $APP_MAIN"
         if [ ! -d "../$APP_LOG" ]; then
            mkdir "../$APP_LOG"
         fi
        nohup python $APP_MAIN > ../$APP_LOG/nohup.log 2>&1 &
        sleep 2
        getPID
        if [ $PID -ne 0 ]; then
            echo "(PID=$PID)...[Success]"
            echo "================================================================================================================"
        else
            echo "[Failed]"
            echo "================================================================================================================"
        fi
    fi
}

startup

3,conf目录生成配置文件:

Advertisement_Manage,ssh://root@172.17.100.19/srv/repos/Advertisement_Manage,refs/heads/master,http://172.17.100.18:8080/job/Advertisement_Web_New/build?token=123456
ads-ad-local,ssh://root@172.17.100.19/srv/repos/ads-ad,refs/heads/master,http://172.17.100.18:8080/job/ads-ad-local/build?token=123457
ads-ad-client-local,ssh://root@172.17.100.19/srv/repos/ads-ad,refs/heads/master,http://172.17.100.18:8080/job/ads-ad-client-local/build?token=123458

4,Jenkins对应项目"触发远程构建"的“身份验证令牌”。

5,后续规划:

* 基于ConfigParser的配置文件。

* 增加Jenkins无反应时重启。

* 其他辅助功能。


Jenkins动辄内存不足

修改/etc/sysconfig/jenkins,  设置如下或者更高的值:

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Xmx4096m -XX:MaxPermSize=2048m"

jenkins的系统配置中,全局属性,环境变量 MAVEN_OPTS

-Xmx4096m -XX:MaxPermSize=2048m

Maven项目配置,全局MAVEN_OPTS

-Xmx4096m -XX:MaxPermSize=2048m

/etc/profile

export JAVA_OPTS="-XX:MaxPermSize=2048m -Xms4096m -Xmx4096m"
export GRADLE_OPTS="-XX:MaxPermSize=2048m"
export SONAR_RUNNER_OPTS="-Xmx4096m -XX:MaxPermSize=2048m"

增加Findbugs静态分析

在pom.xml的build部分增加如下内容:

                                <plugin>
                                    <groupId>org.codehaus.mojo</groupId>
                                    <artifactId>findbugs-maven-plugin</artifactId>
                                    <version>3.0.1</version>
                                    <configuration>
                                        <findbugsXmlOutput>true</findbugsXmlOutput>
                                        <findbugsXmlWithMessages>true</findbugsXmlWithMessages>
                                        <xmlOutput>true</xmlOutput>
                                        <onlyAnalyze>nl.berg.packt.FindBugs_all.candles.*</onlyAnalyze>
                                        <effort>Max</effort>
                                   </configuration>
                                </plugin>

注意:

* Findbugs分析很消耗内存,需要配置好jvm参数。

* findbugsXmlOutput等标签全部要为小写,一些文档有坑,部分为大写,会有如下报错:

[ERROR] No plugin found for prefix 'findBugs' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (/var/lib/jenkins/.m2/repository), central (https://repo.maven.apache.org/maven2)] -> [Help 1]

* Jenkins的上面选中”Publish FindBugs analysis results“,编译参数增加:" findbugs:findbugs "

比如:

clean package findbugs:findbugs cobertura:cobertura -Denv=dev -Ddubbo.protocol.port=28999

Jenkins 基于Cobertura的代码覆盖率支持

在pom.xml的build部分增加如下内容:

                                <plugin>
                                        <groupId>org.codehaus.mojo</groupId>
                                        <artifactId>cobertura-maven-plugin</artifactId>
                                        <version>2.6</version>
                                        <configuration>
                                        <formats>
                                                <format>xml</format>
                                                <format>html</format>
                                        </formats>
                                        </configuration>
                                </plugin>

注意Jenkins不能在页面上展示覆盖率,需要下载html文件。比如:/var/lib/jenkins/workspace/ads-ad-local/ads-ad/target/site/cobertura目录。

展示结果还是挺漂亮的,比如:


© 著作权归作者所有

共有 人打赏支持
磁针石
粉丝 175
博文 72
码字总数 335388
作品 0
邵阳
QA/测试工程师
jenkins如何取消自动cleanup workspace

我的jenkins的工作目录被清理了,在系统日志中看到以下记录。 八月 24, 2017 11:36:12 上午 信息 hudson.model.AsyncPeriodicWork$1 run Started Workspace clean-up 八月 24, 2017 11:36:1...

s6820200 ⋅ 2017/08/28 ⋅ 1

【Jenkins系列】Jenkins服务器搭建指南-官方文档翻译整理

前言 相对其他软件的安装,Jenkins算是最简单的了,Jenkins安装一般有两种方式,一种独立安装,另一种就是将其部署到应用服务容器,比如Tomcat等,对于Jenkins的安装总结如下: 环境要求 官方...

PeterChen_ ⋅ 2017/10/02 ⋅ 0

Jenkins的部署方式

Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1、持续的软件版本发布/测试项目。 2、监控外部调用执行的工作。 jenkins是一个广泛用于持续构建的可视化web...

西索oO ⋅ 2016/10/09 ⋅ 0

【Jenkins系列】Jenkins详细介绍

软件概述 Jenkins是一个基于MIT License协议的开源软件项目,是基于Java开发的一种持续集成(CI)工具,用于监控持续重复的工作,它可以集成各种插件完成持续编译、部署、测试,并将Job运行结...

PeterChen_ ⋅ 2017/10/02 ⋅ 0

Jenkins实现生产环境部署文件的回滚操作(Windows)

由于dotnet项目的生产环境环境部署工具比较少,所以我使用jenkins作为生产环境的自动化部署工具。 既然有回滚操作,那么就会有部署操作;要实现回滚,先要实现部署的操作,我在jenkins搭建了...

easonjim ⋅ 2016/10/10 ⋅ 0

使用Jenkins自动编译部署web应用

初步接触持续集成自动化过程,本篇主要介绍基于Jenkins实现持续集成的方式,通过案例介绍线上自动编译及部署的配置过程持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工...

qianghong000 ⋅ 2017/10/31 ⋅ 0

Jenkins & Docker 持续集成实践

前言 持续集成(CI/CD)是一种软件开发实践。用于帮助团队成员频繁、快速的集成,测试他们的工作成果,以尽快发现集成错误。 更频繁、更早的集成意味着更早的发现问题。通过持续集成,及时发现...

English0523 ⋅ 2017/12/25 ⋅ 0

jenkins集群测试环境原理

Jenkins自动化构建成过程,可帮助我们节省大量时间,完成这个过程的自动化后,在以后的开发过程中,我们需要做的,就是只是提交代码到版本库中,构建自动完成,基本不再需要人工干预。 代码仓...

啊凯linux ⋅ 2017/08/14 ⋅ 0

自动化测试基本流程

综述: 依托Jenkins自动化平台管理,首先在用户提交代码(主要是master或者保护分支上的提交)时触发Jenkins构建,在Jenkins中使用SCM工具得到最新代码,然后build,使用SonarQube进行分析。...

紅紅火火 ⋅ 2016/03/23 ⋅ 0

Jenkins & Docker 持续集成实践

Jenkins & Docker 持续集成实践 运维生存时间 - 运维生存时间2017-12-109 阅读 jenkinsdockerLinux 发表评论 A+ 所属分类: Linux 前言 持续集成(CI/CD)是一种软件开发实践。用于帮助团队成员...

运维生存时间 - 运维生存时间 ⋅ 2017/12/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

内核线程、轻量级进程、用户线程

线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成...

117 ⋅ 23分钟前 ⋅ 0

elasticsearch2.4.6升级为elasticsearch-5.5.0的经历

将elasticsearch-5.5.0 中的配置 path.data 指向原来的数据路径 即 path.data: /usr/local/src/elasticsearch-2.4.6/data 注意: elasticsearch-5.5.0 需要将jdk版本升级到1.8...

晨猫 ⋅ 23分钟前 ⋅ 1

lvm讲解 磁盘故障小案例

1

oschina130111 ⋅ 27分钟前 ⋅ 0

那些提升开发人员工作效率的在线工具

本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的。 Hollis偏爱使用...

时刻在奔跑 ⋅ 40分钟前 ⋅ 0

restful风格 实现DELETE PUT请求 的web.xml的配置

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframe......

泉天下 ⋅ 45分钟前 ⋅ 0

Shell数组

Shell数组 Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数...

蜗牛奔跑 ⋅ 55分钟前 ⋅ 0

nmap为了开发方便 可以做简单的修改

因为nmap扫描是默认使用的是nse脚本,但是在开发的过程中需要修改后缀(主要是因为后缀为lua才能显示高亮,所以这里用一个取巧的办法) nse_main.lua文件中我们找到如下代码 local t, path = cn...

超级大黑猫 ⋅ 59分钟前 ⋅ 0

springmvc获取axios数据为null情况

场景:前端用了vue没有用ajax与后台通信,用了axios,但是在代码运行过程中发现axios传递到后台的值接受到数据为null。 问题原因:此处的问题在与axios返回给后台的数据为json类型的,后台接...

王子城 ⋅ 今天 ⋅ 0

hadoop技术入门学习之发行版选择

经常会看到这样的问题:零基础学习hadoop难不难?有的人回答说:零基础学习hadoop,没有想象的那么难,也没有想象的那么容易。看到这样的答案不免觉得有些尴尬,这个问题算是白问了,因为这个...

左手的倒影 ⋅ 今天 ⋅ 0

806. Number of Lines To Write String - LeetCode

Question 806. Number of Lines To Write String Solution 思路:注意一点,如果a长度为4,当前行已经用了98个单元,要另起一行。 Java实现: public int[] numberOfLines(int[] widths, Str...

yysue ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部