安装Jenkins
输入命令启动Jenkins容器
docker run -d --restart=always --name jenkins -u root -p 8080:8080 -p 50000:50000 jenkinsci/blueocean
由于是后台启动的,需要输入docker logs jenkins
打开日志来获取密码
挂载-v /home/jenkins_data:/var/jenkins_home -v$(whichdocker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock
配置Jenkins
因为已经配置过了这里就不再截图,可以参考别的教程
- 安装插件:输入ip:8080进入Jenkins,选择推荐安装的插件
- 创建用户:安装完成之后会提示创建一个用户,这里我选择继续用admin登录,密码还是之前的那个密码忘记了可以继续执行
docker logs jenkins
查看日志获取密码 - 设置时区:进入系统管理 -> 脚本命令行,执行
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone','Asia/Shanghai')
- 安装插件:只安装推荐插件还不太够,需要继续下载几个插件没
-
- Maven Integration
- Maven Info
- Publish Over SSH
- Extended Choice Parameter
- Git Parameter
- jdk配置:这里我没浪费太多时间,直接去官网下载的jdk然后扔到docker里,感兴趣的可以研究一下
- maven配置:直接用默认的
- ssh配置:
系统管理 -> 系统配置 -> ssh server
按照下图这么配置就行
开始部署
配置任务
先选择构建maven项目
详细配置
不用管的配置
源码管理
选择git账号并指定分支,没有就添加
打包管理
指定打包命令,这里打包的时候跳过测试clean package -Dmaven.test.skip=true
构建后操作
点击新增构建后操作
会弹出以下界面
- 这里是服务器,就是配置Jenkins第七步做的
- 打的jar路径,和idea打包路径一样。如果路径还是不对可以先运行一下去工作空间看一下
- 传输文件,去除前缀,文件名为*.jar
- 传输到服务器的路径
- 传输完后执行的shell命令
cd /work/java/private-mall-docker/shell && ./backup.sh
cd /work/java/private-mall-docker
docker build -t private-mall .
cd /work/java/private-mall-docker/shell && ./deploy.sh
创建脚本文件
创建文件夹
先创建项目文件夹,在项目文件夹下面创建这几个文件夹
- backup
- build
- logs
- shell
创建backip.sh脚本
#!/bin/bash
set -e
# 基础路径
BASE_PATH=/work/java/private-mall-docker
# 编译后 jar 的地址。部署时,Jenkins 会上传 jar 包到该目录下
SOURCE_PATH=$BASE_PATH/build
# 服务名称。同时约定部署服务的 jar 包名字也为它。
SERVER_NAME=yudao-server
# 环境
PROFILES_ACTIVE=dev
# 备份
function backup() {
# 如果不存在,则无需备份
if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
echo "[backup] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过备份"
# 如果存在,则备份到 backup 目录下,使用时间作为后缀
else
echo "[backup] 开始备份 $SERVER_NAME ..."
cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar
echo "[backup] 备份 $SERVER_NAME 完成"
fi
}
# 最新构建代码 移动到项目环境
function transfer() {
echo "[transfer] 开始转移 $SERVER_NAME.jar"
# 删除原 jar 包
if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
echo "[transfer] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过删除"
else
echo "[transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成"
rm $BASE_PATH/$SERVER_NAME.jar
fi
# 复制新 jar 包
echo "[transfer] 从 $SOURCE_PATH 中获取 $SERVER_NAME.jar 并迁移至 $BASE_PATH ...."
cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATH
echo "[transfer] 转移 $SERVER_NAME.jar 完成"
}
function build() {
echo "开始构建镜像"
cd /work/java/private-mall-docker
docker build -t private-mall .
echo "镜像构建完成"
}
# 部署
function deploy() {
DATE=$(date +%Y%m%d%H%M)
cd $BASE_PATH
# 备份原 jar
backup
# 部署新 jar
transfer
}
deploy
创建deploy.sh脚本
#!/bin/bash
set -e
## 第一步:删除可能启动的老 private-mall 容器
echo "开始删除 private-mall 容器"
docker stop private-mall || true
docker rm private-mall || true
echo "完成删除 private-mall 容器"
## 第二步:启动新的 private-mall 容器 \
echo "开始启动 private-mall 容器"
docker run -d \
--name private-mall \
-p 28080:28080 \
-e "SPRING_PROFILES_ACTIVE=local" \
-v /work/java/private-mall-docker/logs:/root/logs/ \
private-mall
echo "正在启动 private-mall 容器中,需要等待 60 秒左右"
这里注意-e "SPRING_PROFILES_ACTIVE=local"
自己玩的时候设置的local
,等部署的时候自己在设置yaml文件
创建Dockerfile文件
FROM eclipse-temurin:8-jre
## 创建目录,并使用它作为工作目录
RUN mkdir -p /private-mall
WORKDIR /private-mall
## 将后端项目的 Jar 文件,复制到镜像中
COPY ./yudao-server.jar app.jar
## 设置 TZ 时区
ENV TZ=Asia/Shanghai
## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖
ENV JAVA_OPTS="-Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom"
## 应用参数
ENV ARGS=""
## 暴露后端项目的 28080 端口
EXPOSE 28080
## 启动后端项目
CMD java ${JAVA_OPTS} -jar app.jar $ARGS
清理镜像
手动输入docker system prune -a
清理没有使用的镜像,考虑到不会部署不会太频繁就不写到脚本中去了