当前位置: 首页 > news >正文

【使用jenkins+docker自动化部署java项目】

背景:

有A(打包机129),B(游戏服130) 2个机器,他们都安装有docker,请完成部署。

一、准备好java项目,写好Dockerfile

# 基础镜像,使用包含 JDK 17 的 OpenJDK 镜像
FROM openjdk:17-jdk-slim

# 设置工作目录
WORKDIR /app

# 把当前目录下的 Spring Boot JAR 包复制到容器的 /app 目录下
COPY target/demo-0.0.1-SNAPSHOT.jar /app/app.jar

# 运行 Spring Boot 应用程序
CMD ["java", "-jar", "app.jar"]

位置: // 这一步其实是在远程机器docker build打镜像包使用

思考:我们不需要安装docker上传插件而是打包后,使用rsync进行同步即可,然后在目标机上进行构建镜像,所以无需在pom.xml中配置docker插件!!

二、初始化打包机,安装docker和jenkins

# 通过MobaXterm可以向linux里的/home目录可以上传文件
# chmod -R 777 /home/  

# 设置docker阿里云镜像
# cd /etc/docker/
# vim daemon.json
# {
# "registry-mirrors": ["https://mirror.ccs.tencentyun.com", "https://pfn30lpj.mirror.aliyuncs.com"]
# }

# 重启docker容器
# sudo systemctl restart docker


# 设置下格式不然win上传到linux运行不起来
#sudo find -name "*.sh" | xargs dos2unix

# 强制删除镜像
# docker rmi -f hello-world:latest
# docker update --restart=no <container_id>

# 重启容器
# docker restart jenkins

# 在windows上打开jenkins
# http://192.168.13.129:8080

# DOC: 查看密码
# [root@bogon home]# cat /data/jenkins_home/secrets/initialAdminPassword
# 870bcdc8051443a3bdf69edfa6b2649f


# DOC: 防火墙是否禁止22端口,禁止则打开
# firewall-cmd --query-port=22/tcp
# sudo firewall-cmd --add-port=2181/tcp --permanent
# sudo firewall-cmd --reload


# DOC: 打开机器的root认证权限 
# 需要打开权限,不然没办法拷贝到宿主机
# vim /etc/ssh/sshd_config
# PermitRootLogin: yes
# PasswordAuthentication:yes

#重启SSH服务使其生效
# systemctl restart sshd

# DOC: 在目标机上生成下公钥
# ssh-keygen -t rsa -C "1072772483@qq.com"

# DOC: 拷贝jenkins机器的公钥到目标机
# ssh-copy-id -i ~/.ssh/id_rsa.pub  root@192.168.13.130

# DOC: 如果下面的直接执行成功,没让输入密码,则说明可以了
# ssh root@192.168.13.130


# DOC: 进入到宿主机
# docker exec -it jenkins /bin/bash

# DOC: 容器内安装rsync
# apt update -y
# apt install rsync -y


#DOC: 打包镜像
# 新建Dockerfile文件
# [root@localhost demo]# docker build -t demo .
# 之后执行 docker images即可发现: demo镜像在里面了
#[root@localhost demo]# docker run -d -p 8082:8080 demo  // 在任意一个目录下运行
# docker ps                                              // 这样子可以看到,已经有一个demo的容器起来了 
# http://192.168.13.129:8082/test/hello                  // 发现已经可以运行了


# DOC: 部署脚本
# #想要部署到的游戏服
# SERVER_IP=192.168.13.130
# #游戏服目录
# APP_PATH=/home/demo
# echo

# echo WORKSPACE: ${WORKSPACE}
# echo

# echo "[打包java程序,并同步到远程服务器]"
# cd ${WORKSPACE}/demo
# mvn clean package
# rsync -avzrcI ${WORKSPACE}/demo/  root@$SERVER_IP:$APP_PATH
# echo

# echo "[在打包机上的2_UpdateServer传递到游戏服,并执行]"
# ls
# #ssh root@192.168.13.130 'bash -s' < ${WORKSPACE}/../../2_UpdateServer.sh
# echo


JENKINS_HOME_DIR="/data/jenkins_home"


if which docker > /dev/null 2>&1; then
    echo "已经存在docker"
else
    echo "不存在docker,开始安装"

    echo "准备docker环境"
    sudo dnf remove podman
    sudo rm -rf /etc/containers /etc/registries.conf /etc/containers/policy.json /etc/containers/storage.conf ~/.config/containers ~/.local/share/containers
    sudo dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
    sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 
    sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
    echo

    echo "安装docker"
    sudo dnf install docker-ce docker-ce-cli containerd.io -y
    echo

    echo "启动docker"
    sudo systemctl start docker
    echo

    echo "设置docker开机启动"
    sudo systemctl enable docker
    echo

    echo "打印安装的docker版本"
    sudo docker --version
    echo
fi


echo "[step1]:检测jenkins home"
# 检查目录是否成功创建
if [ -d "$JENKINS_HOME_DIR" ]; then
    echo "目录 $JENKINS_HOME_DIR 创建成功"

    chown -R 1000:1000 "$JENKINS_HOME_DIR"
    echo "目录 $JENKINS_HOME_DIR 设置读写权限"
