jenkins部署[CentOS-7]超详细

Posted 小小本科生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jenkins部署[CentOS-7]超详细相关的知识,希望对你有一定的参考价值。

如果你还没有安装jenkins,请转到jenkins安装配置[CentOS-7]超详细;如果已经安装好了,那就开始我们第一个项目的部署吧。

一、安装插件

jenkins是一款持续集成和持续交付的软件,具有一键部署的优点,那么当我们点击构建之后,项目是怎么被发布到服务器的呢?方式有很多种,比如使用Deploy to container插件直接将打好的包发布到tomcat容器中,或者通过Publish Over SSH插件将打好的包通过SSH发布到服务器任意指定目录。

如果你读过上一篇jenkins安装配置[CentOS-7]超详细,安装插件应该很熟悉了,下面我们以Publish Over SSH这个插件为例讲解如何将项目发布到服务器。

二、配置发布服务器

插件安装好之后,我们就要配置项目发布的服务器地址了。

来到系统管理->系统配置->拉到最低端->点击add server填写服务器信息

Hostname:服务器地址,因为我的jenkins目录就在要发布的服务器上,所以填了127.0.0.1,如果你要将项目发布到其他服务器上需要填写该服务器的ip地址 

Remote Directory: 规定了将项目发布到服务器的那个目录下,注:如果此目录不存在并不会自动创建,所以一定要检查该目录的正确性

填写完成后点击高级,勾选Use password authentication, or use a different key,并填写服务器连接信息

 信息填写完毕后点击Test Configuration,如果出现Success则证明连接没有问题;否则请检查连接信息

三、新建任务

点击左侧新建任务,根据不同的需求选择不同的任务类型

我要部署的是一个maven项目,但是并没有发现maven任务,原来是我们上一节虽然在服务器上装了maven,也配置了maven路径但是并没有安装maven插件。

来到系统管理->插件管理->可选插件->搜索Maven进行安装

插件安装完成后不必重启jenkins再来到新建任务界面就能发现我们要新建的maven项目了,输入任务名称,选择构建一个maven项目,点击确定。

之后来到项目的具体配置页面,重点来了

四、填写项目构建配置(重中之重)

进来之后可以看到横向的10个选项卡,我们围绕这10个选项卡进行配置讲解

1.General选项卡

(1)描述随便填一填

(2)因为我要部署的项目在github中,所以我勾选GitHub项目,并填写我github中一个项目的地址;如果你使用SVN或其他代码管理工具,这里可以不理会。

2.Hubot选项卡

(1)勾选丢弃旧的构建

(2)保持构建的天数选择3天,保持构建的最大个数也选择3个,这里主要是防止以后部署的项目多了占据太多磁盘空间,设置因人而异。如果你打开高级选项卡还可以看到两个选项,目的和上面一样。

3.源码管理选项卡

(1)勾选Git,Repository URL填写github项目地址。可以看到下面提示:无法连接仓库,那是因为我填写的是一个私人仓库地址。

(2)点击下面的添加,在弹出层中填写你的github用户名和密码就能够找到仓库了。

添加好凭据之后继续填写我们的项目配置

(3)如果你的项目在一个公共仓库中则忽略第二条

(4)Branches to build,拉取github中的哪个分支中的代码,如果你的项目中只有一个分支则不会出现输入框

(5)源码浏览器:选择githubweb

(6)URL:代码仓库地址地址

 4.构建触发器选项卡

我们先用默认的,这个功能主要是为了方便。比如我们可以设置一旦github仓库发生变化后就自动构建,这样就不用每次构建都要到jenkins中点击构建了。

5.构建环境选项卡

 保持默认

6.Pre Steps选项卡

中也就是构建前需要执行什么动作,我们这里不设置

7.Build选项卡(重点)

 (1)采用pom方式进行构建

(2)在构建选项中输入如下命令,先clean一下再将项目重新打包,且构建时跳过测试

clean package  -DskipTests

