gpt4 book ai didi

使用Jenkins部署Git仓库微服务项目

转载 作者:我是一只小鸟 更新时间:2023-08-16 22:31:48 25 4
gpt4 key购买 nike

Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具。本文使用Jenkins自动构建git仓库中的微服务项目,包括Jenkins的安装,插件的安装;系统环境的配置;docker镜像构建的远程SSH命令;部署到指定的机器等.

部署Jenkins

安装Jenkins

Jenkins的官方安装文档地址:

https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos 。

下面以CentOS为例演示安装过程:

使用下面命令,Jenkins添加仓库 。

                        
                          sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key

                        
                      

如果已经导入过key, rpm --import 可能会报错,忽略,继续下面命令:

                        
                          yum install fontconfig java-11-openjdk
yum install jenkins

                        
                      

配置Jenkins

使用下面命令编辑服务 。

                        
                          vim /usr/lib/systemd/system/jenkins.service

                        
                      

修改用户为root 。

                        
                          User=root
Group=root

                        
                      

修改启动端口 。

                        
                          Environment="JENKINS_PORT=16060"

                        
                      

修改完成后使用下面命令应用:

                        
                          systemctl daemon-reload

                        
                      

启动Jenkins

使用以下命令启用Jenkins服务在启动时启动:

                        
                          sudo systemctl enable jenkins

                        
                      

使用以下命令启动Jenkins服务:

                        
                          sudo systemctl start jenkins

                        
                      

使用命令检查Jenkins服务的状态:

                        
                          sudo systemctl status jenkins

                        
                      

如果你启动报错:

                        
                          Job for jenkins.service failed because a timeout was exceeded. See "systemctl status jenkins.service" and "journalctl -xe" for details.

                        
                      

可使用下面方式:

  • 方式一:

                                
                                  d /etc/init.d
    # 启动 
    ./jenkins start 
    # 停止 
    ./jenkins stop 
    # 状态 
    ./jenkins status
    
                                
                              
  • 方式二:

    修改配置文件中的用户名为root 。

                                
                                  # 老版本
    vim /etc/sysconfig/jenkins
    JENKINS_USER="root"
    
    # 新版本
    vim /usr/lib/systemd/system/jenkins.service
    修改为: 
    User=root
    Group=root
    
                                
                              

更多解决方案见:

https://zhuanlan.zhihu.com/p/609882788 。

解锁Jenkins

当您首次访问新的Jenkins实例时,系统会要求您使用自动生成的密码来解锁它.

  1. 浏览器访问: http://ip:16060 (自己配置的端口),等到解锁Jenkins页面出现 。

  2. 从Jenkins控制台日志输出中,复制自动生成的字母数字密码(在2组星号之间).

                                
                                  cat /var/lib/jenkins/secrets/initialAdminPassword
    
                                
                              

后续初始化

解锁Jenkins之后,可以选择安装Jenkins的插件,根据需要选择 。

  • 安装建议的插件
  • 选择插件去安装

之后,创建管理员用户.

我这里直接跳过了上述步骤,如果你和我一样,请使用下面账户登陆 。

账户:admin 。

密码: cat /var/lib/jenkins/secrets/initialAdminPassword 。

更改密码 。

进入控制面板后,坐上角点击账户名进入 Configure ,找到 Password ,修改之后 Save 即可.

安装所需插件

在面板页面点击 Manage Jenkins ,在 System Configuration 下点击 Plugins 。

在插件页面,左侧选择 Available plugins 。

为了方便自动部署仓库中的微服务项目,请安装如下插件:

  • Localization: Chinese (Simplified) :中文汉化插件 。

  • Docker :Docker集成插件(可不安装应该) 。

  • GitLab Plugin :GitLab集成插件 。

  • Publish Over SSH :远程发布插件 。

  • SSH2 Easy :远程脚本执行插件 。

安装后需要重启Jenkins 。

系统配置

在CentOS中还需要安装如下:

  • JDK环境
  • Maven环境
  • Docker环境

安装JDK

本次安装的JDK版本为 11.0.20 和自己项目的JDK版本保持一致最合适 。

JDK下载地址: https://www.oracle.com/cn/java/technologies/downloads/#java11 。

