Jenkins+Git+Maven自动化部署配置

news2024/10/6 4:09:13

Jenkins+Git+Maven自动化部署配置

  • 基本思路
  • 1、jenkins安装maven依赖
  • 2、git安装
  • 3、Jenkins中新建任务
    • 3.1 git配置
    • 3.2 maven配置
    • 3.3 pom.xml配置
    • 3.4 build
  • 4、自动化发布到测试服务器并自动执行(Test-server)
    • 4.1 安装Publish Over SSH插件
    • 4.2 修改Post Steps配置
    • 4.3 执行构建
  • 5、小插曲
    • 4.1 构建的时候报错找不到jdk
    • 4.2 阿里云镜像配置
    • 4.3 配置testserver之后构建异常

基本思路

image-20230107211213527

服务器配置如下:

192.168.159.50 gitlab服务器(Gitlab,内存至少5个G,要不根本跑不动)

192.168.159.51 jenkins服务器(Jenkins-Server+Maven+JDK)

192.168.158.52 测试服务器(JDK)

1、jenkins安装maven依赖

image-20230107174445281

image-20230107174432629

2、git安装

git安装

这里先在jenkins这台机器上装个git

yum install -y git

image-20230107175826820

3、Jenkins中新建任务

新建一个任务,这里选择构建一个maven项目

image-20230107174543897

项目名称写first

image-20230107174603376

3.1 git配置

image-20230107174705545

输入项目地址(就是我们在自己gitlab服务器上的项目地址)

image-20230107180355689
选择分支,看你的是master分支还是main分支
image-20230107180526759

3.2 maven配置

这里写你jenkins服务器上的maven安装位置:我的是/usr/local/maven

image-20230107180845359

3.3 pom.xml配置

代码仓库中pom.xml的位置
image-20230107182015492

这里还要看你pom.xml文件的位置,如果不是直接暴露在仓库最外层,比如在demo目录下,那就要写成demo/pom.xml

3.4 build

点击构建按钮

image-20230107210906999

查看控制台输出:
image-20230107210033005

看到如下页面说明打包完成了。
image-20230107205137340

Dashboard这里也可以看到成功了,并且显示出了曾经成功和失败的时间

image-20230107210504969

去jenkins服务器上面查看是否打包成功,如下,可以看到target目录和jar包说明打包成功了

image-20230107205216694

运行jar包测试一下

java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8888

image-20230107205314375

这个只是个测试项目,只有一个负责测试的Controller,结构大概如下

image-20230107211031304

测试下简单的业务类,访问:http://192.168.159.51:8888/index/hello

image-20230107210350535

简单业务类的测试也没有任何的问题。这样一个简单的自动化部署就完成了,但是我们还想自动把jar包传到测试服务器(192.168.159.52)上面执行,而不是我们去手动执行jar包。

4、自动化发布到测试服务器并自动执行(Test-server)

4.1 安装Publish Over SSH插件

先在jenkins服务器上安装个插件:Publish Over SSH

image-20230107212220556

选中,点击Install without restart

image-20230107212301949

4.2 修改Post Steps配置

image-20230107214419334

1、由于还没有添加测试服务器,先去System Configuration中配置

image-20230107214542507

2、在Configure System菜单里 往下拉,找到Publish over SSH

image-20230107214605456

3、添加一台目标服务器:这里我的测试服务器IP是192.168.159.52

4、测试下链接是否正常,左下角显示Success说明连接没问题
image-20230108192905445

5、再去看Post Steps中,选择Send files or execute commands over SSH

这里就可以看到我们刚才添加的testserver了,如下图所示。

image-20230108193352059

6、发布到远程服务器的配置

image-20230108201037944

这样让远程测试服务器上的jar包以后台进程方式启动

4.3 执行构建

image-20230108201449189
查看控制台输出

image-20230108201506507

查看jar包是否传到了测试服务器上,如下图。

image-20230108201903673

查看测试服务器是否执行了启动jar包的脚本(脚本就是我们在Post Steps配置的那一行)

jps