如果你的项目是多模块的,则需要加-pl -am参数

clean package  -DskipTests -pl autobuild(模块名) -am

8.Post Steps选项卡(重点)

如果你看完此条还没懂,请看红字各种打包方式部署选读

(1)选择Run regardless of build result也就是默认的选项

(2)点击下面的add post-build step选择send file or execute commands over SSH(第一步安装的插件)

如果你没有这个选项证明你没有安装相关插件,到插件管理中去下载插件后再回来操作吧

(3)Name:第二步中设置的发布目标服务器名称

(4)Source files:源文件地址。

注意这个地址是相对于jenkins的workspace的相对地址,我没有修改jenkins的工作空间,那么他的地址是

/var/lib/jenkins/workspace       jenkins中构建的项目都在这里

我之前用jenkins构建项目源文件地址填写的都是"项目名/target/打出来的包名称",但是这次却一直无法将项目正常发布到指定目录,修改为"target/打出来的包名称"就成功了。所以如果你用其中一种方式失败的话,可以试一下另一种方式。

(5)Remove prefix:如果你发布一个源文件总不希望连带着它之前的目录都一同被发布吧,填写此项会移除要发布的包文件前面的目录,从而只发布我们需要的包文件

(6)Remote directory:发布的目标地址。我们第二步也设置了发布的目标地址,这个地址就是相对于第二步中设置的Remote directory的相对地址,如果你在第二步中已经填写到确切地址了,这里就不用填了。

(7)Execute command:发布成功后执行的脚本。

(各种打包方式部署选读)

注意,我在上面一直说的是打出来的包名称或包文件,并没有明确说明是什么类型的包文件。因为jenkins支持发布tar包、war包和jar包,下面我们仔细讲解一个各种打包方式的部署方法。

(i) jar包

我们知道springboot内置了tomcat容器,将springboot项目打成jar包后,扔到服务器中,直接运行java -jar xxx.jar就可以将此jar包运行起来。所以如果你在源文件中配置的是jar包,则Exce command中只填写java -jar xxx.jar就可以了。

结果:构建过程一直不结束(java -jar命令默认是执行在前台的,所以一直显示没有构建完成,其实看日志已经在等待用户访问了),或者结束后是不稳定的,且无法二次构建(之前构建的项目正在运行,端口已经被占用),但并不影响访问,即没有构建完成只要执行完java -jar项目就可以访问了。

发现我尝试再构建一次失败了,且日志中提示

jenkins日志中提示

 原因就是端口已经被我占用了,你还想再跑起来?

所以并不支持通过发布jar包部署项目

(ii)war包

我们知道只要tomcat在运行着,将war包扔到webapps下面就会自动被解压、运行,所以如果你配置的源文件是war包的话,Exce command什么都不用填。

我的服务器配置较差,如果启动tomcat后再执行jenkins构建老是报内存溢出,且服务器卡死,所以在这里就不演示了。

(iii)tar包

这种方式是灵活,同时也是最难掌握的。可以随时通过shell脚本控制项目的启动和停止,可以为tomcat设置内存及各种参数。

使用这种方式,首先要在maven中设置将项目打成tar包,即你在本地运行package命令打出来的就是tar包,将启动、停止脚本、配置文件和各种依赖jar即项目jar打到一起,这也不是一个简单的活。利用maven的一些插件可以完成,pom配置放在文章最后。

将tar包发布到指定目录后就要进行解压缩,启动等操作了。

source /etc/profile:其实没有什么特殊的意义,主要是不加这一行,老报奇怪的错误

cd /usr/local/tomcat/tomcat8/webapps:我要发布的项目目标地址(不一定非要在tomcat目录下,tomcat是否启动也没影响,因为springboot自带tomcat容器)

./autobuild/bin/stop.sh:这行主要是为了将之前正在运行的项目停止掉,防止端口号被前一个项目占用而导致部署失败。由于第一次部署只将autobuild.tar.gz发布到webapps下面了,所以这个执行文件是不存在的,如果是第一次构建请将这行删掉。 

