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
浙公网安备 33010602011771号