image-20230108201600380

可以看到,jar包已经被执行了。

验证业务类是否可访问,192.168.159.52:8888/index/hello

image-20230108201657871

好了,到此我们已经了解了持续集成和持续部署的基本操作,当然,这些还都是皮毛,后面再研究下。

5、小插曲

4.1 构建的时候报错找不到jdk

默认yum安装java的时候会显示安装的是openjdk1.8,实则实际上只安装了jre

yum install -y java-devel

image-20230107202714630

4.2 阿里云镜像配置

修改/usr/local/maven/conf/settings.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<!--
 | This is the configuration file for Maven. It can be specified at two levels:
 |
 |  1. User Level. This settings.xml file provides configuration for a single user,
 |                 and is normally provided in ${user.home}/.m2/settings.xml.
 |
 |                 NOTE: This location can be overridden with the CLI option:
 |
 |                 -s /path/to/user/settings.xml
 |
 |  2. Global Level. This settings.xml file provides configuration for all Maven
 |                 users on a machine (assuming they're all using the same Maven
 |                 installation). It's normally provided in
 |                 ${maven.conf}/settings.xml.
 |
 |                 NOTE: This location can be overridden with the CLI option:
 |
 |                 -gs /path/to/global/settings.xml
 |
 | The sections in this sample file are intended to give you a running start at
 | getting the most out of your Maven installation. Where appropriate, the default
 | values (values used when the setting is not specified) are provided.
 |
 |-->
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
  <localRepository>${user.home}/.m2/repository</localRepository>
  <!-- interactiveMode
   | This will determine whether maven prompts you when it needs input. If set to false,
   | maven will use a sensible default value, perhaps based on some other setting, for
   | the parameter in question.
   |
   | Default: true
  <interactiveMode>true</interactiveMode>
  -->

  <!-- offline
   | Determines whether maven should attempt to connect to the network when executing a build.
   | This will have an effect on artifact downloads, artifact deployment, and others.
   |
   | Default: false
  <offline>false</offline>
  -->

  <!-- pluginGroups
   | This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.
   | when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers
   | "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.
   |-->
  <pluginGroups>
    <!-- pluginGroup
     | Specifies a further group identifier to use for plugin lookup.
    <pluginGroup>com.your.plugins</pluginGroup>
    -->
    <pluginGroup>org.mortbay.jetty</pluginGroup>
  </pluginGroups>

  <!-- proxies
   | This is a list of proxies which can be used on this machine to connect to the network.
   | Unless otherwise specified (by system property or command-line switch), the first proxy
   | specification in this list marked as active will be used.
   |-->
  <proxies>
    <!-- proxy
     | Specification for one proxy, to be used in connecting to the network.
     |
    <proxy>
      <id>optional</id>
      <active>true</active>
      <protocol>http</protocol>
      <username>proxyuser</username>
      <password>proxypass</password>
      <host>proxy.host.net</host>
      <port>80</port>
      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>
    -->
  </proxies>

  <!-- servers
   | This is a list of authentication profiles, keyed by the server-id used within the system.
   | Authentication profiles can be used whenever maven must make a connection to a remote server.
   |-->
  <servers>
    <!-- server
     | Specifies the authentication information to use when connecting to a particular server, identified by
     | a unique name within the system (referred to by the 'id' attribute below).
     | 
     | NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are 
     |       used together.
     |
    <server>
      <id>deploymentRepo</id>
      <username>repouser</username>
      <password>repopwd</password>
    </server>
    -->
    
    <!-- Another sample, using keys to authenticate.
    <server>
      <id>siteServer</id>
      <privateKey>/path/to/private/key</privateKey>
      <passphrase>optional; leave empty if not used.</passphrase>
    </server>
    -->
    <server>
        <id>releases</id>
        <username>ali</username>
        <password>ali</password>
      </server>
      <server>
        <id>Snapshots</id>
        <username>ali</username>
        <password>ali</password>
      </server>
  </servers>

  <!-- mirrors
   | This is a list of mirrors to be used in downloading artifacts from remote repositories.
   |
   | It works like this: a POM may declare a repository to use in resolving certain artifacts.
   | However, this repository may have problems with heavy traffic at times, so people have mirrored
   | it to several places.
   |
   | That repository definition will have a unique id, so we can create a mirror reference for that
   | repository, to be used as an alternate download site. The mirror site will be the preferred
   | server for that repository.
   |-->
  <mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
     -->
    <mirror>
      <!--This sends everything else to /public -->
      <id>nexus</id>
      <mirrorOf>*</mirrorOf> 
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    </mirror>
    <mirror>
      <!--This is used to direct the public snapshots repo in the 
          profile below over to a different nexus group -->
      <id>nexus-public-snapshots</id>
      <mirrorOf>public-snapshots</mirrorOf> 
      <url>http://maven.aliyun.com/nexus/content/repositories/snapshots/</url>
    </mirror>
    <mirror>
      <!--This is used to direct the public snapshots repo in the 
          profile below over to a different nexus group -->
      <id>nexus-public-snapshots1</id>
      <mirrorOf>public-snapshots1</mirrorOf> 
      <url>https://artifacts.alfresco.com/nexus/content/repositories/public/</url>
    </mirror>
  </mirrors>

  <!-- profiles
   | This is a list of profiles which can be activated in a variety of ways, and which can modify
   | the build process. Profiles provided in the settings.xml are intended to provide local machine-
   | specific paths and repository locations which allow the build to work in the local environment.
   |
   | For example, if you have an integration testing plugin - like cactus - that needs to know where
   | your Tomcat instance is installed, you can provide a variable here such that the variable is
   | dereferenced during the build process to configure the cactus plugin.
   |
   | As noted above, profiles can be activated in a variety of ways. One way - the activeProfiles
   | section of this document (settings.xml) - will be discussed later. Another way essentially
   | relies on the detection of a system property, either matching a particular value for the property,
   | or merely testing its existence. Profiles can also be activated by JDK version prefix, where a
   | value of '1.4' might activate a profile when the build is executed on a JDK version of '1.4.2_07'.
   | Finally, the list of active profiles can be specified directly from the command line.
   |
   | NOTE: For profiles defined in the settings.xml, you are restricted to specifying only artifact
   |       repositories, plugin repositories, and free-form properties to be used as configuration
   |       variables for plugins in the POM.
   |
   |-->
   <profiles> 
    <profile>
      <id>development</id>
      <repositories>
        <repository>
          <id>central</id>
          <url>http://central</url>
          <releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
          <snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
        </repository>
      </repositories>
     <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <url>http://central</url>
          <releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
          <snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
    <profile>
      <!--this profile will allow snapshots to be searched when activated-->
      <id>public-snapshots</id>
      <repositories>
        <repository>
          <id>public-snapshots</id>
          <url>http://public-snapshots</url>
          <releases><enabled>false</enabled></releases>
          <snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
        </repository>
      </repositories>
     <pluginRepositories>
        <pluginRepository>
          <id>public-snapshots</id>
          <url>http://public-snapshots</url>
          <releases><enabled>false</enabled></releases>
          <snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
 
   <activeProfiles>
    <activeProfile>development</activeProfile>
    <activeProfile>public-snapshots</activeProfile>
   </activeProfiles>

  <!-- activeProfiles
   | List of profiles that are active for all builds.
   |
  <activeProfiles>
    <activeProfile>alwaysActiveProfile</activeProfile>
    <activeProfile>anotherAlwaysActiveProfile</activeProfile>
  </activeProfiles>
  -->