rm -rf autobuild:同上一行,第一次构建不需要添加此条命令

tar -zxvf autobuild.tar.gz:将发不过来的tar包解压

./autobuild/bin/start.sh:启动项目

9.构建设置选项卡

默认

10.构建后操作选项卡

默认

五、构建项目

点击保存,来到项目页面.点击构建按钮进行构建,这样以后每次部署项目只需要点击一下就完成了打包,上传运行等一系列麻烦无用且重复的工作了。

 访问刚才发布的项目接口,成功访问。

 补充:

(1)构建失败也不要气馁,我第一次用jenkins部署项目研究了一周。并不是我故意写这么长篇大论,其实整个过程的坑还是挺多的,而且其他人的博客都是只言片语就马上构建成功了,很多细节并没有提到。

(2)一定要善用日志文件

 构建项目的数字后面鼠标放上去会有一个三角号,点击这个三角号出现下拉菜单,选择控制台输出就可以看构建日志了。

直接点击这个数字,点进入也可以看到控制台输出这个选项。

基本上只要构建失败就要到这个控制台输出中去看一看是进行到哪一步失败的,怎么失败的,像改BUG一样,这样才能解决问题。

此外jenkins还有一个总日志,在系统管理->系统日志->所有系统日志中

六、文中提到的资源

1.项目目录结构

2.pom.xml中指定的打包方式

