jenkins新建项目

 选jdk,git地址,分支

 

git的webhook触发,选择第一个,然后随便写个token。

下面是构建步骤,选择maven版本,maven打包命令。新增一个shell脚本,用来打jar包,然后根据项目中的dockerfile文件打镜像,再推到harbor仓库。

 shell文件内容如下:

#!/bin/bash
set -euo pipefail  # 增强错误处理

# 基础配置
SERVER_NAME="bridge-platform-dev"
JAR_FILENAME="bridge-platform-1.0-SNAPSHOT"
#
JENKINS_HOME按实际jenkins安装的home
JENKINS_HOME="/root/.jenkins/workspace"
JAVA_HOME="/home/iot/third_party/jdk"
VERSION=$BUILD_NUMBER
HARBOR_IP_IN="内网ip:内网端口"
HARBOR_IP_OUT="外网ip:外网端口"
HARBOR_PROJECT="harbor仓库项目名"
HARBOR_PASSWORD="harbor仓库密码"echo "version is" $VERSION

# 打镜像
jenkins_jar="$JENKINS_HOME/$SERVER_NAME/target/$JAR_FILENAME.jar"
jenkins_dockerfile_path="$JENKINS_HOME/$SERVER_NAME"
if [ ! -f "$jenkins_jar" ]; then
    echo "错误:构建产物不存在于 $jenkins_jar"
    exit 1
fi

docker build -t $SERVER_NAME:${VERSION} ${jenkins_dockerfile_path}
echo "已打镜像,镜像名为: $SERVER_NAME:${VERSION}"
#打tag
docker tag $SERVER_NAME:${VERSION} ${HARBOR_IP_IN}/${HARBOR_PROJECT}/$SERVER_NAME:${VERSION}
echo "已打tag:${HARBOR_IP_IN}/${HARBOR_PROJECT}/$SERVER_NAME:${VERSION}"
#登录harbor仓库
docker login -u admin -p ${HARBOR_PASSWORD} ${HARBOR_IP_IN}
echo "已登录harbor仓库:${HARBOR_IP_IN}"
# 推送至harbor镜像仓库
docker push ${HARBOR_IP_IN}/${HARBOR_PROJECT}/$SERVER_NAME:${VERSION}
echo "$SERVER_NAME:${VERSION}镜像已推送至harbor仓库${HARBOR_IP_IN}/${HARBOR_PROJECT}/$SERVER_NAME:${VERSION}"

 因为jenkins是一台服务器,harbor是一台公网服务器,然后项目用dockr跑在另一台服务器上,所以要远程ssh项目服务器,连接后,去harbor仓库拉镜像,然后替换docker-compose文件里的镜像版本号,再重新部署。

 新增一个SSH Publishers,name选择ssh server,这个需要提前去jenkins的设置里配一下。Exec command里是执行该ssh文件上的test.sh脚本,并且传参三个。分别是项目名、构建版本号、项目端口。

 

 

 项目服务器上的test.sh脚本如下:

#!/bin/bash

# 获取命令行参数
PROJECT=$1
VERSION=$2
PROJECT_PORT=$3
HARBOR_IP=harbor外网ip:外网端口
# harbor项目名

HARBOR_PROJECT=backend
HARBOR_PASSWORD=harbor密码
# 打印命令行参数
echo "--你输入的参数$1是: $PROJECT"
echo "--你输入的参数$2是: $VERSION"
echo "--你输入的参数$3是: $PROJECT_PORT"
#登录harbor仓库
docker login -u admin -p ${HARBOR_PASSWORD} ${HARBOR_IP}
echo "--服务器已登录harbor仓库:${HARBOR_IP_IN}"

# 拉镜像
docker pull ${HARBOR_IP}/${HARBOR_PROJECT}/$PROJECT:$VERSION

echo "--镜像已拉取:${HARBOR_IP}/${HARBOR_PROJECT}/$PROJECT:$VERSION"


# 设置环境变量,修改镜像版本号
NEW_IMAGE=${HARBOR_IP}/${HARBOR_PROJECT}/$PROJECT:$VERSION
echo "--修改镜像版本号为:${HARBOR_IP}/${HARBOR_PROJECT}/$PROJECT:$VERSION"

CONTAINER_ID=$(docker ps -a --filter "name=$PROJECT" -q)
echo "--$PROJECT旧容器id命令为:docker ps -a --filter 'name=$PROJECT' -q"
echo "--$PROJECT旧容器id为:${CONTAINER_ID}"


# 生成一个随机端口号(例如,1024到65535之间的随机数)
port=$(( RANDOM + 1024 ))
 
# 检查端口是否被占用
while lsof -i :$port > /dev/null 2>&1; do
  port=$(( RANDOM + 1024 ))
done
 
echo "可用端口号: $port"


# 部署
IMAGE_NAME=$NEW_IMAGE PORT=${port} PORTS="${port}:${PROJECT_PORT}" docker-compose -f /home/docker-compose/postgres/$PROJECT.yml up -d --scale $PROJECT=2 --no-recreate
echo "--启动$PROJECT.yml,镜像名为$NEW_IMAGE"

# 无限循环,直到端口被占用
while true; do
  # 检查端口是否被占用
  if lsof -i :$port > /dev/null 2>&1; then
    echo "--端口 $port 被占用。新容器已启动"
    break
  else
    echo "端口 $port 未被占用,等待中..."
    sleep 2  # 每隔1秒检查一次
  fi
done
sleep 20
# 端口被占用后执行的命令
echo "--等待20s执行后续删除旧容器命令..."

#停止并删除旧容器‌
docker stop ${CONTAINER_ID}
echo "--停止$PROJECT:旧容器id为:${CONTAINER_ID}"
docker rm ${CONTAINER_ID}
echo "--删除$PROJECT:旧容器id为:${CONTAINER_ID}"

#删除倒数第3版镜像
let OLDVERSION=VERSION-2
echo "--OLDVERSION:${OLDVERSION}"

docker rmi ${HARBOR_IP}/${HARBOR_PROJECT}/$PROJECT:$OLDVERSION
echo "--删除$PROJECT老镜像:${HARBOR_IP}/${HARBOR_PROJECT}/$PROJECT:$OLDVERSION"

docker-compose文件是以项目名命令,名称为:bridge-platform-dev.yml

内容如下:
services: 
  bridge-platform-dev:
    image: ${IMAGE_NAME}
    env_file:
      - .env
    environment:
      - spring.cloud.nacos.config.server-addr=${NACOS_ADDR}
      - spring.cloud.nacos.config.password=${NACOS_PASSWORD}
      - spring.cloud.nacos.discovery.server-addr=${NACOS_ADDR}
      - spring.cloud.nacos.discovery.password=${NACOS_PASSWORD}
      - spring.cloud.nacos.username=nacos
      - spring.cloud.nacos.password=${NACOS_PASSWORD}
      - spring.cloud.nacos.discovery.ip=${NACOS_DISCOVERY_IP}
      - spring.cloud.nacos.discovery.port=${PORT}
      - TZ=Asia/Shanghai    
    ports:
      - ${PORTS}
    restart: always

 

posted @ 2025-06-23 17:49  又逢落花时节  阅读(63)  评论(0)    收藏  举报