</settings>

4.3 配置testserver之后构建异常

Exception when publishing, exception message [Exec timed out or was interrupted after 120,001 ms]

参考了其他大佬的文章,需要勾选Exec in pty选项

image-20230108201300736

然后重新构建就成功了

image-20230108201343290

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/149587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实战6 :基于mmdetection搭建Faster R-CNN实现酒液杂质检测

项目介绍: 本教程讲述如何解决依赖运动变化来区分目标的目标检测问题。以酒液杂质目标检测为例,讲述如何合理利用运动的酒液图像来设计算法进行杂质的检测。通过学习掌握依赖运动变化区分目标的检测任务的解决方法。首先我们对酒液杂质检验任务做了简要介绍。接下来再对数据…

【C进阶】qsort函数详解

qsort函数前言qsort函数&#xff08;一&#xff09;引例&#xff1a;简单的冒泡排序&#xff08;二&#xff09;qsort函数接收1.介绍2.void*&#xff08;三&#xff09;使用1.用qsort实现一个比较整型的函数2.用qsort实现一个比较结构体的函数3.用qsort实现一个比较浮点型的函数…

试读:目标检测定义及技术详解

1.通用目标检测Generic Object Detection定义 目标检测旨在从图像、视频或者类似高维数据中定位大量预定义类别的物体实例&#xff0c;原始的图像、视频或类似数据经过数据预处理后&#xff0c;进入目标检测模型进行前向预测&#xff0c;最终得到数据中每个实例的位置以及该实…

