svn自动部署安装配置
环境
系统:centos7.7
主机:192.168.0.193
docker: 19.03.5
maven:3.6.3
jdk:1.8
svn:1.7.14
Jenkins:2.190.3
安装maven
-
官网下载(本机采用3.6.3)
[Maven – Download Apache Maven](maven.apache.org/download.cg…)
-
home目录新建maven文件夹,把下载的文件上传到maven文件夹,为了不受权限限制,使用命令赋予所有权限
chmod -R 777 -
解压安装包
tar -zxvf apache-maven-3.6.3-bin.tar.gz -
配置环境变量
进入解压文件夹pwd,复制maven的绝对路径 /home/maven/apache-maven-3.6.3
-
编辑配置文件并添加以下配置
vim /etc/profileexport MAVEN_HOME=/home/maven/apache-maven-3.6.3 export PATH=$MAVEN_HOME/bin:$PATH -
保持退出,并执行命令使之生效
source /etc/profile -
查看是否安装成功
mvn -v -
如上图所示表示安装成功
安装jdk
-
home目录新建jkd文件夹将压缩包上传至文件夹
-
查询是否自带jdk,如果有先卸载然后再安装
rpm -qa | grep jdk -
卸载
yum -y removeyum -y remove java-1.8.0-openjdk-headless-1.8.0.232.b09-0.el7_7.x86_64 yum -y remove java-1.7.0-openjdk-headless-1.7.0.241-2.6.20.0.el7_7.x86_64 yum -y remove copy-jdk-configs-3.3-10.el7_5.noarch直到查询没有为止
-
解压新上传的jdk1.8
tar -zxvf jdk-8u11-linux-x64.tar.gz -
进入解压目录pwd,复制绝对路径
/home/jdk/jdk1.8.0_11 -
编辑系统配置文件配置环境变量
vim /etc/profileexport JAVA_HOME=/home/jdk/jdk1.8.0_11 export PATH=$PATH:$MAVEN_HOME/bin:$JAVA_HOME/bin -
保持退出,并执行命令使之生效
source /etc/profile -
查看jdk是否安装成功
java -version -
上图表示安装成功
安装svn
-
安装svn服务
yum -y install subversion不知道什么时候安装过了,显示我已经安装
-
创建svn目录
-
创建svn仓库,名为repos
-
修改仓库配置文件
-
编辑svnserve.conf
vim repos/conf/svnserve.conf将下面四行注释解开并修改第一行anon-access = none,然后保存退出
-
修改passwd文件,添加用户
vim repos/conf/passwd添加了一个用户liucong,密码为123456,然后保存退出
-
修改authz文件,赋值创建用户权限
vim repos/conf/authz将用户liucong 设置对repos用户读写权限
-
-
启动svn服务
svnserve -d -r /home/svn -
查看svn服务是否启动
ps ef | grep svn -
仓库地址
svn://192.168.0.193/repos
-
windows连接
svn://192.168.0.193/repos
并输入上面设置的用户名和密码,切记连接之前记得关闭防火墙
Jenkins安装与配置
-
拉取jenkins
docker pull jenkins -
查看镜像
docker images -
创建jenkins目录
mkdir -p /home/jenkins -
修改权限
chown -R 1000 /home/jenkins/ -
启动jenkins
docker run -itd -p 9090:8080 -p 50000:50000 --name jenkins --privileged=true -v /home/jenkins:/var/jenkins_home jenkins:latest -
访问
192.168.0.193:9090
根据提示,进入容器查看/var/jenkins_home/secrets/initialAdminPassword文件找密码
进入容器:docker exec -it ddd2e4dcf731 /bin/bash
查看密码:cat /var/jenkins_home/secrets/initialAdminPassword
密码:a762c435c13e41e08df4f5ebe83b2a8a
注意:其实在查看/home/jenkins/secrets/initialAdminPassword也可以,因为我们启动jenkins的时候用命令(看上面命令的绿色部分)指定了/home/jenkins目录挂载到容器里面的/var/jenkins_home目录,所以一切在容器里面生成的文件都会在宿主机上生成
-
进入安装插件
-
建议安装插件
-
艾玛卧槽,发现全部安装失败
-
稍候解决上述问题,先创建一个管理员账号,方便登录
-
点击系统管理,查看插件安装失败原因,如下图所示,应该是版本太低所导致
-
如下图所示,下面提供了下载更新版的war包,但我们这里是docker拉取的,不想tomcat启动那样,直接换个war包就可以
-
因为是docker直接拉取的,因此我决定删除现有版本的容器,2.190.3版本的镜像
首先停止现有的jenkins容器:docker stop 容器ID
然后删除容器:docker rm 容器ID
最后删除镜像:docker rm 镜像ID
-
官网查看最新版本又可供docker拉取的版本
-
docker拉取2.190.3版本
-
拉取
docker pull jenkins:2.190.3如下图所示并没有找到2.190.3版本
-
去docker官网搜索一下,如下图所示
-
执行上图命令,如下图所示可以下载,等待下载完毕启动,重复上面步骤,这里不重复贴图了
docker pull jenkins/jenkins:2.190.3-centos
-
-
下载成功,启动
docker run -itd -p 9090:8080 -p 50000:50000 --name jenkins --privileged=true -v /home/jenkins:/var/jenkins_home jenkins/jenkins:2.190.3-centos -
启动之后,访问192.168.0.193:9090,查看密码登录,然后重新安装建议安装的插件,如下图所示,大部分都安装成功了
-
上面先选择继续创建第一个用户
-
登录之后进入插件管理,插件已安装的插件,发现Build Time插件存在,所以就不管了
-
进入全局工具配置,配置jkd,maven等等...
配置settings.xml找到maven的安装目录,如下图所示
注意:上图所示我配置的路径还是jenkins容器内的maven目录,记得下面修改了setting.xml文件之后将整个/home/maven/目录复制到/home/jenkins/目录里面
上图所示配置好之后还需要将settings.xml的仓库地址改为国内站点,提升下载速度,如下图所示
vim /home/maven/apache-maven-3.6.3/conf/settings.xml<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> <mirrorOf>central</mirrorOf> </mirror>注意:上面的java_home和maven_home为什么是/var/jenkins_home/,因为jenkins是安装在docker里面的,这时候使用的就是docker容器里面的路径,需要手动将jdk和maven的解压文件复制到/home/jenkins/里面,如下图所示,至于为什么复制到/home/jenkins目录,那是因为我们上面启动jenkins容器的时候就将/home/jenkins目录挂载到容器里面的/var/jenkins_home/了,所以将jdk和maven复制到/home/jenkins会在容器的/var/jenkins_home/目录生成相同的文件
进入容器查看:如下图所示
注意:推荐安装的插件没有maven插件需要手动搜索安装,进入插件管理,等待安装完成自动重启
然后自己弄一个项目上传到svn
此处我在springtools上新建一个svn资源库,然后上传一个项目上去,资源库的地址就是上面安装svn之后的版本库地址
将项目提交上去,如下图所示,抱歉,为了方便快速svn文件目录结构不是很规范,请自行参考百度建立规范的文件目录结构
先在本地启动,检测是否能访问成功,如下图所示,本地启动可以访问成功,接下来配置自动部署
-
创建一个新的maven工程,如下图所示
-
以上就是jenkins拉取svn代码发布的全过程,当然还没有完,上面只是拉取并进行基础配置,并没有实时的更新启动我们在服务器的项目,docker相关配置参考下面步骤
-
首先我们在系统管理————>插件管理中先下载一个Publish over ssh插件,如下图所示,我已经下载过了,没下载的可以点击可选插件进行搜索下载,下面会用得到
-
第二步,进入系统管理的系统配置,配置docker主机相关的东西,如下图所示
找到上图所在的位置填写上面的参数
PassPhrase:服务器的密码
Name:任意命名
Hostname:服务器地址(我服务器ip是192.168.0.193)
Username:服务器登录的用户名(我本机是用root用户登录的)
Remote Diractory(远程目录):说实话,这里没搞懂什么意思,猜想是进入哪个目录,这里我就给了个/进入根目录的意思,当然填写/home也ok
填写好之后点击右下方的按钮测试下,左边出现seccess即可,然后点保存退出
-
接着点击项目,进入项目配置,如下图所示
首先我们点击的时候要选择通过SSH发送文件或执行命令,这里为什么会有这个选项是因为前面我们安装了Publish over ssh插件,否则是不会有这个选项的
各项参数配置解释如下:
Name:选择我们前面在系统管理系统配置里面配置的服务器
Source files:源文件,我这里填写了**/*.jar,意思是讲所有生成的jar包都移到远程目录配置下的文件夹下
Remote directory:远程目录:是我新建的放项目jar包的目录,如下图所示,就是主要的文件,打码的都是用不到的,这里为了避免误导,所以打码了
Exec command:意思是执行命令这里我填写了docker.sh所在的绝对路径,如上图所示
整个配置的意思就是:当点击jenkins构建项目的时候jenkins会到svn拉取最新的
代码通过我们配置的maven进行编译打包,打包之后会执行下图
我们配置的参数,首先会将jar生成在我们配置的远程目录里面,然后在执行我们配置的
docker.sh这个脚本,下面还有个高级按钮,里面需要将下下图的选项勾上,否则就会生成target文件夹,如上图所示
注意:这里遇到过一个大坑,就是如下图所示,Pre Steps 和Post Steps都可以进行上面的配置,那么有什么区别呢?百度了一下大概的意思是
Pre Steps是预处理步骤,也就是先执行命令,再打包编译生成jar包
Post Steps是后处理,即:先打包编译生成jar包,在执行命令
事先我是在Pre Steps配置的上图信息,导致每次都需要构建两次项目才能真正的看到svn代码的变化,为什么呢?原因就是先执行命令的时候jar包还没有打包编译好,所以每次执行都是上一次的jar包,第二次构建的时候就把上一次构建的jar包运行了,所以才会出现为什么每次都需要构建两次项目才能看到svn代码的变化,后来改为Post Steps先编译打包,再执行命令就好了,正确的步骤应该是先打包编译在执行脚本
-
以上就是整个jenkins上面的配置,下面介绍服务器当中的脚本,如下图所示就是所有的文件,为了避免造成误导,我将自己瞎建的文件打码了,下图的两个文件分别是在Jenkins配置svn和gitlab使用到的
Dockerfile文件如下
FROM java:8 #作者 MAINTAINER liucong # 简化 jar 的名字路径 (左边是服务器中jar包的路径,因为当前文件是和jar包同级,所以直接写名字即可,右边是镜像中要存放jar包的路径) VOLUME /home/project/spring-boot-01-helloword-svn/ ADD spring-boot-01-helloword-0.0.1-SNAPSHOT.jar app.jar # 执行 java -jar 命令 (CMD:在启动容器时才执行此行。RUN:构建镜像时就此行,后面的jar包路径就是上面要设置的jar包路径>) # CMD java -jar /app.jar ENTRYPOINT ["java","-jar","/app.jar","--server.port=9999","-c",">/log/app.log"] # 设置对外端口为 9999 EXPOSE 9999docker.sh脚本如下
#操作/项目路径(Dockerfile存放的路劲) BASE_PATH=/home/project/spring-boot-01-helloword-svn # 源jar路径 即jenkins构建后存放的路径 SOURCE_PATH=/home/jenkins/workspace/spring-boot-01-helloword-svn #docker 镜像/容器名字或者jar名字 这里都命名为这个 SERVER_NAME=spring-boot-01-helloword-svn #容器id CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}') #镜像id IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}') rm -rf $BASE_PATH/spring-boot-01-helloword-0.0.1-SNAPSHOT.jar echo "最新构建代码 $SOURCE_PATH/target/spring-boot-01-helloword-0.0.1-SNAPSHOT.jar 迁移至 $BASE_PATH ...." #把项目从jenkins构建后的目录移动到我们的项目目录下同时重命名下 /bin/cp -rf $SOURCE_PATH/target/spring-boot-01-helloword-0.0.1-SNAPSHOT.jar $BASE_PATH/ #修改文件的权限 #docker stop $SERVER_NAME #停止正在运行的容器 #docker rm $SERVER_NAME #删除正在运行的容器 #docker rmi $SERVER_NAME #删除镜像 # 构建docker镜像 if [ -n "$IID" ]; then echo "存在$SERVER_NAME镜像,IID=$IID" docker stop $SERVER_NAME #停止正在运行的容器 docker rm $SERVER_NAME #删除正在运行的容器 docker rmi $SERVER_NAME #删除镜像 cd $BASE_PATH docker build -t $SERVER_NAME . else echo "不存在$SERVER_NAME镜像,开始构建镜像" cd $BASE_PATH docker build -t $SERVER_NAME . fi #docker stop $SERVER_NAME #停止正在运行的容器 #docker rm $SERVER_NAME #删除正在运行的容器 #docker rmi $SERVER_NAME #删除镜像 # 运行docker容器 # --name docker-test 容器的名字为docker-test # -d 容器后台运行 # -p 3636:3636 指定容器映射的端口和主机对应的端口都为3636 # -v /usr/ms_backend/:/usr/ms_backend/ 将主机的/usr/ms_backend/目录挂载到容器的/usr/ms_backend/ 目录中(不可少每次 本地更新jar包重启容器即可,不用重新构建镜像 docker run --name $SERVER_NAME -v $BASE_PATH:$BASE_PATH -p 9999:9999 -d $SERVER_NAME echo "$SERVER_NAME容器创建完成"
-
-
以上就是docker+svn+jenkins+maven自动部署的所有配置,下面看测试
-
首先看java文件,返回hello word,如下图所示
-
Jenkins构建
-
访问
确实返回hello word(9999端口是我们在Dockerfile文件配置了的,并且docker运行的镜像也指定了9999端口)
-
修改java文件
改成hello liucong并且提交到svn
-
再次构建
-
再次访问
如下图所示返回hello liucong表示整个流程部署成功
-
以上就是整个流程的部署配置
-
gitlab自动部署安装配置
环境
gitLab:
环境同上,新增gitLab
其他配置参考以上文件,本次主要安装gitLab和nginx以及jenkins上面的配置
gitLab 安装
-
gitLab镜像拉取
docker pull gitlab/gitlab-cegitlab-ce为稳定版本,后面如果不写版本号,则默认拉取最新latest版
-
查看镜像
docker images -
运行镜像
docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce-d:后台运行
-p:将容器内部端口向外映射
--name:命名容器名称
-v:将容器内数据文件夹或者日志配置文件挂载到宿主机目录
-
配置
按上面的方式,gitlab容器运行没问题,但在gitlab上创建项目的时候,生成项目的URL访问地址是按容器的hostname来生成的,也就是容器的id。作为gitlab服务器,我们需要一个固定的URL访问地址,于是需要配置gitlab.rb(宿主机路径:/home/gitlab/config/gitlab.rb)
-
编辑文件,修改以下内容
vim /home/gitlab/config/gitlab.rbexternal_url 'http://192.168.0.193'(配置http协议所使用的访问地址,不加端口号默认为80)
gitlab_rails['gitlab_ssh_host'] = '192.168.0.193'(配置ssh协议所使用的访问地址和端口)
gitlab_rails['gitlab_shell_ssh_port'] = 222(此端口是run时22端口映射的222端口)
-
保存退出
-
-
重启gitlab容器
docker restart gitlab -
访问
(因为我的gitlab端口为80,所以浏览器url不用输入端口号,如果端口号不是80,则打开为:ip:端口号),第一次进入要输入新的root用户密码,设置好只有确认就行,然后点击登入
-
注册账号
-
创建工程,这里还是以上面教程的项目为例
-
打开本地git bash使用以下命令生成ssh私钥
-
生成私钥
ssh-keygen -t rsa -C '***********@gmail.com'这里的公钥和私钥生成以下目录
Your identification has been saved in /c/Users/Administrator/.ssh/id_rsa.
Your public key has been saved in /c/Users/Administrator/.ssh/id_rsa.pub.
-
查看私钥
cat ~/.ssh/id_rsa.pub~表示用户目录,比如我的windows就是c:\Users\Administrator
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCiKZTTL8mMmsh4YZhF4cICbpwJlpXDlzxxrPAyldf7Ywh47EYcMZ9YrcLkifQeiMrPk+a6wn7Q9HKjOcZFBRS8g8QWNMD/+S6u6hXuhgePwFPYxg6mTDDNpyaw YcxislxLIL3rPYbMg2gmX+X2gH7Vm1waiUon2SV780s3dgAq+XlCLQ14dB60+XhMu+27BcxVKdXOku56 JILvmbK4Ww2B2A6Gxsh3xGDOga8bouoNlP2mlQipEs2W+y6+xkrNgS7XoKT/EbPKKvGd/lCEnApcmDNSONt5KCQEWbpQGPLna9vgfb6rQ/dF6g9HMwJZh+nJoCdxOy+u5rVvypo2JieXfdliucong@gmail.com
-
配置gitLab
找到Pofile Stting – SSH Keys – Add SSH Key,并将上一步复制的内容粘贴到key所对应的文本框中
-
本地新建文件夹上传到git
打开命令框,进入到fdliucong,设置用户名和邮箱
git config –global user.name “刘聪”
git config –global user.email “fdliucong@gmail.com”
然后再克隆项目
git clone ssh://git@192.168.0.193:222/liucong/spring-boot-01-helloword.git地址来自下图
完成之后,fdliucong文件夹就会出现项目
不过这里只是一个空项目,需要将其他代码复制到spring-boot-01-helloword目录里面,通过命令上传到git,如下图所示
首先进入到项目目录里面,
cd spring-boot-010helloword/
然后通过add命令将项目添加进去,实际上就是把文件添加到暂存区
git add * (*表示所有文件和目录)然后提交项目
git commit –m ‘描述’
最后通过push命令推送到git
git push origin master
这样git上就有了
-
以上就是gitlab上的代码上传,当然不止这一方式,下面我使用的工具是idea,可自行选择
-
jenkins安装配置
-
为了区分将项目分别加了后缀,分别表示从svn,gitlab拉取的代码
-
点击项目进行配置
下面的默认master就是分支名称,我这里默认发布主干,也可发布某个分支
-
点击构建,如下图所示
构建成功
-
Jenkins脚本配置,以及服务器脚本
基本和svn是一致的,但是服务器文件目录是不一样的,所以这里的配置也要做变更
-
服务器目录如下
上面的是gitlab配置,下面的是svn的配置,其实文件,文件内容是一样的
Dockerfile,和docker.sh文件和上面svn目录的文件一致,里面需要稍微做下改动,改掉目录名称和端口,这里贴在下面
dockerfile文件
FROM java:8 #作者 MAINTAINER liucong # 简化 jar 的名字路径 (左边是服务器中jar包的路径,因为当前文件是和jar包同级,所以直接写名字即可,右边是镜像中要存放jar包的路径) VOLUME /home/project/spring-boot-01-helloword-gitlab/ ADD spring-boot-01-helloword-0.0.1-SNAPSHOT.jar app.jar # 执行 java -jar 命令 (CMD:在启动容器时才执行此行。RUN:构建镜像时就此行,后面的jar包路径就是上面要设置的jar包路径>) # CMD java -jar /app.jar ENTRYPOINT ["java","-jar","/app.jar","--server.port=9999","-c",">/log/app.log"] # 设置对外端口为 7799 EXPOSE 7799docker.sh文件
#操作/项目路径(Dockerfile存放的路劲) BASE_PATH=/home/project/spring-boot-01-helloword-gitlab # 源jar路径 即jenkins构建后存放的路径 SOURCE_PATH=/home/jenkins/workspace/spring-boot-01-helloword-gitlab #docker 镜像/容器名字或者jar名字 这里都命名为这个 SERVER_NAME=spring-boot-01-helloword-gitlab #容器id CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}') #镜像id IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}') rm -rf $BASE_PATH/spring-boot-01-helloword-0.0.1-SNAPSHOT.jar echo "最新构建代码 $SOURCE_PATH/target/spring-boot-01-helloword-0.0.1-SNAPSHOT.jar 迁移至 $BASE_PATH ...." #把项目从jenkins构建后的目录移动到我们的项目目录下同时重命名下 /bin/cp -rf $SOURCE_PATH/target/spring-boot-01-helloword-0.0.1-SNAPSHOT.jar $BASE_PATH/ #修改文件的权限 chmod -R 777 $BASE_PATH/spring-boot-01-helloword-0.0.1-SNAPSHOT.jar echo "迁移完成" #docker stop $SERVER_NAME #停止正在运行的容器 #docker rm $SERVER_NAME #删除正在运行的容器 #docker rmi $SERVER_NAME #删除镜像 # 构建docker镜像 if [ -n "$IID" ]; then echo "存在$SERVER_NAME镜像,IID=$IID" docker stop $SERVER_NAME #停止正在运行的容器 docker rm $SERVER_NAME #删除正在运行的容器 docker rmi $SERVER_NAME #删除镜像 cd $BASE_PATH docker build -t $SERVER_NAME . else echo "不存在$SERVER_NAME镜像,开始构建镜像" cd $BASE_PATH docker build -t $SERVER_NAME . fi #docker stop $SERVER_NAME #停止正在运行的容器 #docker rm $SERVER_NAME #删除正在运行的容器 #docker rmi $SERVER_NAME #删除镜像 # 运行docker容器 # --name docker-test 容器的名字为docker-test # -d 容器后台运行 # -p 3636:3636 指定容器映射的端口和主机对应的端口都为3636 # -v /usr/ms_backend/:/usr/ms_backend/ 将主机的/usr/ms_backend/目录挂载到容器的/usr/ms_backend/ 目录中(不可少每次 本地更新jar包重启容器即可,不用重新构建镜像 docker run --name $SERVER_NAME -v $BASE_PATH:$BASE_PATH -p 7799:9999 -d $SERVER_NAME echo "$SERVER_NAME容器创建完成"构建
-
访问
更改源码,上传到gitlab,再发布
-
注意
Dockerfile下图位置的端口需要docker.sh下图位置的端口保持一致,否则访问不了,亲测
红框对应红框
黄框对应黄框