1panel+jenkins+docker 部署maven 和 node 项目

1panel+jenkins+docker 部署maven 和 node 项目

前置条件

  1. ubuntu操作系统
  2. 安装1panel
  3. docker正常使用
  4. 使用的端口安全组和防火墙均放行

配置环境

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 安装插件

点击系统管理

在这里插入图片描述
点击插件管理
在这里插入图片描述

依次搜索并安装以下插件

在这里插入图片描述

  1. Maven Integration
  2. NodeJS
  3. 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 sshpath 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项目

待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值