Compose 动画入门 (一) : animateXxxAsState 实现放大/缩小/渐变等效果

1. 前言 动画是Android Compose中很重要的一块内容。利用Compose可以简洁地定义动画&#xff0c;我们可以轻松快速地通过动画让应用变得生动有趣。 本文会介绍如何定义一个最简单的Compose动画&#xff0c;从而实现Compose动画。 1.1 定义一个Box 首先&#xff0c;我们先定义…

关于volatile解决内存可见性问题(保证线程安全)

Volatile是和内存可见性问题是密切相关的。先看下面一段代码&#xff0c;执行结果是什么&#xff1f; class MyCount{public int flag 0; } public class ThreadDemo15 {public static void main(String[] args) {MyCount myCount new MyCount();Thread t1 new Thread(()-&…

B站涨粉十万+!B站up主如何吸引高质量粉丝?

如何在b站快速增长粉丝&#xff0c;b站如何快速涨粉丝&#xff0c;这是所有Up主都关心的问题&#xff0c;对于初来乍到B站的up主来说&#xff0c;发布的作品内容是极为重要的&#xff0c;B站最初的粉丝积累往往都是靠这些在B站生产的视频。作品是否精彩&#xff0c;能否吸引粉丝…

AutoCAD打开文件提示“无法识别的版本,不能读取”

今天遇到一个很奇怪的问题&#xff0c;在CAD中执行自己创建的命令并关闭文档之后&#xff0c;重新打开CAD提示“无法识别的版本&#xff0c;不能读取”错误对话框。 后来查询资料&#xff0c;发现这是CAD的一个老bug了。原因是该dwg文档所在的目录下某个文件的文件名以“无”开…

MATLAB-常微分方程求解

MATLAB中可以用来求解常微分方程(组)的函数有ode23、 ode23s、 ode23t、 ode23tb 、ode45、ode15s和odel13等&#xff0c;见下表。它们的具体调用方法类似&#xff0c;为了方便后面的描述&#xff0c;在后面的介绍中将使用solver统一代替它们。函数的具体调用方法如下。[T,Y] s…

简述 synchronized 和 ReentrantLock 之间的区别?

相同点 synchronized 和 ReentrantLock 都是 Java 中提供的可重入锁。 可重入锁&#xff1a;什么是 “可重入”&#xff0c;可重入就是说某个线程已经获得某个锁&#xff0c;可以再次获取锁而不会出现死锁。 不同点 用法不同&#xff1a;synchronized 可以用来修饰普通方法、静…

红中私教:使用wamp64配置靶场

应朋友请求&#xff0c;出一篇配服务器的教程 首先安装软件 https://cowtransfer.com/s/9db1b9ad2c1d44 点击链接查看 [ wampserver3.3.0_x64.exe ] &#xff0c;或访问奶牛快传 cowtransfer.com 输入传输口令 pgs341 查看&#xff1b; 接下来&#xff0c;使用HbuilderX打开我…

