jenkins运行流程:

1、从SVN拉取代码到 jenkins 

2、运行maven命令clean install,将项目打 jar (war)包 

3、执行shell 脚本,启动项目

下图是我们的项目

两部分:红色是需要运行的项目、绿色是基础项目不需要运行(只需deploy到maven仓库即可)

jenkins下载:http://mirrors.jenkins.io/war-stable/

1、修改tomcat 字符编码

vi jenkins-tomcat/conf/server.xml

<Connector port="8088"  protocol="HTTP/1.1"   connectionTimeout="20000"   redirectPort="8443"  URIEncoding="UTF-8"/>

将下载的 jenkins.war 放到 tomcat,启动,插件默认安装即可

2、系统设置,配置jdk  maven

先同步下系统时间 

1.删除自带的 localtime

rm -rf /etc/localtime

2.创建软链接到 localtime

ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

yum install -y ntpdate

 ntpdate ntp1.aliyun.com

3、安装插件

安装完成重启jenkins  :  http://192.168.33.12:8088/jenkins/restart

4、新建项目

添加maven命令,也就是对源码进行打包,clean install -Dmaven.test.skip=true

5、构建项目

构建完的项目地址在  /root/.jenkins/workspace/xxxxx/target

6、编写shell脚本,启动构建好的jar

首先在系统设置里配置一下publish over ssh ,这里的地址就是我们即将部署的机器,因为jenkins很可能和部署的机器不是一台

注意 Remote Directory参数代表用户的根目录

保存,继续配置项目

选择我们刚才配置的机器,参数解释

Source files:jenkins打完包的地址,参考第5步,从target开始写

Remove prefix:前缀写target,标识从那个文件夹开始

Remote directory:要拷贝到的远程服务器,不需要写用户根目录(SSH Server账号里面配置了根目录),只需写后面的即可

Exec command:执行的脚本地址,就是启动项目脚本,内容如下

#!/bin/sh

## java env
export JAVA_HOME=/usr/local/java
export JRE_HOME=$JAVA_HOME/jre

## service name
APP_NAME=eureka
SERVICE_DIR=/usr/local/apps/$APP_NAME
SERVICE_NAME=com.jk.cloud.$APP_NAME-0.0.1-SNAPSHOT

JAR_NAME=$SERVICE_NAME\.jar
PID=$SERVICE_NAME\.pid

cd $SERVICE_DIR

case "$1" in

    start)
        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >log.out 2>&1 &
        echo $! > $SERVICE_DIR/$PID
        echo "=== start $SERVICE_NAME"
        sleep 10
        cat -fn3000 log.out
        ;;

    stop)
        kill `cat $SERVICE_DIR/$PID`
        rm -rf $SERVICE_DIR/$PID
        echo "=== stop $SERVICE_NAME"

        sleep 5
        P_ID=`ps -ef | grep -w "$SERVICE_NAME" | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "=== $SERVICE_NAME process not exists or stop success"
        else
            echo "=== $SERVICE_NAME process pid is:$P_ID"
            echo "=== begin kill $SERVICE_NAME process, pid is:$P_ID"
            kill -9 $P_ID
        fi
        ;;

    restart)
        $0 stop
        sleep 2
        $0 start
        echo "=== restart $SERVICE_NAME"
        ;;

    *)
        ## restart
        $0 stop
        sleep 2
        $0 start
        ;;
esac
exit 0

保存,再次构建,大功告成!!!

示例脚本:

echo "Stopping SpringBoot Application "
pid=`ps -ef | grep demo.jar | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
   kill -9 $pid
fi
rm -rf /opt/apps/demo*
cp -f /root/.jenkins/workspace/.../target/demo.jar /opt/apps/
cd /opt/apps
chmod 777 /opt/apps/demo.jar
BUILD_ID=DONTKILLME
 
nohup java -Xms256m -Xmx512m -jar demo.jar >demo.log 2>&1 &
echo "################ build success ###################"

或者:

#!/bin/sh
 
## java env
export JAVA_HOME=/usr/local/java
export JRE_HOME=$JAVA_HOME/jre

if [ "$1" == "" ];then
    echo "The jar name is empty."
    exit 1
else
    nohup java -Xms512m -Xmx512m -jar $1 > /dev/null 2>&1 &
fi

遇到的问题:

在基础项目打包的时候需要修改pom.xml的打包方式,打成普通jar即可

<!-- 打包发布 -->
	<distributionManagement>
		<repository>
			<id>nexus-releases</id><!--这个ID需要与你的release仓库的Repository ID一致 -->
			<url>http://10.90.189.109:8081/nexus/content/repositories/releases</url>
		</repository>
		<snapshotRepository>
			<id>nexus-snapshots</id><!--这个ID需要与你的snapshots仓库的Repository ID一致 -->
			<url>http://10.90.189.109:8081/nexus/content/repositories/snapshots</url>
		</snapshotRepository>
	</distributionManagement>
	
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-deploy-plugin</artifactId>
				<configuration>
					<uniqueVersion>false</uniqueVersion>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-eclipse-plugin</artifactId>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<failOnError>true</failOnError>
					<verbose>true</verbose>
					<fork>true</fork>
					<compilerArgument>-nowarn</compilerArgument>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-source-plugin</artifactId>
				<executions>
					<execution>
						<id>attach-sources</id>
						<goals>
							<goal>jar</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

而需要启动的springcloud项目,则使用springboot 自带的打包插件

<build>
	<resources>
	            <resource>
	                <directory>${basedir}/src/main/webapp</directory>
                    <!--注意此次必须要放在此目录下才能被访问到-->
	                <targetPath>META-INF/resources</targetPath> 
	                <includes>
	                    <include>**/**</include>
	                </includes>
	            </resource>
	            <resource>
	                <directory>${basedir}/src/main/resources</directory>
	                <includes>
	                    <include>**/**</include>
	                </includes>
	            </resource>
	    </resources>	
    <plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