项目情况
由于项目没有集成SpringBoot,并且没有启动类需要通过放到resin或tomcat这类服务器容器运行,所以无法将Dockerfile直接写到项目中使用jinkens自动构建镜像,并且运行docker镜像
调整主体思路
1.从使用docker拉取tomcat或者resin镜像,在运行镜像时挂载宿主机的webapps目录到resin服务器容器的webapps
2.(在项目没有集成maven的情况下)手动上传项目的war包到宿主机webapps目录中,因为resin服务器容器挂载了该目录,所以容器中的webapps中也会有war包,此时只需要重启resin服务器所在容器则可以完成部署
3.(在项目集成了maven的情况下)使用jinkens配置maven和jdk以及git,从代码仓库拉取代码并自动构建成war包,通过执行编写的shell将构建好的war包拷贝到resin服务器所在容器目录的webapps中,然后重启resin服务器所在容器,完成自动部署
配置宿主机的jdk环境和maven环境
这里建议手动去网上下载jdk和maven上传到宿主机的指定目录,因为后面直接jinkens可以直接挂载到宿主机的目录使用宿主机的jdk和maven,如果使用宿主机的命令行下载,jinkens挂载宿主机的jdk和maven目录的时候可能出现依赖缺失,jdk或者maven不全的情况
1.jdk下载
jdk下载地址:www.oracle.com/sg/java/tec…
选择如下版本(具体结合你的项目使用的jdk版本):
建议上传到宿主机的usr/local/目录下并解压
tar -xzvf /usr/local/jdk-8u202-linux-x64.tar.gz -C /usr/local/
配置环境变量(可选,因为docker容器和宿主机的环境是隔离开的,在docker容器中还得配置)
1. 编辑 ~/.bashrc 或 ~/.zshrc:
nano ~/.bashrc
2. 在文件末尾添加以下内容:
export JAVA_HOME=/usr/local/jdk1.8.0_202
export PATH=$JAVA_HOME/bin:$PATH
3. 保存并执行:
source ~/.bashrc
4. 验证 Java 安装:
java -version
2.maven下载
maven下载地址:maven.apache.org/download.cg…
选择如下版本:
建议上传到宿主机的usr/local/目录下并解压
tar -xzvf /usr/local/apache-maven-3.9.9-bin.tar.gz -C /usr/local/
1. 打开 .bashrc 文件(或者你用的其他 shell 配置文件,例如 .zshrc):
nano ~/.bashrc
2. 在文件末尾添加以下内容,设置 MAVEN_HOME 和将 mvn 命令加入到 PATH:
# Maven
export MAVEN_HOME=/usr/local/apache-maven-3.9.9
export PATH=$MAVEN_HOME/bin:$PATH
3. 保存并关闭文件,然后使配置生效:
source ~/.bashrc
4. 验证 Maven 安装
确保环境变量配置成功并且 Maven 可用,可以运行以下命令来验证 Maven 安装:
mvn -version
搭建jinkens结合docker自动化部署过程
1.安装docker并构建Resin镜像(不同操作系统可能略有不同,这里使用的ubantu)
1. 更新软件包列表
sudo apt update
2. 安装依赖包
sudo apt install -y ca-certificates curl gnupg lsb-release
3. 编辑Docker源配置
sudo nano /etc/apt/sources.list.d/docker.list
4. 添加阿里云镜像源(可以把文件内容直接替换为下面的内容)
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu focal stable
5. 更新软件包列表并安装 Docker,要搭建集群的话,所有的docker需要相同版本
sudo apt update
sudo apt install docker-ce=5:20.10.8~3-0~ubuntu-focal docker-ce-cli=5:20.10.8~3-0~ubuntu-focal containerd.io
6. 验证 Docker 是否安装成功(出现版本信息则安装成功了)
sudo docker --version
2.使用Docker构建Resin镜像并运行Resin容器
1. 下载Resin for linux
由于Docker官方好像没有Resin的镜像,无法直接使用 docker pull 拉取,只能自己去网上下载一个Linux版本的Resin并且配置好,然后在编写Dockerfile时使用cp 从本地拷贝一个到将要构建的镜像中
下载地址:caucho.com/products/re…
2. 配置Resin for linux
将下载的压缩包放到自己创建的/var/local/resin中并解压,修改conf/resin.conf中的内容配置(这个可以参考其他已经配置好的resin容器中的conf,Windows和Linux版的Resin配置几乎一样,只是目录结构不一样),我这里主要改了以下内容:
将此处换为了
<javac compiler="javac" args="-encoding utf-8"/>
将此处换成了
<web-app id="." root-directory="webapps"/>,id指的是以后访问系统的路径http://容器所在ip或者域名:端口/id/ ,root-directory指的是项目的war包所在位置,id为"."则默认以war包的名称来作为访问路径,例如xxxxx-1.0-SNAPSHOT.war,访问路径为http://容器所在ip或者域名:端口/xxxxx-1.0-SNAPSHOT/
3. 测试Resin配置是否正确
配置好后可以先在宿主机的webapps中传入项目war包,然后启动Resin测试是否可以访问到系统,
切换到Resin安装目录下启动命令./bin/httpd.sh start(不同版本的Resin可能/bin下面的启动脚本名字不同)
当看到这个信息说明Resin启动成功,根据宿主机的ip还有默认的8080端口以及war包名称到浏览器访问可以看到系统界面说明配置成功,有的系统需要启动Redis才能访问,使用Docker拉取一个redis镜像并启动就可以了
4. 编写Dockerfile文件用于构建Resin的DOcker镜像
在resin的安装目录下创建Dockerfile文件,因为我写的Dockerfile会拷贝宿主当前目录下的所有内容到容器中的/var/local/resin/resin-pro-3.1.8目录下
# openJDK 8(基础镜像)
FROM openjdk:8-jdk
# 设置 Resin 目录(这步只是为了方便后面引用防止重复编写)
ENV RESIN_HOME /var/local/resin/resin-pro-3.1.8
# 将本地的 Resin 文件复制到容器(.表示当前目录,等下执行docker build的时候需要到Resin所在目录,并且把Dockerfile放到你要拷贝的文件目录下)
COPY . $RESIN_HOME
# 配置 Resin 环境变量
ENV PATH="$RESIN_HOME/bin:$PATH"
# 暴露 Resin 的默认端口和 SSH 端口
EXPOSE 8080 22
# 启动 SSH 服务并启动 Resin(sh表示要执行shell命令,-c表示即将要执行的shell是一个字符串,&& tail -f /dev/null用于让容器resin不会因为没有前台程序运行而自动停止)
CMD ["sh", "-c", "$RESIN_HOME/bin/httpd.sh start && tail -f /dev/null"]
在Dockerfile所在目录下运行docker build -t my-resin .(注意末尾有个"."表示当前目录)
这样说明操作成功了
5.使用Docker来运行这个镜像容器
在命令行输入docker run --name Resin -d -v /var/local/resin/resin-pro-3.1.8/webapps:/var/local/resin/resin-pro-3.1.8/webapps my-resin看到出现有该容器名称说明运行成功,由于容器挂载了宿主机的webapps目录,可以把项目war包上传到宿主机webapps中测试是否可以访问系统
当这个容器正确运行过后,仅仅只需通过
docker start Resin,docker stop Resin来开关Resin服务器了,无需再去构建镜像,以上操作完成后则可以进行jinkens的配置
3.安装jinkens及运行和配置(不同操作系统可能略有不同,这里使用的ubantu)
1. 创建或编辑 Docker 配置文件 /etc/docker/daemon.json,使用以下命令:
sudo nano /etc/docker/daemon.json
2. 添加以下内容来配置阿里云镜像源:
{
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"default-shm-size": "2G",
"debug": true,
"experimental": false,
"registry-mirrors":[
"https://x9r52uz5.mirror.aliyuncs.com",
"https://dockerhub.icu",
"https://docker.chenby.cn",
"https://docker.1panel.live",
"https://docker.awsl9527.cn",
"https://docker.anyhub.us.kg",
"https://dhub.kubesre.xyz"
]
}
3.使用docker拉取jinkens的镜像
这里可以下载 jenkins/jenkins:lts Jenkins 的长期支持(LTS)版本。也可以拉取最新的稳定版本:
docker pull jenkins/jenkins:lts
4.使用docker运行jinkens容器
docker run -d \
--privileged \
--name jenkins \
-u root \
-p 8090:8080 \
-p 50000:50000 \
-v /var/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/local/apache-maven-3.9.9:/usr/local/apache-maven-3.9.9 \
-v /usr/local/jdk1.8.0_202:/usr/local/jdk1.8.0_202 \
-v /var/lib/docker:/var/lib/docker \
-v /usr/bin/docker:/usr/bin/docker \
jenkins/jenkins:lts
上面-v挂载的宿主机目录,jdk和maven主要是为了不用再到容器中下载jdk和maven,挂载docker的目录docker.sock,好像可以在容器中使用docker命令的同时宿主机也同样执行(这个我也不太清楚),挂载jenkins_home是为了将jenkins构建的war包持久化同步到宿主机上
5.检查容器是否运行成功
docker ps
出现以下内容说明运行成功
6.进入容器内部配置环境变量
使用docker exec -it jenkins bash进入容器内部,首先输入git -v检查git是否存在,然后配置环境变量(和在宿主机的目录以及操作一样,这里不过多赘述)
7.访问jinkens并配置jdk和maven以及git
通过浏览器输入宿主机的ip地址和jinkens所映射的端口访问jinkens
执行
cat /var/jenkins_home/secrets/initialAdminPassword得到管理员密码(记得保存,记不得了可以再次输入这个命令,好像也可以到jinkens里面做修改),进去后直接安装推荐插件即可
这里可以直接使用admin,以后登录密码就是上面那个管理员密码,从首页进入到如下页面
这里新增jdk,指定到刚刚jinkens容器中配置的环境变量位置即可
在容器内部使用 which git查看git的地址,然后配置到jinkens中,默认情况下大多为“/usr/bin/git”
Maven的配置和JDK同理,到这里配置就完成了!!!
8.创建任务,实现一键自动部署
从首页进到创建任务界面,选择自由项目
然后这三块分别填写:1.gitee项目的git地址,2.点击添加后输入gitee的用户名和密码(不支持直接输入密码登录,需要去gitee的个人中心去生成私人令牌当作密码)3.项目所在分支名称
然后找到下面的构建步骤:首先选择调用顶层Maven目标,然后输入
clean package -Dmaven.test.skip=true -pl xcgl -am(clean和package表示通过maven的两个生命周期清理和打包以及跳过测试,-pl “模块名” 表示只打包项目中的某个模块,-am表示会从项目中下载该模块所需要的依赖及其他东西),然后再增加构建步骤,选择执行shell,shell命令如下
# 备份当前的 .war 文件
# 假设要备份到容器的某个目录,例如 `/var/backups/resin-backup/`,按日期命名备份文件
backup_dir="/var/backups/resin-backup"
timestamp=$(date +%Y%m%d_%H%M%S)
docker cp Resin:/var/local/resin/resin-pro-3.1.8/webapps/xcgl-1.0-SNAPSHOT.war "$backup_dir/xcgl-1.0-SNAPSHOT_$timestamp.war"
# 停止 resin 容器
docker stop Resin
# 替换 .war 文件
docker cp /var/jenkins_home/workspace/tl_yhgl/xcgl/target/xcgl-1.0-SNAPSHOT.war Resin:/var/local/resin/resin-pro-3.1.8/webapps
# 启动 resin 容器
docker start Resin
解释一下上面的shell脚本:两次docker cp,第一次是从Resin容器的webapps中拷贝war包加上日期到jinkens容器的指定目录中做备份,第二次是将jinkens容器中构建出来的war包拷贝到Resin容器中,然后重启一下resin就实现了自动部署