Jenkins介绍
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工做,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
html
安装部署Jenkins
https://jenkins.io/download/
我这里下载war包安装,版本:1.642.3 LTS .warjava
环境信息
主机名 | 操做系统版本 | IP地址 | 安装软件 |
---|---|---|---|
osb30 | Redhat 6.5 | 172.16.206.30 | jenkins |
新建Jenkins用户
[root@osb30 ~]# groupadd jenkins [root@osb30 ~]# useradd -g jenkins jenkins [root@osb30 ~]# id jenkins uid=501(jenkins) gid=501(jenkins) groups=501(jenkins) [root@osb30 ~]# echo "wisedu" | passwd --stdin jenkins &> /dev/null
Jenkins安装方式
安装jenkins有两种方式,tomcat方式部署和java部署启动。本次实验我以tomcat下部署启动为例。mysql
tomcat方式部署
1.首先安装tomcat和JAVA,配置环境变量(此步骤再也不讲述,java配置不可缺乏)
我这里安装的是jdk 1.8.0_65。linux
2.将从官网下载下来的jenkins.war文件放入tomcat下的webapps目录下,进入tomcat的/bin目录下,启动tomcat即启动jenkins。
我这里用的是tomcat8。git
3.启动jenkins时,会自动在webapps目录下创建jenkins目录,访问地址为:http://localhost:8080/jenkinsgithub
[jenkins@osb30 ~]$ tar zxf apache-tomcat-8.0.30.tar.gz [jenkins@osb30 ~]$ mv jenkins.war apache-tomcat-8.0.30/webapps/ [jenkins@osb30 ~]$ cd apache-tomcat-8.0.30 [jenkins@osb30 apache-tomcat-8.0.30]$ bin/startup.sh Jenkins home directory: /home/jenkins/.jenkins found at: $user.home/.jenkins
若是启动时报错:web
Caused by:java.awt.AWTError: Can't connect to X11 window server using ':0' as the value of the DISPLAY varible...
解决:sql
[jenkins@osb30 ~]$ cd apache-tomcat-8.0.30/bin/ [jenkins@osb30 bin]$ vim catalina.sh JAVA_OPTS="-Xms1024m -Xmx1024m -Djava.awt.headless=true"
4.访问jenkins
http://172.16.206.30:8080/jenkinschrome
java部署启动jenkins
切换到jenkins.war存放的目录,输入以下命令:docker
$ java -jar jenkins.war
能够修改启动端口
$ java -jar jenkins.war --httpPort=8000
而后在浏览器中(推荐用火狐、chrome)输入http://localhost:8080,localhost能够是本机的ip,也能够是计算机名。就能够打开jenkins;修改端口后,访问地址的端口需同步变动。
Jenkins受权和访问控制
默认地Jenkins不包含任何的安全检查,任何人能够修改Jenkins设置,job和启动build等。显然地在大规模的公司须要多个部门一块儿协调工做的时候,没有任何安全检查会带来不少的问题。 咱们能够经过下面的方式来加强Jenkins的安全:
访问jenkins:http://172.16.206.30:8080/jenkins,
点击系统管理—> Configure Global Security,点击”启用安全”,能够看到可使用多种方式来加强Jenkins的受权和访问控制:
如上图所示,默认是”任何用户能够作任何事情(没有任何限制)”。
咱们在”安全域”选择”Jenkins专有用户数据库”,”容许用户注册”;并先在“受权策略”点击“任何用户能够作任何事情(没有任何限制)”, 防止注册以后没法再管理jenkins。此时就能够刷新一下jenkins的页面看到右上角有登陆、注册的按钮。
注册管理员帐号
2.点击系统管理—> Configure Global Security,在“受权策略”选择”安全矩阵”,添加用户/组——添加admin帐户——为admin帐户添加全部权限,为匿名用户勾选你但愿对方了解的功能。
【注意】:匿名用户必定要开启此处的可读权限,若不开启,后面github或者bitbucket的webhook自动构建会没有权限。
而且勾选上该项,点击保存。
作完此部操做以后,便可用admin账号登陆,取消登陆用户能够作任何事的权限。
以上操做,便可完成jenkins的受权和访问控制。
Jenkins系统配置
登陆jenkins——系统管理——系统设置,为jenkins添加上须要的功能配置,有以下几个方面:
jdk版本
在jdk的选项,点击”新增JDK”,取消自动安装,输入jdk别名(名称随意),JAVA_HOME你们应该都很了解,在此处填写jenkins所在服务器安装的java程序的HOME位置便可,根据不一样操做系统填写不一样路径,如win7 D:\Java\jdk1.8 linux /usr/lib/jvm/jdk1.7.0_51。
设置完了请记得保存。
git/svn版本控制添加
根据使用的版本选择控制版本的应用程序的路径,如jdk配置便可。
【注意】:若是使用Git做为版本控制库,Jenkins默认状况下是没有安装Git的。咱们须要到插件管理界面中选中Git,而后点击直接安装。
点击系统管理—>管理插件—>可选插件,在右上角”过滤”处输入git进行搜索:
找到Git client plugin和Git plugin,在前面打上√,点击直接安装。
安装成功后,重启jenkins。
[jenkins@osb30 ~]$ cd apache-tomcat-8.0.30 [jenkins@osb30 apache-tomcat-8.0.30]$ bin/shutdown.sh [jenkins@osb30 apache-tomcat-8.0.30]$ bin/startup.sh ;tail -f logs/catalina.out
Jenkins添加maven配置
先判断jenkins所在主机是否安装了maven:
# mvn –version -bash: mvn: command not found
若是没有安装,请先安装maven。
CentOS 安装maven
[root@osb30 ~]# cd /usr/local/ [root@osb30 local]# wget http://apache.opencas.org/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz [root@osb30 local]# tar zxf apache-maven-3.3.9-bin.tar.gz [root@osb30 local]# ln -s apache-maven-3.3.9 maven [root@osb30 local]# vim /etc/profile # 添加以下配置: # Maven configuration. MAVEN_HOME=/usr/local/maven export PATH=$MAVEN_HOME/bin:$PATH [root@osb30 local]# source /etc/profile [root@osb30 local]# mvn -version Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00) Maven home: /usr/local/maven Java version: 1.8.0_65, vendor: Oracle Corporation Java home: /usr/java/jdk1.8.0_65/jre Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "2.6.32-431.el6.x86_64", arch: "amd64", family: "unix"
Jenkins配置maven
Jenkins构建maven风格的job
新建maven任务
登陆jenkins,点击新建。输入Item名称,选择“构建一个maven项目”,点击OK。
构建任务配置
源码管理配置
进入配置页面,找到”源码管理”。我这里是svn,输入项目所在版本库的地址。
构建触发器配置
在”源码管理”下面是”构建触发器”。
”构建触发器”是一个持续集成的触发器插件,能够根据已经完成构建的结果,触发新Job或者传递参数。默认的选项是Build whenever a SNAPSHOT dependency is built,意思是依赖于快照的构建,意思是依赖于快照的构建,当代码有更新时就构建项目。
Build periodically和Poll SCM能够设置定时自动构建。二者区别以下:
- Poll SCM:定时检查源码变动(根据SCM软件的版本号),若是有更新就checkout最新code下来,而后执行构建动做。
- Build periodically:定时进行项目构建(它不care源码是否发生变化)。
Maven构建设置
Pre Step
Pre Steps选项用来配置构建前的工做,这里不做更改。
配置Root POM和Goals and options
由于是Maven项目,因此Build选项有Root POM和Goals and options的设置。Root POM:填写你项目的pom.xml文件的位置,注意:是相对位置,若是该文件不存在,会有红色字提示。
好比我这里是:
Post Steps
在maven项目建立完成后,咱们还须要实现每次构建完成,将war发布到阿里云主机上,以实现自动发布。咱们经过添加shell实现自动发布。
找到Post steps下有个Execute shell:
【注意】:Jenkins在执行该shell脚本的时候是以jenkins这个用户身份去执行。某些场景下请注意环境变量PATH。
将构建完成后,所要采起的动做,shell脚本脚本内容以下:
#!/bin/bash # Stop tomcat. ssh root@114.55.29.246 '/usr/local/apache-tomcat-7.0.65/bin/shutdown.sh' &>/dev/null sleep 10 # Check the stop is successful or not. if ssh root@114.55.29.246 'ps -ef|grep tomcat |grep -v "grep"' &>/dev/null; then echo "Tomcat stop failed.Please check the problem." exit 5 fi # Backup previous version and delete the war in the path /usr/local/apache-tomcat-7.0.65/webapps/. ssh root@114.55.29.246 '/usr/bin/cp -f /usr/local/apache-tomcat-7.0.65/webapps/*.war /backups/*war' ssh root@114.55.29.246 'rm -rf /usr/local/apache-tomcat-7.0.65/webapps/*' # Copy the newest war to aliyun ECS. scp /home/jenkins/.jenkins/workspace/godseye/godseye-parent/godseye-container/target/godseye-container-aliyun.war root@114.55.29.246:/usr/local/apache-tomcat-7.0.65/webapps/godseye.war &>/dev/null # Start the tomcat. ssh root@114.55.29.246 '/usr/local/apache-tomcat-7.0.65/bin/startup.sh' &>/dev/null
配置阿里云主机信任内网的这台jenkins主机:
因为是war包在内网服务器上,发布的环境是在阿里云主机上,因此要配置主机互信,防止scp war包时还须要输入密码。我这里内网服务器ip是172.16.206.30,外网是114.55.29.246。
[jenkins@osb30 ~]$ ssh-keygen -t rsa -f .ssh/id_rsa [jenkins@osb30 ~]$ ssh-copy-id -i .ssh/id_rsa.pub root@114.55.29.246
Jenkins邮件通知设置
配置jenkins自带的邮件功能
3.找到邮件通知,输入SMTP服务器地址,点击高级,输入发件人账号和密码
4.勾选上”经过发送测试邮件测试配置”,而后输入收件人账号
此时咱们已经能够发送邮件了。在具体job配置处,找到”构建设置”,输入收件人信箱,可是你会发现只能在构建失败时发邮件。能够安装插件Email Extension Plugin来自定义。
安装使用插件Email Extension Plugin
1.安装插件Email Extension Plugin
该插件支持jenkins 1.5以上的版本。
在系统管理-插件管理-安装Email Extension Plugin。它可根据构建的结果,发送构建报告。该插件支持jenkins 1.5以上的版本。
【注意】:安装完若是使用Email Extension Plugin,就能够弃用自带的那个邮件功能了。
2.配置使用插件Email Extension Plugin
点击”系统配置”—>”系统设置”。
找到Extended E-mail Notification处,输入以下的配置:
构建通知:$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS! <hr/> (本邮件是程序自动下发的,请勿回复!)<br/><hr/> 项目名称:$PROJECT_NAME<br/><hr/> 构建编号:$BUILD_NUMBER<br/><hr/> svn版本号:${SVN_REVISION}<br/><hr/> 构建状态:$BUILD_STATUS<br/><hr/> 触发缘由:${CAUSE}<br/><hr/> 构建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console</a><br/><hr/> 构建地址:<a href="$BUILD_URL">$BUILD_URL</a><br/><hr/> 变动集:${JELLY_SCRIPT,template="html"}<br/><hr/>
点击下面的保存。
而后去job配置页面激活这个插件。找到须要发邮件的项目,点击进去。
点击配置,点击”增长构建后操做步骤”,选择Editable Email Notification。
附上构建日志,点击高级设置。
配置Triggers:
更详细的介绍:http://www.cnblogs.com/zz0412/p/jenkins_jj_01.html
sonar
官方文档:http://docs.sonarqube.org/display/SONARQUBE45/Documentation
sonar简介
Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质量。经过插件机制,Sonar 能够集成不一样的测试工具,代码分析工具,以及持续集成工具,好比pmd-cpd、checkstyle、findbugs、Jenkins。经过不一样的插件对这些结果进行再加工处理,经过量化的方式度量代码质量的变化,从而能够方便地对不一样规模和种类的工程进行代码质量管理。
与持续集成工具(例如 Hudson/Jenkins 等)不一样,Sonar 并非简单地把不一样的代码检查工具结果(例如 FindBugs,PMD 等)直接显示在 Web 页面上,而是经过不一样的插件对这些结果进行再加工处理,经过量化的方式度量代码质量的变化,从而能够方便地对不一样规模和种类的工程进行代码质量管理。
在对其余工具的支持方面,Sonar 不只提供了对 IDE 的支持,能够在 Eclipse 和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,能够很方便地在持续集成中使用 Sonar。
此外,Sonar 的插件还能够对 Java 之外的其余编程语言提供支持,对国际化以及报告文档化也有良好的支持。
环境要求
http://docs.sonarqube.org/display/SONAR/Requirements
新建用户
[root@osb30 ~]# groupadd sonar [root@osb30 ~]# useradd -g sonar sonar [root@osb30 ~]# id sonar uid=502(sonar) gid=502(sonar) groups=502(sonar) [root@osb30 ~]# echo "wisedu" | passwd --stdin sonar &> /dev/null
安装jdk
[sonar@osb30 ~]$ java -version java version "1.8.0_65" Java(TM) SE Runtime Environment (build 1.8.0_65-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
安装配置数据库
[root@osb30 ~]# mysql -uroot –p mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar'; mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'wisedu'; mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'wisedu'; mysql> FLUSH PRIVILEGES;
安装sonar
我这里用的版本是SonarQube 4.5.7 (LTS *),上传该软件到sonar用户的家目录下。
[sonar@osb30 ~]$ unzip -oq sonarqube-4.5.7.zip [sonar@osb30 ~]$ vim sonarqube-4.5.7/conf/sonar.properties
修改以下字段(就是配置数据库信息,其余不用动):
sonar.jdbc.username: sonar sonar.jdbc.password: wisedu sonar.jdbc.url: jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true # Optional properties sonar.jdbc.driverClassName: com.mysql.jdbc.Driver
启动sonar
Sonar默认集成了jetty容器,能够直接启动提供服务,也能够经过脚本构建为war包,部署在tomcat容器中。
Sonar默认的端口是”9000”、默认的上下文路径是”/”、默认的网络接口是”0.0.0.0”,默认的管理员账号和密码为:admin/admin,这些参数均可以在配置文件sonar.properties中修改。我这里修改下port,由于本机的9000端口被其余程序占用了。
[sonar@osb30 ~]$ vim sonarqube-4.5.7/conf/sonar.properties sonar.web.port=9003 [sonar@osb30 ~]$ sonarqube-4.5.7/bin/linux-x86-64/sonar.sh start
查看日志:
[sonar@osb30 ~]$ tail -f sonarqube-4.5.7/logs/sonar.log
关闭sonar
[sonar@osb30 ~]$ sonarqube-4.5.7/bin/linux-x86-64/sonar.sh stop
访问sonar
浏览器输入http://172.16.206.30:9003/
默认的管理员账号和密码为:admin/admin。
sonar插件
Sonar支持多种插件,插件的下载地址为:http://docs.codehaus.org/display/SONAR/Plugin+Library
将下载后的插件上传到${SONAR_HOME}extensions\plugins目录下,从新启动sonar。
sonar默认集成了Java Ecosystem插件,该插件是一组插件的合集:
- Java [sonar-java-plugin]:java源代码解析,计算指标等
- Squid [sonar-squid-java-plugin]:检查违反Sonar定义规则的代码
- Checkstyle [sonar-checkstyle-plugin]:使用CheckStyle检查违反统一代码编写风格的代码
- FindBugs [sonar-findbugs-plugin]:使用FindBugs检查违反规则的缺陷代码
- PMD [sonar-pmd-plugin]:使用pmd检查违反规则的代码
- Surefire [sonar-surefire-plugin]:使用Surefire执行单元测试
- Cobertura [sonar-cobertura-plugin]:使用Cobertura获取代码覆盖率
- JaCoCo [sonar-jacoco-plugin]:使用JaCOCO获取代码覆盖率
与jenkins集成
能够经过maven集成,也能够直接与jenkins集成。我这里选择直接与jenkins集成。
经过maven集成
修改maven的主配置文件(${MAVEN_HOME}/conf/settings.xml文件或者 ~/.m2/settings.xml文件),在其中增长访问Sonar数据库及Sonar服务地址,添加以下配置:
<profile> <id>sonar</id> <properties> <sonar.jdbc.url>jdbc:mysql://localhost:3306/sonar</sonar.jdbc.url> <sonar.jdbc.driver>com.mysql.jdbc.Driver</sonar.jdbc.driver> <sonar.jdbc.username>sonar</sonar.jdbc.username> <sonar.jdbc.password>sonar</sonar.jdbc.password> <sonar.host.url>http://localhost:9003</sonar.host.url> <!-- Sonar服务器访问地址 --> </properties> </profile> <activeProfiles> <activeProfile>sonar</activeProfile> </activeProfiles> ...
这部份内容具体可参照网上http://www.cnblogs.com/gao241/p/3190701.html
直接与Jenkins集成
在jenkins的插件管理中选择安装sonar jenkins plugin,该插件可使项目每次构建都调用sonar进行代码度量。
2.系统配置添加sonar的配置
进入系统配置页面对sonar插件进行配置,以下图:
而后点击下面的保存。
3.配置构建项目,增长Post Build Action
点击要构建的项目,在点击左侧的配置。
在页面的最下面找到”构建后操做”,选择SonarQube。
It is no longer recommended to use SonarQube maven builder. It is preferable to set up SonarQube in the build environment and use a standard Jenkins maven target.
【解决】:
http://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Jenkins
修改Build处:
常见问题
Jenkins构建完成后,sonar扫描代码报错:
解决:
卸载sonar的JavaScript插件。
Jenkins与Docker结合
我这里没有使用Docker Pipeline,直接在构建完成后,执行shell脚本,这样更灵活。
部署流程
1.研发push到svn代码库
2.Jenkins 构建,pull svn代码 使用maven进行编译打包
3.打包生成的代码,生成一个新版本的镜像,push到本地docker仓库harbor
4.发布,测试机器 pull 新版本的镜像,并删除原来的容器,从新运行新版本镜像。
环境说明
主机名 | 操做系统版本 | IP地址 | 用途 | 安装软件 |
---|---|---|---|---|
osb30 | Redhat 6.5 | 172.16.206.30 | svn代码库、Jenkins、Docker | jenkins、svn、Docker 1.7.1 |
spark32 | CentOS 7.0 | 172.16.206.32 | 本地docker仓库、业务部署测试环境 | harbor、Docker 17.06.1-ce |
配置
因为在Jenkins机器上docker是使用root用户运行的,而Jenkins是使用普通用户jenkins运行的,因此要先配置下jenkins用户可使用docker命令。
[root@osb30 ~]# visudo jenkins ALL=(root) NOPASSWD: /usr/bin/docker
另外在Jenkins机器上配置:
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear. # You have to run "ssh -t hostname sudo <cmd>". # #Defaults requiretty Defaults:jenkins !requiretty
若是不配置这个,在执行下面脚本时,会报错误:
+ cp -f /home/jenkins/.jenkins/workspace/godseyeBranchForNov/godseye-container/target/godseye-container-wisedu.war /home/jenkins/docker-file/godseye_war/godseye.war + sudo docker login -u jkzhao -p Wisedu123 -e 01115004@wisedu.com 172.16.206.32 sudo: sorry, you must have a tty to run sudo
在172.16.206.32机器上配置:
# visudo # #Defaults requiretty Defaults:root !requiretty
不然在机器172.16.206.32机器上执行脚本时会报错:
[SSH] executing... sudo: sorry, you must have a tty to run sudo docker: invalid reference format.
安装插件
登陆Jenkins,点击“系统管理”,点击“管理插件”,搜索插件“SSH plugin”,进行安装。
登陆Jenkins,点击“Credentials”,点击“Add domain”。
点击“系统管理”,“系统配置”,找到“SSH remote hosts”。
配置Post Steps
项目其余的配置不变,见上面的章节。
【注意】:脚本中用到的仓库和认证的帐号须要先在harbor新建好。
# Jenkins机器:编译完成后,build生成一个新版本的镜像,push到远程docker仓库 # Variables JENKINS_WAR_HOME='/home/jenkins/.jenkins/workspace/godseyeBranchForNov/godseye-container/target' DOCKERFILE_HOME='/home/jenkins/docker-file/godseye_war' HARBOR_IP='172.16.206.32' REPOSITORIES='godseye_war/godseye' HARBOR_USER='jkzhao' HARBOR_USER_PASSWD='Wisedu123' HARBOR_USER_EMAIL='01115004@wisedu.com' # Copy the newest war to docker-file directory. \cp -f ${JENKINS_WAR_HOME}/godseye-container-wisedu.war ${DOCKERFILE_HOME}/godseye.war # Delete image early version. sudo docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} -e ${HARBOR_USER_EMAIL} ${HARBOR_IP} IMAGE_ID=`sudo docker images | grep ${REPOSITORIES} | awk '{print $3}'` if [ -n "${IMAGE_ID}" ];then sudo docker rmi ${IMAGE_ID} fi # Build image. cd ${DOCKERFILE_HOME} TAG=`date +%Y%m%d-%H%M%S` sudo docker build -t ${HARBOR_IP}/${REPOSITORIES}:${TAG} . &>/dev/null # Push to the harbor registry. sudo docker push ${HARBOR_IP}/${REPOSITORIES}:${TAG} &>/dev/null
# 拉取镜像,发布 HARBOR_IP='172.16.206.32' REPOSITORIES='godseye_war/godseye' HARBOR_USER='jkzhao' HARBOR_USER_PASSWD='Wisedu123' # 登陆harbor #docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} ${HARBOR_IP} # Stop container, and delete the container. CONTAINER_ID=`docker ps | grep "godseye_web" | awk '{print $1}'` if [ -n "$CONTAINER_ID" ]; then docker stop $CONTAINER_ID docker rm $CONTAINER_ID else #若是容器启动时失败了,就须要docker ps -a才能找到那个容器 CONTAINER_ID=`docker ps -a | grep "godseye_web" | awk '{print $1}'` if [ -n "$CONTAINER_ID" ]; then # 若是是第一次在这台机器上拉取运行容器,那么docker ps -a也是找不到这个容器的 docker rm $CONTAINER_ID fi fi # Delete godseye_web image early version. IMAGE_ID=`sudo docker images | grep ${REPOSITORIES} | awk '{print $3}'` if [ -n "${IMAGE_ID}" ];then docker rmi ${IMAGE_ID} fi # Pull image. TAG=`curl -s http://${HARBOR_IP}/api/repositories/${REPOSITORIES}/tags | jq '.[-1]' | sed 's/\"//g'` #最后的sed是为了去掉tag先后的双引号 docker pull ${HARBOR_IP}/${REPOSITORIES}:${TAG} &>/dev/null # Run. docker run -d --name godseye_web -p 8080:8080 ${HARBOR_IP}/${REPOSITORIES}:${TAG}