基于Paddle实现实例分割

百度的Paddle这几年发展十分迅速&#xff0c;而且文档十分齐全&#xff0c;涉及到机器视觉的多个应用领域&#xff0c;感觉还是非常牛的&#xff0c;各种backbone&#xff0c;损失函数、数据增强手段以及NMS等&#xff0c;整体感觉复现的很全面&#xff0c;值得推荐学习。 本…

搭建Redisson流程以及解读MutilLock源码解决分布式锁的主从一致性问题

搭建Redisson流程以及解读MutilLock源码解决分布式锁的主从一致性问题1、搭建3台独立主节点的redis服务2、创建java redisson客户端3、获取分布式锁4、分析获取锁源码getMultiLocktryLock(long waitTime, long leaseTime, TimeUnit unit)5、总结1、搭建3台独立主节点的redis服务…

Apache Shiro教程(3)

shiro自定义realms及加密md5salt教程 1、添加pom 文件 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.9.1</version> </dependency>2、创建realms自定义文件 import o…

【树莓派/入门】使用MAX30102测量血氧浓度

说在前面 树莓派版本&#xff1a;4b血氧模块&#xff1a;MAX30102树莓派系统&#xff1a;Linux raspberrypi 5.15.76-v8 #1597 SMP aarch64 GNU/Linuxpython版本&#xff1a;3.9.2 模块详情 某宝上买的MAX30102模块&#xff0c;包含杜邦线 准备工作 开启树莓派的GPIO&#x…

java 高级面试题整理

SpringMVC的控制器是单例的吗? 第一次&#xff1a;类是多例&#xff0c;一个普通属性和一个静态属性 总结 尽量不要在controller里面去定义属性&#xff0c;如果在特殊情况需要定义属性的时候&#xff0c;那么就在类上面加上注解Scope("prototype")改为多例的模式…

English Learning - L1-9 时态(中) 2023.1.3 周二

这里写目录标题8 时态8.1 一般时态&#xff08;三&#xff09;一般将来时核心思维&#xff1a;预测&#xff0c;计划&#xff0c;意愿will 和 be going to 的区别将来时的其它表示方式进行时表将来be about to (5 分钟之内)8.2 进行时态核心思维&#xff1a;持续有限的进行&…

黑苹果解决5500xt等navi14显卡引导二阶段黑屏几秒的问题

首先说结论&#xff1a;在注入缓冲帧FB Name的前提下&#xff0c;往显卡注入CFG_LINK_FIXED_MAP参数&#xff0c;类型为Number&#xff0c;值为1。注意一定要注入FB Name&#xff0c;注入FB Name&#xff0c;注入FB Name的前提下&#xff01;&#xff01;我试过不注入FB Name直…

【安全硬件】Chap.5 如何检测芯片中硬件木马?硬件木马的类型有哪些?检测硬件木马的技术

【安全硬件】Chap.5 如何检测芯片中硬件木马&#xff1f;硬件木马的类型有哪些&#xff1f;检测硬件木马的技术前言1. 硬件木马的种类1.1 硬件木马1.2 硬件木马的区分1.1 物理特性类别硬件木马——Physical hardware trojans1.2 激活特性类别硬件木马——Activation1.3 动作特性…

Kafka快速入门

文章目录安装部署集群规划集群部署kafka群起脚本Kafka命令行操作主题命令行操作生产者命令行操消费者命令行操作安装部署 集群规划 集群部署 官方下载地址&#xff1a;http://kafka.apache.org/downloads.html上传安装包到02的/opt/software目录下 [atguiguhadoop02 softwar…

5.hadoop系列之HDFS NN和2NN工作机制

1.第一阶段&#xff1a;NameNode启动 1.第一次启动NameNode格式化后&#xff0c;创建Fsimage和Edits文件&#xff0c;如果不是第一次启动&#xff0c;直接加载Fsimage和Edits到内存 2.客户端对元数据进行增删改请求 3.NameNode记录操作日志&#xff0c;更新滚动日志 4.NameNod…