一、相关概念
1.1 Jenkins概念:
Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台。这是一个免费的源代码,可以处理任何类型的构建或持续集成。集成Jenkins可以用于一些测试和部署技术。Jenkins是一种软件允许持续集成。
1.2 Jenkins目的:
1、持续、自动地构建/测试软件项目。
2、监控软件开放流程,快速问题定位及处理,提示开放效率。
1.3 特性:
开源的java语言开发持续集成工具,支持CI,CD。
易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理。
消息通知及测试报告:集成RSS/E-mail/通过RSS发布构建结果或当构建完成时通过e-mail通知,也可通过微信通知,生成JUnit/TestNG测试报告。
分布式构建:支持Jenkins能够让多台计算机一起构建/测试。
文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。
丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等。
1.4 产品发布流程:
产品设计成型 -> 开发人员开发代码 -> 测试人员测试功能 -> 运维人员发布上线
持续集成 (Continuous integration,简称CI)
持续交付(Continuous delivery)
持续部署(continuous deployment)
二、安装部署
2.1 yum安装
最低配置: 不少于256M内存,不低于1G磁盘,jdk版本>=8
安装jdk1.8
yum install -y java-1.8.0-openjdk &&
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo &&
rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key &&
yum clean all && yum makecache &&
yum install -y jenkins &&
systemctl start jenkins
less /var/log/jenkins/jenkins.log //查询admin密码
访问 http://ip:8080/ 进行安装
jenkins相关目录:
rpm -ql jenkins
#查看jenkins安装相关目录
安装目录/var/lib/jenkins
配置文件 /etc/sysconfig/jenkins
日志目录 /var/log/jenkins
2.2 下载war包安装
yum install -y java-1.8.0-openjdk && mkdir -p /usr/local/jenkins/ &&
wget -c -O /usr/local/jenkins/jenkins.war http://mirrors.jenkins.io/war-stable/latest/jenkins.war &&
nohup java -jar /usr/local/jenkins/jenkins.war &
查看:/root/.jenkins/secrets/initialAdminPassword
访问 http://ip:8080/ 进行安装
2.3 docker形式安装
yum install docker -y && systemctl start docker &&
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s && systemctl restart docker
docker search jenkins
docker pull docker.io/jenkins
docker run -d -p 8080:8080 docker.io/jenkins
docker exec -it 52873fa3dce4 /bin/bash
cat /var/jenkins_home/secrets
#查看密码
访问 http://ip:8080/ 进行安装
2.4 相关工具安装
工具安装可在jenkins的web界面系统管理—管理插件—可选插件勾选需要的,也可以手动安装。
a.git安装
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc-c++ perl-ExtUtils-MakeMaker wget autoconf -y
wget https://www.kernel.org/pub/software/scm/git/git-2.7.3.tar.gz
tar xf git-2.7.3.tar.gz
cd git-2.7.3
make configure
./configure --prefix=/usr/local/git
make profix=/usr/local/git
make install
echo "export PATH=$PATH:/usr/local/git/bin" > /etc/profile.d/git.sh
source /etc/profile.d/git.sh
b.maven安装
cd /usr/local/ && wget -c wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz &&
tar -zxf apache-maven-3.5.2-bin.tar.gz &&
echo "export PATH=$PATH:/usr/local/apache-maven-3.5.2/bin" > /etc/profile.d/maven.sh &&
source /etc/profile.d/maven.sh
mvn –version 查看版本
d.jdk安装
某些情况下会遇到openjdk无法编译java程序,或在编译中存在异常,需要我们手动安装jdk,首先去Oracle官网下载对应版本的jdk
tar -zxvf jdk-8u121-linux-x64.gz -C /usr/local &&
ln -sv /usr/local/jdk1.8.0_121 /usr/local/jdk1.8 &&
echo "export PATH=$PATH:/usr/local/jdk1.8/bin" >/etc/profile.d/java.sh
source /etc/profile.d/java.sh
三、WEB界面配置
3.1 密码破解
cd /var/lib/jenkins/users/admin #此为admin用户的目录,也可以对应自己创建的用户
vim config.xml //定位到<passwordHash>那一行
删除改行,改为
<passwordHash>#jbcrypt:$2a$10$pDQks0ytOkCfmpdgpLygrOC3uY7i/XnZHBKRQDhrBPwKoN2f5Kz8C</passwordHash>
重启一下jenkins
新密码为admin
3.2 maven配置
针对之前手动安装的maven需要在web界面配置进行结合。
系统管理—全局工具配置(Maven Configuration)配置:
此处为手动安装的maven,需要取消自动安装maven,name可以自定义,MAVEN_HOME指定下载安装的maven具体文件目录
3.3 GIT配置
手动安装的git,web界面只需添加具体可执行路径即可
3.4 jdk配置
对应手动安装的jdk,需要web配置java_home路径
3.5 邮件配置
jenkins有内置的邮件功能但由于其对于成功的发布不会发送邮件可定制化程度低,在此直接配置插件邮件(Editable Email Notification),2.32以上版本的jenkins,常用的插件都已经在最初部署的时候安装了(如果你当初选择的是suggest的plugins)。
可以使用qq邮件服务器或163等其他邮件服务器,在此配置使用163邮箱,首先需要开启163邮箱的smtp服务。
需要记录此处开启smtp时的密码。
在jenkins 系统管理—系统设置—Extended E-mail Notification
在默认的触发器 Default Triggers 标签下,可以勾选邮件通知触发的情况,如任何情况下均需要选择always,也可以在仅失败情况下发送,也可以对应的邮件接受人不通,进行邮件分类。
以下的内容,如邮件主题,内容均可自定义,可以参考url:
至此全局插件邮件已经配置完毕,需要在具体的项目中使用此邮件进行发送通知。
四、实战php程序自动发布
4.1 插件安装
系统管理—管理插件—已安装
检查是否有“Git plugin”和“Publish Over SSH”两个插件,如果没有,则需点击“可选插件”,找到它并安装
安装好两个插件后,点击“系统管理”– “系统设置”
4.2 SSH配置
系统管理—系统设置—Publish over SSH
在key内填写jenkins服务器的私钥,如果没有需要先在jenkins服务器生成私钥与公钥。ssh-keygen -t rsa
回车后会在登录用户的家目录下生成一个.ssh 的目录,此目录下存在id_rsa私钥与id_rsa.pub公钥。且讲公钥发布至代码发布的目标服务器上ssh-copy-id -i /root/.ssh/id_rsa.pub root@IP
。
SSH Server配置
name:需要将php程序发布到目标服务器的名称,可自定义
Hostname:填写目录服务器的IP地址
Username:使用那个用户进行发布,此处为进行密钥互信的用户
Remote Directory:此出为发布到目标服务器的相对根路径,建议填写/,防止后续填写路径异常。
注:如果为多台目标服务器,可以继续添加,如果目标服务器存在代理,也可设置proxy
4.3 构建项目
新建Item—填入项目名称—选择构建一个自由风格的软件项目—确定
源码管理选择git
Repository URL 填写具体git上的仓库url,如果为私有,需要继续添加Credentials,如果为公有直接填写url即可,Credentials为none,
构建后够操作
选择(Send files or execute commands over SSH)
SSH Server选择目标服务器如:php-server
Source files:/ #将git拉去下来的原始文件
Remote directory:/var/www/html #发布到目标服务器的制定目录
Exec command:chown apache:apache -R /var/www/html/* #制定后续的操作
此时可以选择Editable Email Notification来构建邮件通知。
在此处,之前的邮件主题,内容均可以自定义,在高级里面,选择邮件接受人。
点击保存,并立即构建,可以点击console output查看日志
此时打开php程序发现程序文件已经成功发布到目标服务器上
此时可以查看邮件也已经发送成功。
基本配置:
1、Linux安装配置jdk环境
1.1、上传到 Linux 服务器;例如:
上传至: cd /usr/local
1.2、解压:
rpm -ivh jdk-8u111-linux-x64.rpm
1.3、环境变量配置
cd /etc
在etc下,找到 profile文件,增加如下如下配置:
#set java environment
JAVA_HOME=/usr/java/jdk1.8.0_111
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
1.4 、配置生效
source /etc/profile
2、Linux安装配置maven环境
2.1、上传maven到 /usr/local 下
2.2、解压:
tar -zxvf apache-maven-3.3.9-bin.tar.gz
2.3、配置环境变量
进入etc目录下找到profile文件,增加如下环境变量配置:
#set maven environment
MAVEN_HOME=/usr/local/apache-maven-3.3.9
export MAVEN_HOME
export PATH=${PATH}:${MAVEN_HOME}/bin
2.4 、配置生效
source /etc/profile
2.5、查看配置是否成功
mvn -v
2.6、如果抛出权限不够,例如
-bash: /usr/local/apache-maven-3.3.9/bin/mvn: Permission denied
2.7、给maven授权
chmod a+x /usr/local/apache-maven-3.3.9/bin/mvn
3、Linux安装tomcat
3.1、上传至 /usr/local 目录下
3.2、解压
tar -zxvf apache-tomcat-7.0.75.tar.gz
3.3、修改tomcat端口号
找到 tomcat-->config-->server.xml
打开server.xml后修改【8005、8080、8009】其中8080为tomcat的端口号
第22行:8005
第71行:8080
第93行:8009
3.4、增加tomcat用户【用于jenkins部署发布用】
找到tomcat-->config-->tomcat-users.xml
打开后在<tomcat-users></tomcat-users>之间增加如下用户信息:
<role rolename="admin-gui"></role>
<role rolename="admin-script"></role>
<role rolename="manager-gui"></role>
<role rolename="manager-script"></role>
<role rolename="manager-jmx"></role>
<role rolename="manager-status"></role>
<user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-script,admin-gui"/>
4、Linux配置并启动 jenkins
4.1、上传jenkins.war到tomcat-->webapps下
4.2、进入tomcat-->bin目录下,使用Linux命令启动tomcat
./startup.sh
4.3、根据tomcat所在服务器ip地址和tomcat路径来访问jenkins项目
4.4、首次进入jenkins如要输入密码,密码位置:/root/.jenkins/secrets/initialAdminPassword
4.5、进入选择插件安装界面,选择第一个(Install suggested plugins)
4.6、插件安装完成之后,需要创建第一个用户,建议统一使用test或者admin
4.7、创建用户之后,就可以使用jenkins了
4.8、点击start using jenkins 进入jenkins
4.9、配置jenkins需要的maven、jdk路径
详情见截图:《1、全局环境配置.png》
4.10、配置安装插件
jenkins plugin
需要安装的插件:
•发布插件 Deploy to container Plugin 必须
•Maven插件 Maven Integration plugin必须
•git插件 Git plugin 这个根据实际情况,我用的是svn
•svn插件 Subversion Plug-in 这个jenkins自带已经安装过了,推荐安装时有显示
非必须安装插件:
•发送邮件插件 Email Extension Plugin
5、项目配置:【详情见截图:2、jenkins项目配置.png】
5.1、配置svn项目地址和用户名密码
repossitory url为svn地址,下面有一个add按钮,填写svn用户名密码后保存
然后下拉选择,刚才配置的那个用户
5.2、配置清理并选择maven
root pom 中填写:pom.xml
goals and options中填写:clean install
5.3、配置maven清理
点击“add post-build step”选择“invoke top-level maven targets”
maven version选择maven(该maven是全局环境变量时配置的)
goals 中填写:clean package
5.4、配置部署容器
点击“增加构建后操作步骤”选择 "deploy war/ear to a container"
由于maven项目的war包是在target下,故下target/项目名.war
content path为访问路径
5.5、配置tomcat
点击“and container”添加容器,选择tomcat
由于我的是tomcat7故选择tomcat7
manager user name:填写配置tomcat-user对应的用户名
manager password:填写配置tomcat-user对应的密码
tomcat url :填写配置tomcat-user这个tomcat对应的服务器地址和该tomcat的端口号
例如:http://ip:tomcat端口号
6构建时候可以自定义脚本java打包
构建中让Jenkins 执行api-git-pull.sh 内容 其内容为
#!/bin/bash
#export JAVA_HOME=/usr/local/jdk1.8.0_151
#export PATH=$JAVA_HOME/bin:$PATH
#export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
#export JAVA_HOME JAVA_BIN PATH CLASSPATH
#拉取api主分支代码
gitdir=$1 #引入的第一个参数 即上图中$gitdir
cd $gitdir
git checkout master
git pull origin master
#编译全部api maven打包java
/usr/local/maven/bin/mvn -Dmaven.test.skip=true clean install
发布Java包
export BUILD_ID=provder
cmd="/data/build-sh/onekey-install-api.sh"
sshpass -p $mima ssh -p $duankou -t ${lanip%/*} $cmd $package_name $apilist $duankou $jardir $mima
sshpass -p $mima ssh -p $duankou -t ${lanip##*/} $cmd $package_name $apilist $duankou $jardir $mima
在服务器上拉取代码脚本
#!/bin/bash
package_name=$1
apilist=$2
duankou=$3
jardir=$4
mima=$5
echo -e "
"
for i in $apilist;
do
#查询当前是否运行进程
oldID=$(ps -ef | grep "${i}.jar" | grep -v grep | awk '{print $2}')
echo -e "========================================================================="
echo "[info]判断当前正在运行的进程ID为:$i的进程号为$oldID"
echo -e "======="
echo $oldID | xargs kill -9
sleep 2
#备份文件并保留3天
if [ ! -d $package_name ]; then
echo "备份包日期不存在":$package_name
cd /data/backup
mkdir -p ${i}/${i}-$package_name
cp /home/${i}/${i}.jar /data/backup/${i}/${i}-$package_name/
#!/bin/bash
package_name=$1
apilist=$2
duankou=$3
jardir=$4
mima=$5
echo -e "
"
for i in $apilist;
do
#查询当前是否运行进程
oldID=$(ps -ef | grep "${i}.jar" | grep -v grep | awk '{print $2}')
echo -e "========================================================================="
echo "[info]判断当前正在运行的进程ID为:$i的进程号为$oldID"
echo -e "======="
echo $oldID | xargs kill -9
sleep 2
#备份文件并保留3天
if [ ! -d $package_name ]; then
echo "备份包日期不存在":$package_name
cd /data/backup
mkdir -p ${i}/${i}-$package_name
cp /home/${i}/${i}.jar /data/backup/${i}/${i}-$package_name/
#!/bin/bash
package_name=$1
apilist=$2
duankou=$3
jardir=$4
mima=$5
echo -e "
"
for i in $apilist;
do
#查询当前是否运行进程
oldID=$(ps -ef | grep "${i}.jar" | grep -v grep | awk '{print $2}')
echo -e "========================================================================="
echo "[info]判断当前正在运行的进程ID为:$i的进程号为$oldID"
echo -e "======="
echo $oldID | xargs kill -9
sleep 2
#备份文件并保留3天
if [ ! -d $package_name ]; then
echo "备份包日期不存在":$package_name
cd /data/backup
mkdir -p ${i}/${i}-$package_name
cp /home/${i}/${i}.jar /data/backup/${i}/${i}-$package_name/
fi
cd /data/backup/${i}/
backup=`ls -lt | find . -name "$i-*" | sort -r | head -n 3|xargs|sed "s/.///g"|xargs|sed "s/ /\\\|/g"`
echo "保留最近三个备份包:" "$backup"
echo "删除的备份包:"`ls | grep "$i-.*" | grep -v $backup`
cd /data/backup/${i}/
rm -rf `ls | grep "$i-.*" | grep -v $backup | xargs | sed "s/ / /g"`
rm -rf /home/$i/$i.jar
#复制jar
echo -e "======="
#ipaddr=`ifconfig -a|grep -o -e 'inet [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' |grep -v '127.0.0' |awk '{print $2}'`
ipaddr=`ifconfig eth0|sed -n '2p'|awk '{print $2}'`
sshpass -p $mima scp -P $duankou $jardir/$i/target/${i}.jar /home/$i/
echo "[info]复制${i}.jar到$ipaddr"
sleep 2
echo -e "[info]运行${i}.jar"
echo -e "========"
export JAVA_HOME=/usr/local/jdk1.8.0_151
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
cd /home/$i/
nohup java -server -Xms512m -Xmx512m -jar $i.jar --spring.profiles.active=online > /dev/null 2>&1 &
sleep 5
NEWID=$(ps -ef | grep "${i}.jar" | grep -v grep | awk '{print $2}')
if [[ $NEWID ]];then
echo "[info]当前运行的新进程ID为:$NEWID"
fi
echo -e "========"
echo "$i-$ipaddr部署完毕"
echo -e "=========================================================================
"
sleep 15
done