下载之后解压到服务器的 /usr/java/ 目录下,重命名为 jdk-11.0.20 。

                        
                          tar -zxvf jdk-11.0.20_linux-x64_bin.tar.gz

                        
                      

添加配置信息 。

                        
                          vim /etc/profile

                        
                      

添加如下内容:

                        
                          JAVA_HOME=/usr/java/jdk-11.0.20
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH

                        
                      

保存之后,使用下面命令应用:

                        
                          source /etc/profile

                        
                      

使用下面命令验证安装 。

                        
                          java -version

                        
                      

安装Maven

Maven下载地址: https://maven.apache.org/download.cgi 。

下载到 /usr/local/maven/ ,目录下并解压:

                        
                          tar -zxvf apache-maven-x.x.x-bin.tar.gz

                        
                      

添加阿里云镜像地址 。

                        
                          vim /usr/local/maven/apache-maven-3.9.3/conf/settings.xml

                        
                      

找到 mirrors ,添加镜像地址 。

                        
                          <mirror>
  <id>aliyunmaven</id>
  <mirrorOf>*</mirrorOf>
  <name>阿里云公共仓库</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

                        
                      

添加配置信息 。

                        
                          vim /etc/profile

                        
                      

修改为如下内容:

                        
                          JAVA_HOME=/usr/java/jdk-11.0.20
MAVEN_HOME=/usr/local/maven/apache-maven-3.9.3
PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH MAVEN_HOME

                        
                      

保存之后,使用下面命令应用:

                        
                          source /etc/profile

                        
                      

使用下面命令验证安装 。

                        
                          mvn -v

                        
                      

安装Docker

Docker官方安装文档: https://docs.docker.com/engine/install/centos/ 。

安装yum工具 。

                        
                          yum install -y yum-utils

                        
                      

更新本地镜像源 。

                        
                          yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

yum makecache fast

                        
                      

安装Docker 。

                        
                          yum install -y docker-ce

                        
                      

启动docker 。

                        
                          sudo systemctl start docker

                        
                      

使用下面命令验证安装 。

                        
                          docker -v

                        
                      

配置Docker镜像加速 。

阿里云镜像加速配置文档:

https://help.aliyun.com/zh/acr/user-guide/accelerate-the-pulls-of-docker-official-images 。

安装Git

使用下面命令安装即可 。

                        
                          yum install -y git

                        
                      

配置Jenkins

配置Jenkins的Tool,在面板页面点击 Manage Jenkins 。

配置SSH

在 System Configuration 下点击 System ,找到 Server Group Center 新增一个 Group 。

新增一个 Server 。

配置JDK

在 System Configuration 下点击 Tools ,找到 JDK ,勾掉 Install automatically ,选择系统安装的JDK 。

配置Git

勾掉 Install automatically ,选择系统安装的Git 。

配置Maven

勾掉 Install automatically ,选择系统安装的Maven 。

配置Docker

勾掉 Install automatically ,选择系统安装的Docker 。

配置完成后点击 Save 保存即可! 。

部署微服务

推送微服务

推送微服务到仓库中,使用Gitee新建仓库,并将微服务父工程及其子模块全部推送到Gitee仓库 。

修改项目配置

在有 src 目录但是没有启动类的子模块的pom文件中加入一下内容:

                        
                          <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>none</mainClass>
                <classifier>execute</classifier>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

                        
                      

在需要构建镜像的服务子模块的pom中加入如下内容,注意修改jar文件名,和服务名保持一致 。

                        
                          <properties>
    <docker.image>docker_storage</docker.image>
</properties>

<build>
    <!-- 打包的jar包文件名 -->
    <finalName>leadnews-article</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>dockerfile-maven-plugin</artifactId>
            <version>1.3.6</version>
            <configuration>
                <repository>${docker.image}/${project.artifactId}</repository>
                <buildArgs>
                    <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                </buildArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

                        
                      

在需要构建镜像的服务子模块的根目录(和 src 以及 target 同级)创建Dockerfile文件 。

                        
                          FROM openjdk:11
VOLUME /tmp

ARG JAR_FILE
COPY ${JAR_FILE} app.jar

ENV JAVA_OPTS="\
-server \
-Xms256m \
-Xmx512m \
-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=512m"

