maven+jenkins 搭建自动化部署平台
jenkins 自动化部署
1、安装JDK
1.1、上传linux的JDK安装包到opt目录下,并解压
1.2、配置jdk环境变量vim /etc/profile 在尾部添加如下内容,添加完成后执行命令:source /etc/profile
# jdk环境变量
export JAVA_HOME=/opt/jdk1.8.0_102
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
1.3、依次输入java、javac、java -version,检查安装是否成功
2、linux安装maven
2.1、上传apache-maven-3.6.0-bin.tar.gz安装包到linux服务器opt目录下,并且解压
2.2、进入apache-maven-3.6.0/conf/目录下,修改settings.xml文件
2.3、配置maven环境变量vim /etc/profile 在尾部添加如下内容,添加完成后执行命令:source /etc/profile
# maven 环境变量
export MAVEN_HOME=/opt/apache-maven-3.6.0
export MAVEN_HOME
export PATH=$PATH:$MAVEN_HOME/bin
2.3、输入 mvn -version校验是否成功
3、安装Jenkins到linux服务器
3.1、下载Jenkins的安装包jenkins.war
3.2、上传Jenkins安装包到tomcat目录下,修改tomcat端口号并启动tomcat
3.3、打开浏览器访问ip:port/jenkins进行Jenkins安装
3.4、复制浏览器出现的路径,使用vim命令打开此文件获取安装秘钥,点击下一步,直接点击第一个自动安装,安装完成后输入管理员账号密码姓名以及邮箱信息
3.5、点击左边系统管理->插件管理->点击第二个页签可选插件->右上角过滤输入Loca->勾选Locale plugin和Localization: Chinese (Simplified)插件,选择下方第一个按钮直接安装,等待安装完成
3.6、点击系统管理->系统设置->Locale栏-> Default Language输入:zh_CN 勾选下方的Ignore browser preference and force this language to all users,确认无误后点击保存,至此Jenkins语言包安装成功
3.7、点击系统管理->插件管理->可选插件,搜索maven->安装Maven Integration插件
4、配置Jenkins的maven项目
4.1、全局工具配置--点击系统管理-全局工具配置
4.1.1、maven配置-默认 settings 提供和默认全局 settings 提供的下拉框都选择为文件系统中的setting文件-在下方输入maven的配置文件路径,例:/opt/apache-maven-3.6.0/conf/settings.xml
4.1.2、jdk-点击jdk安装-去掉自动安装的勾选-别名输入jdk1.8-java_home输入jdk的根目录
4.1.3、maven-点击安装maven-去掉自动安装的勾选-name输入maven,maven_home输入/opt/apache-maven-3.6.0
4.1.4、以上三项确认无误,点击save保存
4.2、点击新建任务-输入项目名称-选择构建一个maven项目-点击确定
4.3、在源码管理选择使用git还是SVN,我们使用svn则选择subversion,Repository URL选项输入源码的根目录,Credentials选择后面的钥匙按钮添加凭证,在天出矿输入个人svn的账号密码保存,然后在Credentials后面下拉列表选择刚才配置的账号密码
4.3、下拉到Post Steps选项,选择Run only if build succeeds(构建完成之后),然后点击下拉列表选择执行shell,把下面附的shell脚本里面的内容复制到输入框中,修改shell脚本中:TOMCAT_APP_PATH变量的值为个人需要最终部署项目app的tomcat绝对路径(个人建议不要和Jenkins放在同一个tomcat中),APP_NAME变量的值更改为软件app的名称(也就是最终war包的名称除了后面的后缀,.war),修改完确认无误,然后点击保存
4.4、点击最左上角的Jenkins返回首页,然后选择刚才新建的项目点击项目名称进入工作空间,点击左边立即构建,在下方Build History表格中可以看到构建版本,点击当前正在构建的版本,点击左方控制台输出,查看构建详细日志,等待构建完成
4.5、等待构建完成后,输入部署的项目的访问地址进行访问验证是否部署成功
附:
#!/usr/bin/env bash
#编译+部署项目站点
# 配置此选项防止tomcat被自动杀死
BUILD_ID=DONTKILLME
#需要配置如下参数
# 项目路径, 在Execute Shell中配置项目路径, pwd 就可以获得该项目路径
export PROJ_PATH=/root/.jenkins/workspace/app_name/
# 输入你的环境上tomcat的全路径
export TOMCAT_APP_PATH=/opt/apache-tomcat-8.0.53
# 项目名称
export APP_NAME=app_name
# tomcat启动等待时间,参数需要比实际启动时间大
export WAIT_TIME=60s
### base 函数
killTomcat()
{
PID=`ps -ef |grep $TOMCAT_APP_PATH |grep -v grep | awk '{print $2}'`
if [ ! "$PID" ];then # 这里判断TOMCAT进程是否存在
echo "进程不存在"
else
echo "进程存在 杀死进程PID$PID"
kill -9 $PID
killTomcat
fi
#上面注释的或者下面的
# cd $TOMCAT_APP_PATH/bin
# sh shutdown.sh
}
echo "---------------自动化部署脚本开始执行---------------"
cd $PROJ_PATH/
mvn clean install
# 停tomcat
echo "正在停止tomcat..."
killTomcat
# 获取当前时间,为备份war文件做准备
current=`date "+%Y-%m-%d %H:%M:%S"`
# 格式化为时间戳
timeStamp=`date -d "$current" +%s`
# 进行原项目文件的备份
echo "进行原项目文件的备份为"$APP_NAME.$timeStamp.tar.gz
cd $TOMCAT_APP_PATH/webapps/
tar -czf $APP_NAME.$timeStamp.tar.gz $APP_NAME
#备份完成后删除原项目目录
echo "备份成功,删除原项目目录"
rm -rf $TOMCAT_APP_PATH/webapps/$APP_NAME
# 复制新的工程到tomcat上
echo "复制新war包到tomcat的webapps目录下,并启动tomcat以加压war包..."
cp $PROJ_PATH/target/$APP_NAME.war $TOMCAT_APP_PATH/webapps/
# 启动Tomcat
cd $TOMCAT_APP_PATH/
sh bin/startup.sh
echo "tomcat正在启动中..."$WAIT_TIME"后自动停止tomcat并备份war包"
#let 后面接运算符表达式,不加引号应该也可以
sleep $WAIT_TIME
# 停止Tomcat
cd $TOMCAT_APP_PATH/
killTomcat
echo "tomcat已停止,正在备份"$APP_NAME.war"为"$APP_NAME.war.$timeStamp.bak
# 备份项目war包
mv $TOMCAT_APP_PATH/webapps/$APP_NAME.war $TOMCAT_APP_PATH/webapps/$APP_NAME.war.$timeStamp.bak
# 备份后重新启动Tomcat
cd $TOMCAT_APP_PATH/
sh bin/startup.sh &
echo "tomcat正在启动中..."$WAIT_TIME"后自动完成"
sleep $WAIT_TIME
PID_STAT=`ps -ef |grep $TOMCAT_APP_PATH |grep -v grep | awk '{print $2}'`
if [ ! "$PID_STAT" ];then # 这里判断TOMCAT进程是否存在
echo "tomcat启动失败"
echo "---------------自动化部署脚本执行完成,但tomcat启动失败,请联系管理员核查原因---------------"
else
echo "tomcat启动成功"
echo "---------------自动化部署脚本执行完成---------------"
fi
附maven settings.xml配置文件内容
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<!--
| This is the configuration file for Maven. It can be specified at two levels:
|
| 1. User Level. This settings.xml file provides configuration for a single user,
| and is normally provided in ${user.home}/.m2/settings.xml.
|
| NOTE: This location can be overridden with the CLI option:
|
| -s /path/to/user/settings.xml
|
| 2. Global Level. This settings.xml file provides configuration for all Maven
| users on a machine (assuming they're all using the same Maven
| installation). It's normally provided in
| ${maven.conf}/settings.xml.
|
| NOTE: This location can be overridden with the CLI option:
|
| -gs /path/to/global/settings.xml
|
| The sections in this sample file are intended to give you a running start at
| getting the most out of your Maven installation. Where appropriate, the default
| values (values used when the setting is not specified) are provided.
|
|-->
<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">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>/opt/apache-maven-3.6.0/repository</localRepository>
<!-- interactiveMode
| This will determine whether maven prompts you when it needs input. If set to false,
| maven will use a sensible default value, perhaps based on some other setting, for
| the parameter in question.
|
| Default: true
<interactiveMode>true</interactiveMode>
-->
<!-- offline
| Determines whether maven should attempt to connect to the network when executing a build.
| This will have an effect on artifact downloads, artifact deployment, and others.
|
| Default: false
<offline>false</offline>
-->
<!-- pluginGroups
| This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.
| when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers
| "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.
|-->
<pluginGroups>
<!-- pluginGroup
| Specifies a further group identifier to use for plugin lookup.
<pluginGroup>com.your.plugins</pluginGroup>
-->
</pluginGroups>
<proxies>
<!-- proxies
| This is a list of proxies which can be used on this machine to connect to the network.
| Unless otherwise specified (by system property or command-line switch), the first proxy
| specification in this list marked as active will be used.
|-->
<!-- proxy
| Specification for one proxy, to be used in connecting to the network.
|
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
-->
</proxies>
<!-- servers
| This is a list of authentication profiles, keyed by the server-id used within the system.
| Authentication profiles can be used whenever maven must make a connection to a remote server.
|-->
<servers>
<!-- server
| Specifies the authentication information to use when connecting to a particular server, identified by
| a unique name within the system (referred to by the 'id' attribute below).
|
| NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are
| used together.
|
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>
-->
<!-- Another sample, using keys to authenticate.
<server>
<id>siteServer</id>
<privateKey>/path/to/private/key</privateKey>
<passphrase>optional; leave empty if not used.</passphrase>
</server>
-->
</servers>
<!-- mirrors
| This is a list of mirrors to be used in downloading artifacts from remote repositories.
|
| It works like this: a POM may declare a repository to use in resolving certain artifacts.
| However, this repository may have problems with heavy traffic at times, so people have mirrored
| it to several places.
|
| That repository definition will have a unique id, so we can create a mirror reference for that
| repository, to be used as an alternate download site. The mirror site will be the preferred
| server for that repository.
|-->
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<!-- nexus-aliyun 首选,放第一位,有不能下载的包,再去做其他镜像的选择 -->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<!-- 备选镜像,也是可以通过 url 去查找确定一下,
该镜像是否含有你想要的包,它比 spring-libs-milestone 快 -->
<mirror>
<id>central-repository</id>
<mirrorOf>*</mirrorOf>
<name>Central Repository</name>
<url>http://central.maven.org/maven2/</url>
</mirror>
</mirrors>
<!-- profiles
| This is a list of profiles which can be activated in a variety of ways, and which can modify
| the build process. Profiles provided in the settings.xml are intended to provide local machine-
| specific paths and repository locations which allow the build to work in the local environment.
|
| For example, if you have an integration testing plugin - like cactus - that needs to know where
| your Tomcat instance is installed, you can provide a variable here such that the variable is
| dereferenced during the build process to configure the cactus plugin.
|
| As noted above, profiles can be activated in a variety of ways. One way - the activeProfiles
| section of this document (settings.xml) - will be discussed later. Another way essentially
| relies on the detection of a system property, either matching a particular value for the property,
| or merely testing its existence. Profiles can also be activated by JDK version prefix, where a
| value of '1.4' might activate a profile when the build is executed on a JDK version of '1.4.2_07'.
| Finally, the list of active profiles can be specified directly from the command line.
|
| NOTE: For profiles defined in the settings.xml, you are restricted to specifying only artifact
| repositories, plugin repositories, and free-form properties to be used as configuration
| variables for plugins in the POM.
|
|-->
<profiles>
<!-- profile
| Specifies a set of introductions to the build process, to be activated using one or more of the
| mechanisms described above. For inheritance purposes, and to activate profiles via <activatedProfiles/>
| or the command line, profiles have to have an ID that is unique.
|
| An encouraged best practice for profile identification is to use a consistent naming convention
| for profiles, such as 'env-dev', 'env-test', 'env-production', 'user-jdcasey', 'user-brett', etc.
| This will make it more intuitive to understand what the set of introduced profiles is attempting
| to accomplish, particularly when you only have a list of profile id's for debug.
|
| This profile example uses the JDK version to trigger activation, and provides a JDK-specific repo.
<profile>
<id>jdk-1.4</id>
<activation>
<jdk>1.4</jdk>
</activation>
<repositories>
<repository>
<id>jdk14</id>
<name>Repository for JDK 1.4 builds</name>
<url>http://www.myhost.com/maven/jdk14</url>
<layout>default</layout>
<snapshotPolicy>always</snapshotPolicy>
</repository>
</repositories>
</profile>
-->
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
<!--
| Here is another profile, activated by the system property 'target-env' with a value of 'dev',
| which provides a specific path to the Tomcat instance. To use this, your plugin configuration
| might hypothetically look like:
|
| ...
| <plugin>
| <groupId>org.myco.myplugins</groupId>
| <artifactId>myplugin</artifactId>
|
| <configuration>
| <tomcatLocation>${tomcatPath}</tomcatLocation>
| </configuration>
| </plugin>
| ...
|
| NOTE: If you just wanted to inject this configuration whenever someone set 'target-env' to
| anything, you could just leave off the <value/> inside the activation-property.
|
<profile>
<id>env-dev</id>
<activation>
<property>
<name>target-env</name>
<value>dev</value>
</property>
</activation>
<properties>
<tomcatPath>/path/to/tomcat/instance</tomcatPath>
</properties>
</profile>
-->
</profiles>
<!-- activeProfiles
| List of profiles that are active for all builds.
|
<activeProfiles>
<activeProfile>alwaysActiveProfile</activeProfile>
<activeProfile>anotherAlwaysActiveProfile</activeProfile>
</activeProfiles>
-->
</settings>