Jenkins(运维自动化)

 Jenkins部署

Jeninsk部署及使用

基础环境

Centos7.3 x86_64
SVN
JDK1.8
MySQL 5.7.18
Jenkins 2.65 (https://jenkins.io/download/)
ANT 1.9.4 (http://archive.apache.org/dist/ant/binaries/)

下载

https://jenkins.io/download/

安装

yum部署

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
yum install jenkins -y

rpm部署

rpm -ivh https://pkg.jenkins.io/redhat/jenkins-2.65-1.1.noarch.rpm

#默认路径:/var/lib/jenkins/

war包部署

nohup java -jar jenkins.war --httpPort=8080 &

#默认路径:/root/.jenkins/

Jenkins基础配置

查看并修改密码

从/var/lib/jenkins/secrets/initialAdminPassword

安装推荐插件

如果你看到了offline报错,是因为jenkins会ping www.google.com,如果ping不通,就会报offline,在jenkins设置一个hosts,把google域名指向jenkins设备就解决了

配置环境变量

  • 些变量会在你编译项目时用到
  • Global Tool Configuration中进行设置
  • 增加JDK环境变量(将jdk等文件上传到服务器指定位置)
  • 增加ANT环境变量(同JDK)

增加插件

  • 安装svn插件(系统管理-->管理插件-->可用插件-->安装SVN Publisher plugin
  • 增加认证(Credentials-->System-->Global credentials-->Add Credentials-->输入SVN的用户名密码

新建项目

  • 新建-->构建一个自由软件风格的软件项目
  • 输入项目名称
  • 选择jdk版本
  • 配置源码管理(链接,认证)

注意Ignore externals,如果项目连接着别的项目代码,请取消选择

  • 配置构建,配置ANT,选择之前添加的版本
  • 保存后构建

build.xml请看附件

知识点

  • Use‘svn update’ as much as possible

第一次发布的时候,会把工作目录下的所有文件清空,然后check-out一份完整的项目到工作目录下;
以后更新的时候,不会判断已有文件是否在svn里存在。比如工作目录下的文件123在svn里不存在,那么更新的时候不会删除123。
不会判断工作目录下的文件是否被改动,只会判断svn是否有新版本需要更新。比如工作目录下的文件zzz.txt内容为zzz,svn上的zzz.txt内容为空,如果svn上zzz.txt没有新版本,则在更新的时候不会更新zzz.txt,也就是说如果手动修改了工作目录下的文件,如果此文件在svn上没有出现新版本,就不会更新。一旦svn上的zzz.txt有新版本后就会更新工作目录的zzz.txt,这时工作目录下会生成如下几个文件:zzz.txt、zzz.txt.mine、zzz.txt.r223、zzz.txt.r224,其中zzz.txt.r223为svn上老版本、zzz.txt.r224为svn上新版本、zzz.txt.mine为工作目录上的zzz.txt的副本、zzz.txt记录了文件变化。
svn上删除了文件,更新的时候,工作目录里的此文件也会被删除。但是如上例中的zzz.txt手动修改过,已经和svn上的不一样了,这时将不会被删除。

  • Alwayscheck out a fresh copy

第一次发布的时候,会把工作目录下的所有文件清空,然后check-out一份完整的项目到工作目录下;
每一次更新的时候,都会先清除工作目录下的所有文件,然后重新check-out一份完整的项目到工作目录下。

  • Emulateclean checkout by first deleting unversioned/ignored files,then ‘svn update’

第一次发布的时候,会把工作目录下的所有文件清空,然后check-out一份完整的项目到工作目录下;
以后更新的时候会判断工作目录下的文件是否在svn里存在,如果不存在则删除,如果存在且有新版本则更新。
会判断工作目录下的文件是否被改动,不管有没有新版本,都会还原为svn上的最新版本。
svn上删除了文件,更新的时候,工作目录里的此文件也会被删除。

  • Use‘svn update’ as much as possible,with ‘svn revert’ before update

第一次发布的时候,会把工作目录下的所有文件清空,然后check-out一份完整的项目到工作目录下;
以后更新的时候不会判断工作目录下的文件是否在svn里存在。
会判断工作目录下的文件是否被改动,不管有没有新版本,都会还原为svn上的最新版本。
svn上删除了文件,更新的时候,工作目录里的此文件也会被删除。

  • 该内容引用自http://zhangxingnan.blog.51cto.com/3241217/1427000/
  • 感谢《zhangxingnan》

遇到的问题

svn引用外部项目,导致文件下载不完整

在配置项目时,去掉“Ignore externals”的勾选,即可将svn上引用的外部项目也一并checkout。在配置项目时,去掉“Ignore externals”的勾选,即可将svn上引用的外部项目也一并checkout。详见http://blog.csdn.net/wudj810818/article/details/51076353
感谢《5后's Blog》

Jenkins构建项目时,JAVA_HOME is not defined correctly

在系统配置,Global Tool Configuration中创建JAVA_HOME变量,重新构建。
该变量用于编译项目,和系统中的JDK1.8没有关系。

附件

配置Build.xml文件

<?xml version="1.0" encoding="UTF-8"?>  
<project name="ding_code" default="war" basedir=".">  
    <property environment="env" />  
    <property name="webapp.name" value="ding_code" />  
    <property name="catalina.home" value="/app/tomcat-7.0.77" />  
    <property name="dist.dir" value="/data/ding_build_file/ding_code" />  
    <property name="ant.dir" value="/app/apache-ant-1.9.4" />  
    <property name="webRoot.dir" value="${basedir}/WebRoot" />  
    <property name="src.dir" value="${basedir}/src" />  
    <property name="config.dir" value="${basedir}/produce_configure" />  
    <property name="lib.dir" value="${webRoot.dir}/WEB-INF/lib" />  
    <property name="build.dir" value="${basedir}/build" />  
    <!-- 使用eclipse jdt进行编译,而不使用JDK编译  -->  
    <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter" />   
  
    <!-- 初始化classpath -->  
    <path id="project.classpath">  
        <fileset dir="${lib.dir}">  
            <include name="**/*.jar" />  
        </fileset>  
        <!-- 添加tomcat类路径 -->  
        <fileset dir="${catalina.home}/lib">  
            <include name="*.jar" />  
        </fileset>  
        <!-- ant lib包  -->  
        <fileset dir="${ant.dir}">  
            <include name="**/*.jar" />  
        </fileset>  
    </path>  
  
    <!-- get the source compile classpath in a printable form -->  
    <pathconvert pathsep="${line.separator}|   |-- "  
             property="echo.path.compile"  
             refid="project.classpath">  
    </pathconvert>  
      
    <!-- show classpath jars -->  
    <target name="print_classpath">  
        <echo message="|-- compile classpath"/>  
        <echo message="|   |"/>  
        <echo message="|   |-- ${echo.path.compile}"/>  
    </target>  
      
      
    <!-- 删除之前的目录结构 -->  
    <target name="clear" description="清理旧文件">  
        <delete dir="${build.dir}" />  
        <delete dir="${dist.dir}" />  
        <delete file="${catalina.home}/webapps/${webapp.name}.war" />  
        <delete dir="${catalina.home}/webapps/${webapp.name}" />  
    </target>  
  
    <!-- 创建目录结构 -->  
    <target name="init" depends="clear" description="创建初始化目录结构">  
        <mkdir dir="${build.dir}/classes" />  
        <mkdir dir="${dist.dir}" />  
    </target>  
  
    <!-- 编译java -->  
    <target name="compile" depends="init" description="编译java文件">  
        <echo message="begin compile..." />  
        <javac srcdir="${src.dir}" destdir="${build.dir}/classes"   
            includeantruntime="false" nowarn="on"   
            source="1.6" target="1.6" deprecation="true" debug="true"   
            encoding="UTF-8" classpathref="project.classpath"   
            >  
            <compilerarg line="-Xlint:unchecked" />  
            <!-- <classpath refid="project.classpath" /> -->  
        </javac>  
        <copy todir="${build.dir}/classes">  
            <fileset dir="${src.dir}">  
                <include name="**/*.xml" />  
                <include name="**/*.properties" />  
                <include name="**/*.sql" />
                <include name="**/*.txt" />
            </fileset>  
            <fileset dir="${config.dir}">  
                <include name="**/*.xml" />  
                <include name="**/*.properties" />  
                <include name="**/*.sql" />
                <include name="**/*.txt" />
            </fileset>  
        </copy>  
        <echo message="end compile..." />  
    </target>  
  
    <!-- 将class文件打成 jar包 -->  
    <!--    
        <target name="pack" depends="compile">   
            <jar jarfile="${build.dir}/${webapp.name}.jar">   
                <fileset dir="${build.dir}/classes">   
                    <include name="**/*.class"/>   
                </fileset>   
            </jar>   
        </target>   
    -->  
  
    <!-- 打成war包, 名称默认为 项目名 -->  
    <target name="war" depends="compile" description="将工程打成war包">  
        <echo message="begin war..." />  
        <war destfile="${dist.dir}/${webapp.name}.war" basedir="${webRoot.dir}"   
            webxml="${webRoot.dir}/WEB-INF/web.xml">  
            <lib dir="${lib.dir}" />  
            <classes dir="${build.dir}/classes" />  
            <fileset dir="${webRoot.dir}">  
                <include name="***.*" />  
            </fileset>  
        </war>  
        <echo message="end war..." />  
    </target>  
  
    <!-- copy war包 tomcat的deploy目录   
    <target name="deploy" depends="war" description="部署项目">  
        <echo message="begin deploy..." />  
        <copy file="${dist.dir}/${webapp.name}.war" todir="${catalina.home}/webapps" />  
        <echo message="end deploy..." />  
    </target>  
    -->
  
</project>

本文配置来源于http://blog.csdn.net/wangyajin333/article/details/47860577

 

 Jenkins集成Sonar

理论知识

SonarQube 与 Jenkins 简 介

SonarQube 是一个开源的代码质量分析平台,便于管理代码的质量,可检查出项目代码的漏洞和潜在的逻辑问题。同时,它提供了丰富的插件,支持多种语言的检测, 如 Java、Python、Groovy、C、C++等几十种编程语言的检测。它主要的核心价值体现在如下几个方面:

  • 检查代码是否遵循编程标准:如命名规范,编写的规范等。
  • 检查设计存在的潜在缺陷:SonarQube 通过插件 Findbugs、Checkstyle 等工具检测代码存在的缺陷。
  • 检测代码的重复代码量:SonarQube 可以展示项目中存在大量复制粘贴的代码。
  • 检测代码中注释的程度:源码注释过多或者太少都不好,影响程序的可读可理解性。
  • 检测代码中包、类之间的关系:分析类之间的关系是否合理,复杂度情况。

** SonarQube 平台是由4个部分组成:**

  • SonarQube Server
  • SonarQube Database
  • SonarQube Plugins
  • SonarQube Scanner

参考https://www.ibm.com/developerworks/cn/devops/1612_qusm_jenkins/index.html 感谢《IBM的曲世明和陈计云》

SonarQube Scanner原理

SonarQube Scanner,作为代码扫描的工具,通过它,将项目的代码读取并发送至SonarQube服务器中,才能让SonarQube进行代码分析。
可以认为SonarQube Scanner就是SonarQube的客户端。SonarQube Scanner很方便和不同类型的构建工具进行整合

参考http://aoyouzi.iteye.com/blog/2294992 感谢《aoyouzi》

功能介绍(个人理解)

  • Jenkins
  • SonarQube Server(接收代码,进行分析)
  • SonarQube Scanner for Jenkins(Jenkins用来调用SonarQube Scanner的插件)
  • SonarQube Scanner(SonarQube的客户端,将读取的代码发送到SonarQube Server)

SonarQube Server服务部署

下载SonarQube Server(5.6.6版本)

https://www.SonarQube.org/downloads/

安装SonarQube Server

  1. 部署Centos 7.3 x86_64
  2. 部署JDK1.8(略)
  3. 部署MysQL5.7(略)
  4. 创建MySQL用户
create user 'sonar'@'192.168.0.231' identified by 'sonar2017';
CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
grant all privileges on sonar.* to 'sonar'@'192.168.0.231';
  1. 安装SonarQube(以前叫sonar)上传sonar到/opt目录下
unzip SonarQube-5.6.6.zip
mv SonarQube-5.6.6 /app/
ln -s SonarQube-5.6.6 SonarQube

5.编辑配置文件(/app/SonarQube/conf/sonar.properties)

#grep -vE '#|^.$' /app/SonarQube/conf/sonar.properties

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar2017
sonar.jdbc.url=jdbc:mysql://192.168.0.231:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
sonar.web.host=192.168.0.231
sonar.web.context=/sonar
sonar.web.port=9000
sonar.log.level=INFO
sonar.path.logs=logs

备注:sonar.web.context=/sonar 是访问地址后缀,配置后访问地址变为,http://192.168.0.231:9000/sonar

SonarQube Server汉化(注意:不同版本,汉化包不同)

SonarQube 5.6.6中文包地址
上传到/app/SonarQube/extensions/plugins

启动SonarQube

  • 启动
/app/SonarQube/bin/linux-x86-64/sonar.sh restart
  • 看日志
tail -f /app/SonarQube/logs/sonar.log
  • console模式
/app/SonarQube/bin/linux-x86-64/sonar.sh console

登录,并修改密码,创建token(后面jenkins要用)

  • 登录地址:http://192.168.0.231:9000/sonar 默认用户名密码admin/admin
  • 修改管理员密码
    login-->配置-->权限-->用户-->点击administraotr后面的锁图标
  • 创建一个用户ding
    login-->配置-->权限-->用户-->token-->update token-->Generate Tokens(输入ding)-->generate
    记录下token

参考文章:http://www.cnblogs.com/westfly/p/6098100.html 感谢《westfly》

Jenkins和SonarQube Server集成

安装SonarQube Scanner for Jenkins插件

系统管理-->管理插件-->SonarQube Scanner for Jenkins-->安装

配置SonarQube Server的连接

系统管理-->系统设置-->配置SonarQube servers

Environment variables 勾选


SonarQube installations 
    name:随便写
    Server URL:http://192.168.0.231:9000/sonar
    Server version:5.3 or higher
    注:5.1 or higher不支持token方式,如果写了数据库信息,在输出中会提示这个特性已被忽略,不建议使用。
    Server authentication token:你懂的。

配置项目构建过程中的选项,增加SonarQube Scanner

系统管理-->Global Tool Configuration
SonarQube Scanner for MSBuild(Microsoft 和 Visual Studio的生成系统,不配置)
SonarQube Scanner(我们配置这个)

name:随便填
自动安装:勾选
选择版本:最新(3.0.3.778)

项目中配置SonarQube Scanner参数(读哪的代码、什么语言等)

项目-->增加构建步骤-->Execute SonarQube Scanner
JDK:选jdk1.8(提前配置)
Analysis Properties:

sonar.language=java
sonar.sources=$WORKSPACE/
sonar.projectName=ding
sonar.projectKey=ding
sonar.projectVersion=1.0
sonar.sourceEncoding=UTF-8
sonar.language=java 
开发语言(匹配Server上的语言规则)

sonar.sources=$WORKSPACE/
RPM包安装后,位置是/var/lib/jenkins/workspace/
项目都会下载到这里

sonar.projectName=ding
项目名称,回去里面读src

sonar.projectKey=ding
唯一的项目Key,SonarQube Server上作为唯一标识,生成链接

sonar.projectVersion=1.0
版本:不太理解,强制要求

sonar.sourceEncoding=UTF-8
开发代码字符集

参考链接:https://docs.SonarQube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

故障处理

故障1:项目中配置SonarQube Scanner的Task to run为ding,就报这个错,去掉就可以了

13:53:22.236 ERROR: Error during SonarQube Scanner execution
Task 'ding' does not exist. Please use 'list' task to see all available tasks.
13:53:22.236 DEBUG: Execution getVersion
13:53:22.236 DEBUG: Execution stop
ERROR: SonarQube scanner exited with non-zero code: 1
Sending e-mails to: dinghe@ding.com
Finished: FAILURE

解决 去掉SonarQube Scanner的Task to run中的内容

故障2: E170001

报错

Caused by: org.tmatesoft.svn.core.SVNAuthenticationException: svn: E170001: Authentication required for '<http://192.168.0.250:80> VisualSVN Server'

解决: 登录SonarQube Server-->配置-->SCM-->设置为是(关闭SCM)

故障2:SonarQube安装完后出现SonarQube is under maintenance. Please check back later.

SonarQube在安装完后运行:192.168.0.235:9000出现如下提示
SonarQube is under maintenance. Please check back later.
Whilst waiting, you might want to check new plugins to extend the current functionality.
If you are an administrator and have no idea why this message is showing, you should read the upgrade guide
这个需要安装完后先运行http://192.168.0.235:9000/setup  更新下 SonarQube
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要精通 Ansible 项目,你可以按照以下步骤进行: 1. 了解项目要求:首先,你需要明确项目的自动化需求和目标。这可能涉及到配置管理、应用部署、监控和报警、日志管理等方面的任务。 2. 构建项目结构:创建一个合理的项目结构,包括剧本(playbook)、角色(role)、变量文件、清单文件等。这样可以更好地组织和管理你的 Ansible 代码。 3. 设计剧本:根据项目需求,设计剧本来实现自动化任务。考虑任务的顺序、条件和错误处理等方面,确保剧本可靠且易于维护。 4. 编写角色:将剧本拆分成多个角色,每个角色负责特定的功能模块。编写可复用的角色可以提高代码的可维护性和灵活性。 5. 管理变量:合理管理变量,使用合适的变量作用域(全局、主机、组)和管理机制(变量文件、动态清单等)。这样可以使代码更灵活和可配置。 6. 测试和调试:在开发过程中进行测试和调试,保剧本和角色的正确性和可靠性。使用 Ansible 提供的调试工具和日志功能来定位和解决问题。 7. 版本控制:使用版本控制系统(如 Git)来管理你的 Ansible 代码。这样可以方便地追踪和回滚代码的修改,并与团队成员进行协作。 8. 持续集成和部署:将 Ansible 与持续集成和部署工具(如 Jenkins、GitLab CI)集成,实现自动化的构建、测试和部署流程。 9. 文档和培训:编写清晰的文档,记录项目的设计和使用方法。同时,提供培训和支持,确保团队成员能够熟练使用 Ansible 进行自动化运维。 通过不断实践和经验积累,你可以逐步提高在 Ansible 项目中的技能和经验。希望这些信息对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值