source /etc/profile
在本地创建一个简单的springboot项目,例如helloworld项目,写一个简单的controller:
@RestController
public class HelloWorld {
@RequestMapping("/helloworld")
public String helloworld(){
return "hello";
}
}
下面的链接可以一直适用到jenkins的简单配置
安装docker参考链接
在docker安装完之后,使用docker pull jenkins的镜像。
下拉jenkins镜像
运行docker:
docker运行参考
docker run -di --name=jenkins -p 宿主机ip(可自定义):8080(容器中jenkins端口默认) -v 宿主机目录:/var/jenkins_home(容器目录) jenkins/jenkins:lts # docker启动Jenkins
docker run -itd -p 8080:8080 --name jenkins -u root --privileged=true -v /mydata/jenkins_docker/:/var/jenkins_home jenkins/jenkins:lts
可以参考安装第一个链接,直到通过jenkins部署,然后通过
clean install -Dmaven.test.skip=true
来进行打包。
拉去远程仓库的代码可以参考下面链接
jenkins添加拉取代码
可能遇到以下问题:
<dependency>
<groupId>***groupId>
<artifactId>*jar包名称*artifactId>
<version>1.0version>
<scope>systemscope>
<systemPath>${project.basedir}/src/main/resources/lib/**.jarsystemPath>
dependency>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<includeSystemScope>trueincludeSystemScope>
configuration>
plugin>
参考链接:非mavenjar包
2. 因为docker分为宿主机目录和容器目录,宿主机目录极为阿里云服务器,容器目录需要切换到docker相应容器中进行查看,下面提供两种不同角色的切换方式
docker ps # 通过ps查看容器ID,
sudo docker exec -it 容器id /bin/bash #切换到指定容器的目录
# 0 表示 root 用户
docker exec -u 0 -it id /bin/bash #切换到root用户
注意这个不同角色切换很重要!!!,在你成功打jar包后如果在指定容器中不能运行,而在root用户下能运行,那么就是权限问题。
3. 配置jenkins下拉gitee仓库
因为jenkins的默认用户为jenkins,需要切换到jenkins用户去执行ssh-keygen -t rsa
生成密钥对来配置gitee和jenkins
参考链接:jenkins下拉gitee仓库
如果上面两步,你已经成功通过jenkins打包jar包,并在容器目录中可以查看到相应的jar包,可以进行下面操作。
成功打jar包后,下面就是运行的问题,如果在容器中直接通过java -jar进行运行会存在权限问题,而且成功运行后,因为是在容器中运行,需要进行IP转化,才可以正确访问。
这里通过ssh将容器中打包好的jar包传输到宿主机指定目录。
exec command可以先不写,可以先部署下看是否可以将容器中的jar包传输到宿主机指定目录。
如果可以进行下面脚本的编写
#!/bin/bash
source /etc/profile
#查看之前运行的进程id
pid=`ps -ef | grep ymxSeller-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{print $2}'`
echo "部署前的pid进程 :$pid"
# 关闭已经启动的jar进程
if [ -n "$pid" ]
then
kill -9 $pid
else
echo "进程没有启动"
fi
sleep 5s
#copy jar 到启动目录
\cp -rf /home/workplace/maven-demo/ymxSeller-0.0.1-SNAPSHOT.jar /home/workplace/maven-demo/restartdir/ymxSeller-0.0.1-SNAPSHOT.jar
cd /home/workplace/maven-demo/restartdir
nohup /usr/java/jdk1.8.0_371/bin/java -jar /home/workplace/maven-demo/restartdir/ymxSeller-0.0.1-SNAPSHOT.jar > /home/workplace/maven-demo/restartdir/springboot.log 2>&1 &
echo "脚本执行完毕"
sleep 5s
pid=`ps -ef|grep ymxSeller-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{print $2}'`
# 检验进程是否启动
if [ -n "$pid" ]
then
echo "部署后的pid进程 :$pid"
echo "启动成功"
else
echo "进程没有启动"
fi
~
创建restart.sh并编写上面的脚本,大致意思就是查询该jar包是否正在运行,如果正在运行,kill掉该进程,然后重新运行新的jar包。可以自己查看日志
注意里面的jar包名称和路径。文件夹必须存在,日志文件可以自己生成。
1、建议将MAVEN_HOME、GIT_HOME、JAVA_HOME更新为docker中jenkins容器中的挂载目录,其目录可以在启动jenkins容器时进行指定:
路径:系统管理–>全局工具配置
2、Build step ‘Invoke top-level Maven targets’ marked build as failure
错误分为三种情况:
2.1 检查你的Maven指定目录是否正确,可以使用sudo docker exec -it 容器id /bin/bash 命令进入容器环境进行查看。
2.2 服务器内存不足,因为我部署的是springboot项目,会启动JAVA进程,而jenkins本身也会启动JAVA进程。可以使用ps -ef | grep java查看相应进程。这里可以使用kill -9 的命令杀死当前项目java进程重新部署,也可以通过配置jenkins的内部JVM参数进行调优。
2.3 检查项目pom.xml中是否有当前jdk不支持的jar包,比如你使用的是jdk11,却使用了jdk8自带的sun.misc.BASE64Encoder;
重启docker容器,附启动命令:
docker run --name jenkins
-u root
-d -p 8080:8080
-p 50000:50000
–privileged=true
-v /mydata/jenkins_docker/:/var/jenkins_home
-v /usr/local/apache-maven-3.8.8:/usr/local/apache-maven-3.8.8
-v /usr/java/jdk1.8.0_371:/usr/local/jdk1.8.0_371
jenkins/jenkins:lts
#参考链接:
jar包自动部署