# 空参数,方便创建内容时传参
ENV PARAMS=""
ENTRYPOINT ["sh", "-c", "java -jar ${JAVA_OPTS} /app.jar ${PARAMS}"]

                        
                      
  • JAR_FILE 是构建参数,在pom文件中有定义

修改yaml配置信息(可不修改) 。

                        
                          spring:
  profiles:
    active: prod

                        
                      

修改完成后,重新推送到仓库中!! 。

修改Nacos配置

如果使用了Nacos作为配置中心,还需要进行如下修改 。

将配置名改为 leadnews-user-dev.yml 和 leadnews-user-prod.yml 各一份 。

  • leadnews-user-dev.yml :为开发配置
  • leadnews-user-prod.yml :为生产配置
  • leadnews-user :为微服务的 spring.application.name

安装模块到Maven

在微服务分模块开发中,这步是必不可少的。为了保证所有模块的依赖正确性,需要提前将所有模块安装到Maven仓库中.

创建Jenkins任务,在首页右侧点击新建任务,选择 构建一个自由风格的软件项目 ,点击确定; 。

在 配置 页面的源码管理部分,添加一个Git仓库, Credentials 为Git仓库的用户名和密码 。

  • 注意修改分支

在 Build Steps 中新增一个构建步骤,选择 调用顶层 Maven 目标 。

版本选择自己配置的Maven,目标中填入install命令 。

                        
                          clean install -Dmaven.test.skip=true

                        
                      