else
    echo "已经存在 $JENKINS_HOME_DIR 目录."
fi  
echo  


echo "[step2]:检测docker镜像"
if docker images | grep -q "jenkins"; then
    echo "存在 Jenkins 镜像"
else
    echo "不存在 Jenkins 镜像,拉取镜像"
    docker pull jenkins/jenkins:lts
fi
echo 

echo "[step3]:检测docker是否运行着jenkins,没有运行则启动jenkins容器"
if docker ps -a| grep -q "jenkins"; then
    echo "存在名为 jenkins的容器,先删除"
    docker stop jenkins
    # 删除 jenkins 容器
    docker rm jenkins    
fi
echo

echo "[step4]:重新运行jenkins"
docker run -d -u root -p 8080:8080 -p 50000:50000 -v $JENKINS_HOME_DIR:/var/jenkins_home --restart=always --name jenkins jenkins/jenkins:lts
echo   

 需要注意: jenkins是运行在docker中,因此,是docker中与目标机之间的ssh认证,而不是宿主机!!!

三、初始化游戏服,安装docker

echo "[检测游戏服务器docker是否存在]"
if which docker > /dev/null 2>&1; then
    echo "游戏服务器已经存在docker"
else
    echo "游戏服务器不存在docker,开始安装"

    echo "准备docker环境"
    sudo dnf remove podman
    sudo rm -rf /etc/containers /etc/registries.conf /etc/containers/policy.json /etc/containers/storage.conf ~/.config/containers ~/.local/share/containers
    sudo dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
    sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 
    sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
    echo

    echo "安装docker"
    sudo dnf install docker-ce docker-ce-cli containerd.io -y
    echo

    echo "启动docker"
    sudo systemctl start docker
    echo

    echo "设置docker开机启动"
    sudo systemctl enable docker
    echo

    echo "打印安装的docker版本"
    sudo docker --version
    echo
fi
echo

四、打包机,配置jenkins 

不知道为何不使用https方式不识别!!!

选用的是maven风格的项目,如果没有安装maven插件,则选择下版本,并且自动下载

shell

#想要部署到的游戏服
SERVER_IP=192.168.13.130
#游戏服目录
APP_PATH=/home/demo
echo

echo WORKSPACE: ${WORKSPACE}
echo

echo "[打包java程序,并同步工程到远程服务器]"
cd ${WORKSPACE}/demo

# 选择maven风格的项目,就不需要自己打包了
#mvn clean package 

rsync -avzrcI ${WORKSPACE}/demo/  root@$SERVER_IP:$APP_PATH
echo

echo "[在游戏服上打包镜像,并运行起来]"
ssh root@${SERVER_IP} "cd ${APP_PATH}; docker stop demo; docker rm demo; docker rmi demo:1.0; docker build -t demo:1.0 .;  docker run -d -p 8082:8080 --name demo demo:1.0; "
echo

所以最核心的就是: rsync进行文件夹同步ssh root@server_ip "xxx"远程执行目标机上的shell文件。 

五、运行

TestController.java

package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {

    /**
     * http://localhost:8080/test/hello
     */
    @RequestMapping("/hello")
    public String hello() {
        return "Hello World 3";
    }
}

效果:

相关文章:

  • MacOs下解决远程终端内容复制并到本地粘贴板
  • Web渗透之文件包含漏洞
  • 分层对象模型:PO、DTO、VO、BO定义区别与使用场景
  • win10中快速访问部分外网的快捷设置方法
  • 【已更新完毕】2025泰迪杯数据挖掘竞赛B题数学建模思路代码文章教学:基于穿戴装备的身体活动监测
  • MySQL中的隐式转换和显式转换
  • 2025认证杯挑战赛B题【 谣言在社交网络上的传播 】原创论文讲解(含完整python代码)
  • java学习总结(if switch for)
  • Go:方法
  • 【Java】查看当前 Java 使用的垃圾回收器
  • 【GitHub探索】mcp-go,MCP协议的Golang-SDK
  • AVL搜索树
  • 互斥锁(mutex) ---- 静态锁与动态锁
  • (C语言)算法复习总结1——二分查找
  • 【T2I】Region-Aware Text-to-Image Generation via Hard Binding and Soft Refinement
  • GPT-2 语言模型 - 模型训练
  • 关于柔性数组
  • 开源项目faster-whisper和whisper是啥关系
  • C语言之continue相关题目
  • 剖析 Rust 与 C++:性能、安全及实践对比
  • 西北大学副校长成陕西首富?旗下巨子生物去年净利超20亿,到底持股多少
  • 梅花奖在上海丨陈丽俐“婺剧折戏专场”:文戏武做,武戏文唱
  • 为惩戒“工贼”,美国编剧工会“痛下杀手”
  • 长沙通报一出租房疑存非法代孕:查封涉事场所,相关人员被控制
  • 马上评丨摆摊要交芙蓉王?对吃拿卡要必须零容忍
  • 农行深圳市分行原副行长王国彪涉嫌严重违纪违法被查