什么是自动构建
介绍自动构建之前先来聊一聊什么是手动构建,姜同学作为一名开发人员我们写完代码之后会把代码提交到Git上,然后push到我们自己的远程仓库,比如gitlab。如果姜同学的工作只是写写代码,push结束之后你的一个阶段工作也就结束了,但是这时候最新的代码还仅仅是保留在了git上,没有以应用的形式展现出来,无法体现你的工作展现你的价值。so,以java代码为例姜同学还要使用最新的代码打个包,然后放到服务器上,停掉旧的应用,启动新的应用,假设一个集群有三个应用实例,滚动更新,上面的步骤姜同学还要在重复两遍。以上的整个步骤便是手动构建,那么什么是自动构建呢,就是让另外一个应用代替姜同学完成上面的步骤,当然写代码除外-_-。 代替姜同学便是Jenkins。
安装Jenkins
这里姜同学推荐war包的方式进行安装,我觉得这种方式更加灵活,升级或是迁移也比较方便。 官方下载链接:https://www.jenkins.io/zh/download/
如果点击下载没什么效果你就切到英文版就ok了。 最新版对jdk的要求一般都是最低11,所以我会选择其他支持jdk8的长期支持版本。 下载框起来的长期支持的最新版即可,如果你想下载其他版本就去点击箭头指向的以前的发行版。 以centos7为例开始安装。
代码语言:javascript复制mkdir -p /opt/jenkins
wget https://mirrors.jenkins.io/war-stable/2.346.1/jenkins.war -O /opt/jenkins/jenkins.war --no-check-certificate
shell
启动jenkins
启动之前先确保启动的机器上安装了JDK的环境,如果没有请先安装,如果不会并且你的系统是linux,直接把下边的命令放到脚本文件中,执行脚本一键安装jdk。
代码语言:javascript复制#!/bin/bash
#安装JDk
echo "检查jdk是否安装......."
java -version
if [ $? -eq 0 ]; then
echo "检查到JDK已安装!"
else
echo "安装JDK..."
mkdir /opt/jdk/
wget -P /opt/jdk/ https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
tar -zxvf /opt/jdk/jdk-8u202-linux-x64.tar.gz -C /opt/jdk/
sed -i '$aexport JAVA_HOME=/opt/jdk/jdk1.8.0_202' /etc/profile
sed -i '$aexport PATH=$PATH:$JAVA_HOME/bin' /etc/profile
source /etc/profile
java -version
if [ $? -eq 0 ]; then
echo "JDK...安装完成!"
else
echo "JDK...安装失败!"
exit 8
fi
fi
shell
启动jenkins
代码语言:javascript复制# 放日志滴
mkdir -p /var/log/jenkins/
# war包的缓存目录
mkdir -p /var/cache/jenkins/war
# 启动war包
nohup java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/opt/jenkins -jar /opt/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=9527 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20 >> jenkins.log &
shell
访问Jenkins
直接使用浏览器访问http://服务器IP:9527就OK了。如果你不喜欢9527这个端口就去上面的启动命令把9527端口换掉。
把密码复制出来解锁就好啦。
推荐插件
后续就进入到安装插件环节了,我不建议你选安装jenkins推荐的插件,因为有点多安装有点慢,这里姜同学推荐几个插件选择安装就ok了。不要把默认勾选的插件去掉。 Git Parameter, 后续的插件进入jenkins的插件管理安装。 Publish Over SSH
list git branch
注册服务器信息
publish Over SSH这个插件就是把文件传到服务器上并且还可以在服务器上执行命令的插件。
- 选择manage Jenkins
- Configure System
- 配置publish over ssh(进页面直接划到最下边)
然后新增服务器信息
配置Git的账号密码
进入凭据管理
保存全局凭据
创建一个流水线
创建一个Freestyle project类型的流水线。
配置构建选择分支
添加git地址
代码打包
这里我以java工程为例。
因为使用maven打包,所以记得在jenkins上安装maven环境,总之你要确保你这个打包命令可以再jenkins服务器上执行。 你要是没装maven,可以试试我的一键安装脚本。
代码语言:javascript复制#!/bin/bash
echo "检查maven是否安装......."
mvn -v
if [ $? -eq 0 ]; then
echo "检查到maven已安装!"
else
echo "安装maven环境..."
mkdir /opt/maven/
wget -P /opt/maven https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar -zxvf /opt/maven/apache-maven-3.6.3-bin.tar.gz -C /opt/maven/
sed -i '$aexport MAVEN_HOME=/opt/maven/apache-maven-3.6.3' /etc/profile
sed -i '$aexport PATH=$PATH:$MAVEN_HOME/bin' /etc/profile
source /etc/profile
rm -rf /opt/maven/apache-maven-3.6.3/conf/settings.xml
touch /opt/maven/apache-maven-3.6.3/conf/settings.xml
sudo cat >> /opt/maven/apache-maven-3.6.3/conf/settings.xml << EOF
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<servers>
</servers>
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profiles>
</profiles>
</settings>
EOF
/opt/maven/apache-maven-3.6.3/bin/mvn -v
if [ $? -eq 0 ]; then
echo "maven...安装完成!"
else
echo "maven环境...安装失败!"
exit 8
fi
fi
shell
发布应用
我这里以一台应用服务器为例,如果你想发布多台就增加多个构建步骤。
remote directory的前缀是ssh用户的家目录,例如root用户就是/root/server/dev/pins-platform-daily 附上run.sh的脚本
代码语言:javascript复制#!/bin/bash
APP_PORT=58088
LOG_FILE=server.log
RUN_MODE=dev
JVM_PARAM="-Xms128m -Xmx256m"
#--------------------------------------------------------------------------------
# 取最新的文件
FILE_NAME=$(ls -t *.jar | head -n 1)
# 删除旧文件
rm -f $(ls -rt *.jar | head -n -1)
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh run.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_running(){
pid=$(netstat -nlp |grep :$APP_PORT | awk '{print $7}' | awk -F"/" '{print $1}');
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_running
if [ $? -eq "0" ]; then
echo "${FILE_NAME} is already running. pid=${pid} ."
else
nohup java $JVM_PARAM -jar $FILE_NAME --spring.profiles.active=$RUN_MODE --server.port=$APP_PORT --spring.cloud.nacos.config.namespace=pins-service-dev --spring.cloud.nacos.discovery.register-enabled=true >> $LOG_FILE 2>&1 &
echo ""
echo " -------- ${FILE_NAME} start success --------"
#实时查看启动日志
tail -f $LOG_FILE | sed '/:: Spring Boot ::/Q'
fi
}
#停止方法
stop(){
is_running
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${FILE_NAME} is not running"
fi
}
#输出运行状态
status(){
is_running
if [ $? -eq "0" ]; then
echo "${FILE_NAME} is running. Pid is ${pid}"
else
echo "${FILE_NAME} is NOT running."
fi
}
#重启
restart(){
stop
sleep 3
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
shell
自动构建
选择想要构建的分支或标签自动构建就好啦。
Jenkins的升级或迁移
上面启动jenkins的时候有个JVM参数要格外的注意 -DJENKINS_HOME=/opt/jenkins 迁移就是迁移这个文件夹,在新服务器上下载新版本的war包继续使用上面的启动命令启动就好了。