完成后点击 保存 即可,在新页面点击右侧 立即构建 。

                        
                          [INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for lead-news 0.0.1-SNAPSHOT:
[INFO] 
[INFO] lead-news .......................................... SUCCESS [  1.347 s]
[INFO] leadnews-model ..................................... SUCCESS [  5.066 s]
[INFO] leadnews-utils ..................................... SUCCESS [  0.576 s]
[INFO] leadnews-common .................................... SUCCESS [  2.494 s]
[INFO] leadnews-feign-api ................................. SUCCESS [  0.982 s]
[INFO] leadnews-gateway ................................... SUCCESS [  0.318 s]
[INFO] leadnews-app-gateway ............................... SUCCESS [  0.641 s]
[INFO] leadnews-wemedia-gateway ........................... SUCCESS [  0.665 s]
[INFO] leadnews-service ................................... SUCCESS [  0.141 s]
[INFO] leadnews-user ...................................... SUCCESS [  1.374 s]
[INFO] leadnews-basic ..................................... SUCCESS [  0.016 s]
[INFO] leadnews-file-starter .............................. SUCCESS [  0.787 s]
[INFO] leadnews-article ................................... SUCCESS [  2.475 s]
[INFO] leadnews-wemedia ................................... SUCCESS [  2.404 s]
[INFO] leadnews-schedule .................................. SUCCESS [  1.330 s]
[INFO] leadnews-search .................................... SUCCESS [  2.417 s]
[INFO] leadnews-behavior .................................. SUCCESS [  1.913 s]
[INFO] leadnews-test ...................................... SUCCESS [  0.057 s]
[INFO] es-init ............................................ SUCCESS [  0.619 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  26.854 s
[INFO] Finished at: 2023-08-15T13:50:30+08:00
[INFO] ------------------------------------------------------------------------
Finished: SUCCESS

                        
                      

构建Docker镜像

这一步是将提供服务的微服务模块构建为Docker镜像,确保该模块的pom文件配置了构建命令,且根目录下有Dockerfile文件;否则参考 修改项目配置 。

1、同样创建一个 自由风格 的Jenkins任务,Git仓库配置同上 。

2、在 Build Steps 中添加 调用顶层 Maven 目标 ,目标中填入如下命令:

                        
                          clean install -Dmaven.test.skip=true dockerfile:build -f leadnews-service/leadnews-user/pom.xml

                        
                      
  • -f [path]/pom.xml :其中 path 为pom文件在仓库中的位置

3、在 Build Steps 中添加 执行 shell ,目标中填入如下命令:

                        
                          if [ -n "$(docker ps -a -f name=$JOB_NAME --format '{{.ID}}')" ]; then
  # 删除之前的容器
  docker rm -f $(docker ps -a -f name=$JOB_NAME --format '{{.ID}}')
fi
# 清理镜像
docker image prune -f
# 启动docker服务
docker run -d --net=host -e PARAMS="--spring.profiles.active=prod" --name $JOB_NAME docker_storage/$JOB_NAME

                        
                      
  • #JOB_NAME 为Jenkins任务的名称, 需要和构建的jar包文件名以及Docker镜像名保持一致

构建日志:

                        
                          [INFO] Building jar: /var/lib/jenkins/workspace/leadnews-user/leadnews-service/leadnews-user/target/leadnews-user-docker-info.jar
[INFO] Successfully built docker_storage/leadnews-user:latest
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  18.869 s
[INFO] Finished at: 2023-08-16T13:16:25+08:00
[INFO] ------------------------------------------------------------------------
[leadnews-user] $ /bin/sh -xe /tmp/jenkins7230786785147070619.sh
++ docker ps -a -f name=leadnews-user --format '{{.ID}}'
+ '[' -n de7f106527bc ']'
++ docker ps -a -f name=leadnews-user --format '{{.ID}}'
+ docker rm -f de7f106527bc
de7f106527bc
+ docker image prune -f
+ docker run -d --net=host -e PARAMS=--spring.profiles.active=prod --name leadnews-user docker_storage/leadnews-user
ee78a237a4d8647b5e305f2d0a12b437ddc887d69d63e04dd6d238d67b6f705c
Finished: SUCCESS

                        
                      

来到系统中,查看构建的镜像 。

                        
                          [root@VM-28-13-centos maven]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
docker_storage/leadnews-user      latest              61d0675c5e36        2 minutes ago       759 MB

                        
                      

查看运行的容器 。

                        
                          [root@VM-28-13-centos maven]# docker ps
CONTAINER ID        IMAGE                          CREATED             STATUS              PORTS                               NAMES
ee78a237a4d8        docker_storage/leadnews-user   3 minutes ago       Up 3 minutes                                            leadnews-user

                        
                      

部署到指定机器

如果需要将构建的镜像在其他机器上启动,需要配置一个镜像仓库,将构建的镜像推送到镜像仓库,然后其他机器从镜像仓库中拉取镜像并启动容器 。

镜像仓库

下载最新Registry镜像 。

                        
                          docker pull registry

                        
                      

启动Registry镜像服务 。

                        
                          docker run -d -p 5000:5000 --name registry -v /usr/local/docker/registry:/var/lib/registry registry

                        
                      

访问地址:

                        
                          http://ip:5000/v2/_catalog

                        
                      

对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容 。

                        
                          {
  "insecure-registries": [
    "ip:5000"
  ]
}

                        
                      

重启Dokcer 。

                        
                          systemctl restart docker

                        
                      

创建任务

构建参数 。

                        
                          名称: docker_registry 	 # 仓库名
默认值: 124.221.23.47:5000 # 镜像仓库地址

                        
                      

shell脚本 。

                        
                          image_tag=$docker_registry/docker_storage/$JOB_NAME
echo '================docker镜像清理================'
if [ -n "$(docker ps -a -f name=$JOB_NAME --format '{{.ID}}')" ]; then
  # 删除之前的容器
  docker rm -f $(docker ps -a -f name=$JOB_NAME --format '{{.ID}}')
fi
# 清理镜像
docker image prune -f

# 创建TAG
docker tag docker_storage/$JOB_NAME $image_tag
echo '================docker镜像推送================'
# 推送镜像
docker push $image_tag
# 删除Tag
docker rmi $image_tag
echo '================docker镜像清理================'

                        
                      

新增构建步骤,选择 远程执行命令 。

                        
                          echo '================拉取最新镜像================'
docker pull $docker_registry/docker_storage/$JOB_NAME

echo '================删除清理容器镜像================'
if [ -n "$(docker ps -a -f name=$JOB_NAME --format '{{.ID}}')" ]; then
  # 删除之前的容器
  docker rm -f $(docker ps -a -f name=$JOB_NAME --format '{{.ID}}')
fi
# 清理镜像
docker image prune -f

echo '================启动容器================'
docker run -d --net=host -e PARAMS="--spring.profiles.active=prod" --name $JOB_NAME $docker_registry/docker_storage/$JOB_NAME

                        
                      

最后此篇关于使用Jenkins部署Git仓库微服务项目的文章就讲到这里了,如果你想了解更多关于使用Jenkins部署Git仓库微服务项目的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com