Jenkins+Svn+Docker搭建持续集成环境 自动部署(多机子)
一、准备工作:
212机子:
213机子:
-
安装JDK并配置;
-
安装maven并配置;
-
安装docker
其中项目的话可以参照截图,controller,model什么的这些自定义就行。
重点注意红框框的这几个
1、properties 配置
application-dev.properties 和 application-test.properties 主要就是数据库地址不一样,其他都一样。这里这两个文件不配置内容也可以。
2、pom文件
3、脚本文件
主要的来了。这五个配置文件
(1)docker_build.sh
#!/bin/bash RUNENV=$1 MODULE=$2 echo "环境: ${RUNENV}" # docker 仓库地址 IMAGE_NAME= "192.168.206.212:5000/${MODULE}:1.0.0.RC" echo $IMAGE_NAME >> IMAGE_NAME docker build --build-arg RUNENV=${RUNENV} -t ${IMAGE_NAME} . docker push ${IMAGE_NAME} |
(2)docker_deploy.sh
#!/bin/bash PORT=$1 IMAGE=$2 MODULE=$3 echo "update image to: ${IMAGE}" docker stop ${MODULE} # 删除容器 docker rm ${MODULE} # 减少磁盘空间 删除镜像 docker rmi -f $(docker images | grep ${MODULE}) docker run -d -p ${PORT}:8070 - v /home/logs : /home/logs --name ${MODULE} ${IMAGE} |
(3)Dockerfile
FROM airdock /oraclejdk MAINTAINER hmw 1445496485@qq.com ARG RUNENV=${RUNENV} ENV RUNENV=${RUNENV} ENV TZ=Asia /Shanghai RUN ln -snf /usr/share/zoneinfo/ $TZ /etc/localtime && echo $TZ > /etc/timezone RUN mkdir -p /var/yjz/demo \ echo ${RUNENV} > /tmp .properties COPY target /demo .jar /var/yjz/demo/app .jar WORKDIR /var/yjz/demo ENTRYPOINT [ "java" , "-jar" , "app.jar" , "--spring.profiles.active=${RUNENV}" ] # EXPOSE命令只是声明了容器应该打开的端口并没有实际上将它打开! # 我们声明了EXPOSE端口之后,我们使用-P命令进行随机映射的时候,是会对这个端口进行映射的。 # 比如说我们现在对一个tomcat容器进行EXPOSE 9999声明,那么我们进行-P随机映射的时候是会对9999端口进行映射的。 EXPOSE 8063:8063 |
(4)expect.sh
#!/usr/expect/bin/expect set timeout -1 # 获取传入参数 set pwd [lindex $argv 0] set module [lindex $argv 1] set port [lindex $argv 2] set image [lindex $argv 3] spawn scp $ pwd /docker_deploy .sh root@192.168.206.213: /home/service/fesco/ $module.sh expect "*password:" send "root\r" spawn ssh root@192.168.206.213 expect "*password:" send "root\r" expect "]# " send "sh /home/service/fesco/$module.sh $port $image $module\r" send "exit\r" expect eof exit |
(5)start.sh
#!/bin/bash PORT=$1 MODULE=$2 IMAGE_NAME= "192.168.206.212:5000/${MODULE}:1.0.0.RC" echo "目录:" $( pwd ) echo "模块:" ${MODULE} echo "端口:" ${PORT} . /expect .sh $( pwd ) ${MODULE} ${PORT} ${IMAGE_NAME} |
二、jenkins创建项目
1、新建item——>选择流水线(PipeLine)。
2、设置参数
3、流水线脚本
node { stage( 'checkout_order' ) { deleteDir() checkout([ $class: 'SubversionSCM' , additionalCredentials: [], excludedCommitMessages: '' , excludedRegions: '' , excludedRevprop: '' , excludedUsers: '' , filterChangelog: false , ignoreDirPropChanges: false , includedRegions: '' , locations: [ [ credentialsId: '1a2dc2fc-8eed-46a3-b22d-169a863376ec' , depthOption: 'infinity' , ignoreExternalsOption: true , local : '.' , remote: 'http://192.168.206.213/svn/svnrepos/branch/@HEAD' ] ], workspaceUpdater: [$class: 'UpdateUpdater' ] ]) } stage( "mvn_order" ) { echo "start compile mvn_common" sh "mvn -DskipTests clean package" } stage( "docker_build" ) { echo "start build image" sh 'chmod 777 ./docker_build.sh' sh './docker_build.sh ${RUNENV} ${MODULE}' } stage( "docker_deploy" ) { echo "deploy on docker" sh 'chmod 777 ./docker_deploy.sh' sh 'chmod 777 ./expect.sh' sh 'chmod 777 ./start.sh' sh './start.sh ${PORT} ${MODULE}' } } |
credentialsId:凭据,如下图所示配置一个
remote 后面填自己的项目svn地址,其他不变。下面这是我的。
脚本的整个过程:
1 2 3 4 | # 1、svn拉取项目 # 2、编译maven项目,生成jar包 # 3、docker_build.sh结合DockerFile文件 生成镜像并push到镜像仓库 # 4、运行start.sh 传入参数(端口号,项目名称等,这里可以把版本号作为参数也发来),调用expect.sh将212机子上的docker_deploy.sh发送到213机子上,并登录213机子,启动docker_deploy.sh, docker_deploy会停止当前容器,删除容器,删除镜像,从镜像仓库上拉取镜像重新生成容器并启动。 |
4、新建好之后,构建项目即可。
三、构建过程中的问题:
1、错误信息: unix /var/run/docker.sock: connect: permission denied
解决方案:
1 2 3 | # 这个方法只要docker服务重启, 就需要重新设置一次 cd /var/run/ chmod 777 docker.sock |
2、错误信息:java.lang.UnsupportedOperationException: no known implementation of class hudson.scm.SCM is named SubversionSCM
解决方案:
因为没有安装svn插件,去插件管理中安装svn
3、错误信息:hudson.remoting.ProxyException: org.tmatesoft.svn.core.SVNAuthenticationCancelledException: svn: E200015: Authentication cancelled
解决方案:
jenkins中添加一个凭据 svn中的用户
4、错误信息:[ERROR] Could not create local repository at /usr/local/maven-repository -> [Help 1]
解决方案:
没有找到maven中conf文件夹中的settting.conf配置的仓库地址,我的是/usr/local/maven-repository。
所以在Jenknis所在的机子上操作,创建仓库文件夹,并放开权限
1 2 3 | cd /usr/local/ mkdir maven-repository chmod -R 777 /usr/local/maven-repository/ |
5、错误信息:[ERROR] [ERROR] Some problems were encountered while processing the POMs:
修改jenkins的用户为root,默认是jenkins
1 | vim /etc/sysconfig/jenkins |
重启jenkins
1 | systemctl restart jenkins |
我的仓库地址是 /usr/local/maven-repository/
1 | chmod -R 777 /usr/local/maven-repository/ |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2021-06-30 -bash: /usr/local/maven/apache-maven-3.8.1/bin/mvn: 权限不够
2021-06-30 复制docker容器中的nginx某个文件到linux中