1panel+jenkins+docker 部署maven 和 node 项目
- 前置条件
- 配置环境
- 使用1panel安装jenkins
- 配置jenkins 安装插件
- 配置 jenkins 连接宿主服务器
- 创建maven项目
- 创建node项目
前置条件
- ubuntu操作系统
- 安装1panel
- docker正常使用
- 使用的端口安全组和防火墙均放行
配置环境
1.服务器安装maven
打开maven官网
点击下载
打开 1panel 的文件管理界面
点击上传,将下载好的 maven 压缩包上传到/opt
目录
上传完成后点击解压
解压后进入 maven的 conf 目录,编辑 settings.xml
文件
在 mirrors
中添加以下内容
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
2. 服务器安装 node.js
打开 nodejs 官网
选择对应的版本和操作系统后,点击绿色的按钮下载
和 maven 一样,打开 1panel 的文件选项,点击上传后解压
使用1panel安装jenkins
1.打开应用商店,搜索 jenkins,点击安装
2.更改任意端口号,勾选允许外部访问
3.编辑compose文件,将maven和node 的目录映射进 jenkins
例如我的路径为:
/opt/apache-maven-3.9.9
/opt/node-v16.20.2-linux-x64
修改后的配置文件为
点击确定后等待下载结束
在应用商店的已安装找到 jenkins,点击服务端口即可打开 jenkins 页面
回到应用商店,点击日志,查看 jenkins 密码
复制粘贴密码到 jenkins 界面后 点击继续
点击安装推荐的插件
等待安装
创建你的账户,用户名就是登录账号
等待加在后自动跳转进入 jenkins
如安装时点击创建账户无反应,日志出现如下报错
[2K1Panel-jenkins-nR4z | 2025-03-13 06:06:33.243+0000 [id=19] WARNING hudson.security.csrf.CrumbFilter#doFilter: Found invalid crumb 4fa377eca99e19f1a0ed67e6e8cde79cbd41b77032272a2e19e7d100ee939f7a. If you are calling this URL with a script, please use the API Token instead. More information: https://www.jenkins.io/redirect/crumb-cannot-be-used-for-script
[2K1Panel-jenkins-nR4z | 2025-03-13 06:06:33.243+0000 [id=19] WARNING hudson.security.csrf.CrumbFilter#doFilter: No valid crumb was included in request for /setupWizard/createAdminUser by admin. Returning 403.
打开应用商店 点击进入安装目录
在/opt/1panel/apps/jenkins/jenkins/data
路径中找到config.xml
文件
修改该目录下的config.xml配置文件:
excludeClientIPFromCrumb 的值改为 true
<crumbIssuer class="hudson.security.csrf.DefaultCrumbIssuer">
<excludeClientIPFromCrumb>true</excludeClientIPFromCrumb
</crumbIssuer>
保存后重启
jenkins,然后重新走一遍流程
配置jenkins 安装插件
点击系统管理
点击插件管理
依次搜索并安装以下插件
- Maven Integration
- NodeJS
- Publish Over SSH
勾选安装后重启,等待安装和自动重启
点击系统设置,全局工具配置
点击新增 maven 后输入和compose
文件一致的 maven 路径
点击新增node后输入和compose
文件一致的nodejs路径
点击新增 jdk 后输入 jdk 路径
如何找到自己的jdk路径
打开1panel 容器,找到 jenkins,点击终端
输入whereis java
命令后得到 java 路径
如图,java 路径为
/opt/java/openjdk
保存maven jdk node配置
配置 jenkins 连接宿主服务器
打开系统管理 系统配置
新增 ssh server
在publish over ssh
的path to key
中填写 ssh 私钥路径
如果没有这个文件,需要按照刚才的操作进入 jenkins 容器终端
输入以下命令
ssh-keygen -t rsa -C "jenkins"
连续按下四次回车
配置完成
创建maven项目
填写 git 仓库地址
确保你的 jenkins 公钥已经添加到 github 中
选择对应的分支,默认为 master
在 build 中添加以下代码
clean package -U -Dmaven.test.skip=true
作用是打包并且跳过测试用例
点击增加post step 添加执行 shell
输入以下命令
作用是把 Dockerfile 和 jar 包打成一个压缩包,方便一次发送
如果没有 Dockerfile在项目的根目录中新建一个
# jre基础环境
FROM openjdk:17
# 维护者信息
MAINTAINER chenximeng
# 设置环境变量-运行时也可传参进来耍哈
ENV JAVA_OPTS ""
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 添加jar包到容器中 -- tips: xx.jar 和 Dockerfile 在同一级
ADD *.jar /home/app.jar
# 对外暴漏的端口号
# [注:EXPOSE指令只是声明容器运行时提供的服务端口,在运行时只会开启程序自身的端口!!]
EXPOSE 9887
# 以exec格式的CMD指令 -- 可实现优雅停止容器服务
# "sh", "-c" : 可通过exec模式执行shell =》 获得环境变量
CMD ["sh", "-c", "echo \"****** 运行命令:java -jar ${JAVA_OPTS} /home/app.jar --spring.profiles.active=prod\" && java -jar ${JAVA_OPTS} /home/app.jar --spring.profiles.active=prod"]
如果项目的 jar 包名字不是 app.jar,可以更改命令,建议按照以下配置进行修改
打开pom.xml
在build中新建finalName 标签
<build>
<finalName>app</finalName>
点击增加构建后操作 添加发送 jar 包到服务器
选择send build artifacts over ssh
发送 jar 包到宿主服务器
选择刚才添加的 ssh sever
将target目录下的app.tar.gz
发送到宿主服务器的/apps/sunny-villas
文件夹(发送到哪个文件夹根据项目而定)
发送文件后执行脚本
如果没有对应目录,在宿主服务器创建对应目录
deploy_api.sh文件内容如下,可以根据项目进行更改
#!/bin/bash
# 设置变量
HOME_DIR="/apps/sunny-villas"
APP_DIR="$HOME_DIR/api"
LOG_DIR="$HOME_DIR/logs"
CONTAINER_NAME="sunny-villas"
DOCKER_IMAGE="sunny-villas"
# 记录日志文件
LOG_FILE="$LOG_DIR/deployment_api_log.txt"
echo "Deployment Script Execution - $(date)" > "$LOG_FILE"
# 停止并删除 Docker 容器
echo "[INFO] Checking Docker container: $CONTAINER_NAME" | tee -a "$LOG_FILE"
# 检查容器是否存在(无论是否运行)
if docker ps -a --format '{{.Names}}' | grep -Fxq "$CONTAINER_NAME"; then
# 如果容器在运行,则先停止
if docker ps -q --filter "name=$CONTAINER_NAME" | grep -q .; then
echo "[INFO] Stopping running container: $CONTAINER_NAME" | tee -a "$LOG_FILE"
if ! docker stop "$CONTAINER_NAME"; then
echo "[ERROR] Failed to stop running container: $CONTAINER_NAME" | tee -a "$LOG_FILE"
exit 1
fi
fi
# 删除容器
echo "[INFO] Removing container: $CONTAINER_NAME" | tee -a "$LOG_FILE"
if docker rm "$CONTAINER_NAME"; then
echo "[SUCCESS] Container $CONTAINER_NAME removed successfully." | tee -a "$LOG_FILE"
else
echo "[ERROR] Failed to remove container: $CONTAINER_NAME" | tee -a "$LOG_FILE"
exit 1
fi
else
# 如果容器不存在
echo "[INFO] Container $CONTAINER_NAME does not exist. Skipping." | tee -a "$LOG_FILE"
fi
#删除原内容
rm -rf "$APP_DIR"/*
echo "[INFO] Remove old file success" | tee -a "$LOG_FILE"
# 移动 app.tar.gz 到 APP_DIR
echo "[INFO] Moving $HOME_DIR/app.tar.gz to $APP_DIR" | tee -a "$LOG_FILE"
if mv "$HOME_DIR"/app.tar.gz "$APP_DIR"; then
echo "[SUCCESS] Moved app.tar.gz to $APP_DIR." | tee -a "$LOG_FILE"
else
echo "[ERROR] Failed to move app.tar.gz to $APP_DIR." | tee -a "$LOG_FILE"
exit 1
fi
# 切换到 APP_DIR 并解压 app.tar.gz
echo "[INFO] Changing directory to $APP_DIR and extracting app.tar.gz" | tee -a "$LOG_FILE"
cd "$APP_DIR" || { echo "[ERROR] Failed to change directory to $APP_DIR" | tee -a "$LOG_FILE"; exit 1; }
if tar -xzf app.tar.gz; then
echo "[SUCCESS] Extracted app.tar.gz in $APP_DIR." | tee -a "$LOG_FILE"
# 解压后删除 app.tar.gz 文件
rm -f app.tar.gz
echo "[INFO] Removed app.tar.gz after extraction." | tee -a "$LOG_FILE"
else
echo "[ERROR] Failed to extract app.tar.gz in $APP_DIR." | tee -a "$LOG_FILE"
exit 1
fi
# 构建新的 Docker 镜像
echo "[INFO] Building Docker image: $DOCKER_IMAGE" | tee -a "$LOG_FILE"
if docker build -t "$DOCKER_IMAGE" .; then
echo "[SUCCESS] Built Docker image: $DOCKER_IMAGE" | tee -a "$LOG_FILE"
else
echo "[ERROR] Failed to build Docker image: $DOCKER_IMAGE" | tee -a "$LOG_FILE"
exit 1
fi
# 运行新的 Docker 容器
echo "[INFO] Running Docker container: $CONTAINER_NAME" | tee -a "$LOG_FILE"
if docker run -d -p 9887:9860 -p 2399:2399 -v "$LOG_DIR:/logs" --restart always --name "$CONTAINER_NAME" "$DOCKER_IMAGE"; then
echo "[SUCCESS] Docker container $CONTAINER_NAME is running." | tee -a "$LOG_FILE"
else
echo "[ERROR] Failed to start Docker container: $CONTAINER_NAME" | tee -a "$LOG_FILE"
exit 1
fi
# 脚本执行完毕
echo "[INFO] Deployment completed successfully." | tee -a "$LOG_FILE"
点击保存,立即构建,如果构建成功则配置完毕
创建node项目
待续