文档章节

Jenkins工作相关

python测试开发人工智能安全
 python测试开发人工智能安全
发布于 2016/03/02 14:23
字数 1066
阅读 204
收藏 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目录。

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


© 著作权归作者所有

共有 人打赏支持
python测试开发人工智能安全
粉丝 185
博文 100
码字总数 386988
作品 0
邵阳
QA/测试工程师
私信 提问
jenkins如何取消自动cleanup workspace

我的jenkins的工作目录被清理了,在系统日志中看到以下记录。 可是没人执行过清理动作,我上网查到说jenkins每过30天会清理一次工作目录。文章链接如下 http://jenkins-ci.361315.n4.nabble...

s6820200
2017/08/28
283
1
CentOS6.5安装Jenkins

版权声明:本文为谙忆原创文章,转载请附上本文链接,谢谢。 https://blog.csdn.net/qq_26525215/article/details/82928097 文章目录 安装Java 安装Git 安装Jenkins 启动Jenkins 停止Jenkins...

谙忆
10/02
0
0
【Jenkins系列】Jenkins详细介绍

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

PeterChen_
2017/10/02
0
0
openshift/origin工作记录(9)——openshift结合jenkins实现持续集成

版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址:http://blog.csdn.net/huqigang,内容如有错误,欢迎留言指出,谢谢! https://blog.csdn.net/huqigang/article/details/7...

胡了了
04/16
0
0
【Jenkins系列】Jenkins服务器搭建指南-官方文档翻译整理

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

PeterChen_
2017/10/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rabbitmq学习

使用docker安装rabbit docker run -d --hostname my-rabbit --name rabbit -p 8080:15672 rabbitmq:management--hostname:指定容器主机名称--name:指定容器名称-p:将mq端口号映射到本地...

元谷
18分钟前
0
0
想知道谁是你的最佳用户?基于Redis实现排行榜周期榜与最近N期榜

本文由云+社区发表 前言 业务已基于Redis实现了一个高可用的排行榜服务,长期以来相安无事。有一天,产品说:我要一个按周排名的排行榜,以反映本周内用户的活跃情况。于是周榜(按周重置更新...

腾讯云加社区
20分钟前
1
0
函数计算性能福利篇(二) —— 业务冷启动优化

继前一篇《函数计算性能福利篇——系统冷启动优化》,我们再来看看近期函数计算推出的 Initializer 功能之后,带来的一波高能性能优化成果。 背景 函数计算是一个事件驱动的全托管 serverle...

阿里云官方博客
26分钟前
1
0
开源版本说明

1527
27分钟前
2
0
Mysql经验-------持续更新

单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。 说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

DoLo-lty
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部