<build>

        <resources>
            <resource>
                <directory>src/main/java</directory>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <targetPath>$basedir/target/classes</targetPath>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <targetPath>$basedir/target/resources</targetPath>
                <includes>
                    <include>spring/*.xml</include>
                    <include>*.yml</include>
                    <include>*.xml</include>
                    <include>*.properties</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.5</version>
                <configuration>
                    <!-- mybatis-generator的配置文件-->
                    <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <scope>runtime</scope>
                        <version>5.1.47</version>
                    </dependency>
                </dependencies>

            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                    <!-- 定义在prepare-package时将classes/com打jar -->
                    <execution>
                        <id>default-jar</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                        <configuration>
                            <excludes>
                                <!-- 将spring的配置,psoperties等属性文件,不要打包到jar中,而是打包到外层的tar.gz中 -->
                                <exclude>spring/*.xml</exclude>
                                <exclude>*.yml</exclude>
                                <exclude>*.xml</exclude>
                                <exclude>*.properties</exclude>
                            </excludes>
                            <archive>
                                <manifest>
                                    <addClasspath>true</addClasspath>
                                    <mainClass>com.bupt.autobuild.AutobuildApplication</mainClass>
                                </manifest>
                            </archive>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <!-- not append assembly id in release file name -->
                    <appendAssemblyId>false</appendAssemblyId>
                    <finalName>$project.artifactId</finalName>
                    <descriptors>
                        <descriptor>src/main/assemble/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <escapeString>\\</escapeString>
                </configuration>
            </plugin>
        </plugins>
    </build>

3.assembly.xml中指定的打包方式

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
    <id>package</id>
    <formats>
        <format>tar.gz</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>runtime/bin</directory>
            <outputDirectory>bin</outputDirectory>
            <fileMode>0750</fileMode>
        </fileSet>
        <fileSet>
            <directory>target/resources</directory>
            <outputDirectory>conf</outputDirectory>
            <!-- 将spring配置文件,properties配置文件,application.xml、logback.xml文件等,放到tar包中 -->
            <!-- 像mybaties、service等配置文件、以及class类文件,还是放到jar包中 -->
            <includes>
                <include>spring/**</include>
                <include>*.xml</include>
                <include>*.yml</include>
                <include>*.properties</include>
            </includes>
            <fileMode>0640</fileMode>
        </fileSet>
    </fileSets>
    <dependencySets>
        <dependencySet>
            <outputDirectory>lib</outputDirectory>
            <scope>runtime</scope>
            <excludes>
                <exclude>junit:*</exclude>
            </excludes>
        </dependencySet>
    </dependencySets>
</assembly>

4.shell启动脚本和停止脚本

不同的目录结构,不同的打包方式,不同的服务器配置都有影响,不能用不能乱用,参考一下就好。

(1)start.sh

#!/bin/bash
cd `dirname $0`
BIN_DIR=`pwd`
cd ..
DEPLOY_DIR=`pwd`
CONF_DIR=$DEPLOY_DIR/conf

SERVER_NAME=autobuild

if [ -z "$SERVER_NAME" ]; then
    SERVER_NAME=`hostname`
fi

APP_PID=`cat $BIN_DIR/profile.pid`
if [ -n "$APP_PID" ]; then
    echo "INFO: The $SERVER_NAME already started!"
    echo "PID: $APP_PID"
    exit 0
fi

LOGS_DIR=~/logs/$SERVER_NAME
if [ ! -d "$LOGS_DIR" ]; then
    mkdir -p "$LOGS_DIR"
fi
STDOUT_FILE=$LOGS_DIR/stdout.log

LIB_DIR=$DEPLOY_DIR/lib
LIB_JARS=`ls $LIB_DIR|grep .jar|awk 'print "'$LIB_DIR'/"$0'|tr "\\n" ":"`

JAVA_OPTS="-DappName=$SERVER_NAME -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Ddubbo.shutdown.hook=true "
JAVA_DEBUG_OPTS=""
if [ "$1" = "debug" ]; then
    JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
fi
JAVA_JMX_OPTS=""
if [ "$1" = "jmx" ]; then
    JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
fi
JAVA_MEM_OPTS=""
BITS=`java -version 2>&1 | grep -i 64-bit`
if [ -n "$BITS" ]; then
    JAVA_MEM_OPTS=" -server -Xmx512m -Xms512m -Xmn512m -XX:PermSize=128m -XX:MaxPermSize=256M -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
else
    JAVA_MEM_OPTS=" -server -Xms1g -Xmx1g -XX:PermSize=256m -XX:MaxPermSize=512M -XX:SurvivorRatio=2 -XX:+UseParallelGC "
fi

echo -e "Starting the $SERVER_NAME ..."
nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS $JAVA_PROPERTIES_OPTS -Dfile.encoding=UTF8 -classpath $CONF_DIR:$LIB_JARS org.springframework.boot.loader.JarLauncher > $STDOUT_FILE 2>&1 &
sleep 1
echo $! > $BIN_DIR/profile.pid
APP_PID=`cat $BIN_DIR/profile.pid`

if [ -z "$APP_PID" ]; then
    echo "START APP FAIL!"
    echo "STDOUT: $STDOUT_FILE"
    exit 1
fi

echo "$SERVER_NAME start success"

(2)stop.sh

#!/bin/bash
cd `dirname $0`
BIN_DIR=`pwd`
cd ..
DEPLOY_DIR=`pwd`
CONF_DIR=$DEPLOY_DIR/conf

SERVER_NAME=autobuild

if [ -z "$SERVER_NAME" ]; then
    SERVER_NAME=`hostname`
fi

PIDS=`cat $BIN_DIR/profile.pid`
if [ -z "$PIDS" ]; then
    echo "ERROR: The $SERVER_NAME does not started!"
    exit 1
fi

kill $PIDS
rm $BIN_DIR/profile.pid
echo "OK!"
echo "PID: $PIDS"

 

以上是关于jenkins部署[CentOS-7]超详细的主要内容,如果未能解决你的问题,请参考以下文章

jenkins安装配置[CentOS-7]超详细

jenkins安装配置[CentOS-7]超详细

Docker+jenkins+gitee+springboot实现自动化部署流程(详细教程)(附下载工具地址)

超详细的Jenkins自动化部署

前端项目自动化部署——超详细教程(JenkinsGithub Actions)

centos 7 jenkins 部署