DevOps实践-基于Harbor 、Jenkins、gitlab实现基础的java服务的CI

该博客详细介绍了如何利用DevOps工具实现Java服务的持续集成(CI)。首先,介绍了准备工作,包括软件准备、编译tomcat镜像并上传至Harbor。接着,将测试项目上传到gitlab,并配置Jenkins的参数化构建和流水线命令。通过Jenkins自动化构建,部署过程中涉及到了mysql的安装和配置。文章总结强调了CI流程中每个环节的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


基于上面三篇文章的环境准备,正式 进入实践篇

DevOps部署篇-docker部署gitlab

DevOps部署篇-Harbor的安装

DevOps部署篇-Jenkins的安装及配置webhook自动化构建

在这里插入图片描述

准备工作

软件准备

备用软件下载地址:

链接:https://pan.baidu.com/s/18_jXfd3e0vDTuf7hHbpcEg 密码:rknv
下载我们本文相关的tomcat的镜像及备用测试项目

编译tomcat镜像并上传Harbor

从我们下载地址下载到Dockerfile,和Tomcat的二进制文件 ;然后可以根据自己的情况修改,然后上传到Harbor容器中。内容比较简单就不多说了

FROM centos:7
MAINTAINER zhujohnle

ENV VERSION=8.5.43

RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \
    yum clean all && \
    rm -rf /var/cache/yum/*

COPY apache-tomcat-${VERSION}.tar.gz /
RUN tar zxf apache-tomcat-${VERSION}.tar.gz && \
    mv apache-tomcat-${VERSION} /usr/local/tomcat && \
    rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \
    mkdir /usr/local/tomcat/webapps/test && \
    echo "ok" > /usr/local/tomcat/webapps/test/status.html && \
    sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/tomcat/bin

WORKDIR /usr/local/tomcat

EXPOSE 8080
CMD ["catalina.sh", "run"]

特别注意下面这段,研究发现tomcat启动慢是由于catalinah.sh 中有那么一段通过随机数来做处理,把这段替换掉来提升tomcat的启动速度

sed -i ‘1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"’ /usr/local/tomcat/bin/catalina.sh && \

执行编译并上传我们自己的Harbor环境

docker build .
docker pull 192.168.8.250/library/tomcat:v1

上传的过程中会因为我们本地未配置https,导致上传无法被信任因此需要对我们的Harbor仓库的地址加入可信任,在上传镜像的机器上

添加Harbor服务地址为可信任

由于habor未配置https,还需要在docker配置可信任。

# cat /etc/docker/daemon.json 
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
  "insecure-registries": ["192.168.8.250"]
}
# systemctl restart docker

然后继续上传操作,上传Harbor成功以后我们在library中就可以看到tomcat的镜像

在这里插入图片描述

上传测试项目到gitlab

这里可以把我们已经下载好的tomcat-java-demo-master.zip 解压后上传到我们的gitlab中。这里需要用到mysql,后面我们在讲怎么在编译完成发布镜像后,进行部署的问题。

jenkins脚本及执行

先给大家看一下运行成功的一个样子,我们在jenkins上创建一个PipeLine的项目后,编译完成后如果没有问题,会显示我们流水线每一个步骤耗时和是否成功或者错误日志等。
在这里插入图片描述

言归正传,我们开始正式的jenkins的配置这个是重头戏。

新建任务

这里如果Jenkins安装插件是安装所有默认插件的话,Pipeline插件和git插件都已经安装,新建任务的时候就能看到流水线任务的选项,否则需要自己在插件管理中安装对应的插件。这里我们起名叫 ci_java_demo
在这里插入图片描述

参数化构建

我们可以在项目配置中添加参数化过程,定义一个Branch的参数,用作后续我们项目的git分支使用默认名称为master,这个我们在后续点击构建的时候可以动态的调整
在这里插入图片描述

配置流水线命令

在这里插入图片描述

我们把如下的命令粘贴到脚本里,这里看到配置的语法使用的Groovy语言

register 变量,用作harbor仓库地址
project 变量,对应的是harbor的工程名称
app_name 变量,对应的就是工程打包后容器的名称
image_name变量,这里就是对应的harbor全路径,其中BUILD_NUMBER是jenkins当前项目的编译次数;Branch为上面我们自己定义的变量名称
docker_registry_auth jenkins配置的Harbor的账号密码全局凭据id
git_authjenkins配置的gitlab的账号密码全局凭据id

def registry = "192.168.8.250"
def project = "dev"
def app_name = "ci_java_demo"
def image_name = "${registry}/${project}/${app_name}:${Branch}-${BUILD_NUMBER}"
def git_address = "http://192.168.8.250:8090/chuangqi/tomcat-java-demo-master.git"
def docker_registry_auth = "c284ac92-e9d3-4b7f-bfb5-db7c069790c1"
def git_auth = "14e0c33f-dcba-4ca0-8780-187606e7d62a"

pipeline {
    agent any
    stages {
        stage('拉取代码'){
            steps {
              checkout([$class: 'GitSCM', branches: [[name: '${Branch}']], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
            }
        }

        stage('代码编译'){
           steps {
             sh """
                JAVA_HOME=/usr/local/jdk
                PATH=$JAVA_HOME/bin:/usr/local/maven/bin:$PATH
                mvn clean package -Dmaven.test.skip=true
                """ 
           }
        }

        stage('构建镜像'){
           steps {
                withCredentials([usernamePassword(credentialsId: "${docker_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
                sh """
                  echo '
                    FROM ${registry}/library/tomcat:v1
                    LABEL maitainer lizhenliang
                    RUN rm -rf /usr/local/tomcat/webapps/*
                    ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
                  ' > Dockerfile
                  docker build -t ${image_name} .
                  docker login -u ${username} -p '${password}' ${registry}
                  docker push ${image_name}
                """
                }
           } 
        }

        stage('部署到Docker'){
           steps {
              sh """
              REPOSITORY=${image_name}
              docker rm -f tomcat-java-demo |true
              docker container run -d --name tomcat-java-demo --restart=always -p 88:8080 ${image_name}
              """
            }
        }
    }
}
  • 我们可以看到流水线脚本语言stage代表一个步骤
  • sh “”" “”" 部分就是可以执行的sh语法,中间我们可以写任意的命令即可,但是需要jenkiens容器支持,如pwd ,ls等默认都支持的

当然我们也可以通过自动生成的形式来得到流水线脚本 方式如下图,也就是根据我们配置的属性及参数进行生成。可以先用这种尝试。

在这里插入图片描述
在这里插入图片描述

检查后编译build

当我们检查流程没问题以后,返回目录开始build,就可以进入正式的执行状态,执行结果成功或者失败,如果一次成功恭喜你就看到了我们刚开始的那个全绿色状态,但是如果是刚开始弄这块的话多少会有些问题,不过不用担心,我们可以根据提示的log针对性的去解决。
在这里插入图片描述

成功和失败的样式,并根据logs详情去逐步解决
在这里插入图片描述
安装包的项目默认会安装到本jenkins服务器上,并生产新的容器映射端口88,如果浏览器访问没问题的话就说明到这一步就算流程成功了

在这里插入图片描述
但是我们这里因为项目默认服务器配置是localhost:3306 ,但是我们这个跑起来的容器里并没有集成mysql镜像,因此我们需要在jenkins的宿主机重新安装mysql,并且修改数据库配置为当前主机ip 192.168.8.251:3306 并提交代码重新执行编译流水线。

为宿主机器安装mysql

这里为了方便就简单安装一下mariadb

yum install mariadb-server -y
systemctl start mariadb
mysqladmin -u root password ’123456!@#’

修改root用户为外部可以访问

  • 通过授权的形式修改root用户可以从外部访问所有数据表
mysql -uroot -p
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
mysql>flush privileges;
  • 添加ip端口的过滤
 sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
 service iptables restart

基本上到这里在访问我们测试的demo地址就可以正常跑整个项目了,我们今天的ci的这套流程也就到这里结束了

总结

在做cicd这些流程的时候,一定要对每个细节把控清楚,这样出问题的时候才会很方便的找到问题原因及把控解决问题的方案。有这样的基本流程以后我们在上面做扩展就方便多了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值