前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Jenkins+Git+Maven自动化部署配置

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

原创
作者头像
别团等shy哥发育
发布2023-03-01 12:02:32
7880
发布2023-03-01 12:02:32
举报
文章被收录于专栏:全栈开发那些事

基本思路

image-20230107211213527
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-20230107174445281
image-20230107174432629
image-20230107174432629

2、git安装

git安装

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

代码语言:shell
复制
yum install -y git
image-20230107175826820
image-20230107175826820

3、Jenkins中新建任务

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

image-20230107174543897
image-20230107174543897

项目名称写first

image-20230107174603376
image-20230107174603376

3.1 git配置

image-20230107174705545
image-20230107174705545

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

image-20230107180355689
image-20230107180355689

选择分支,看你的是master分支还是main分支

image-20230107180526759
image-20230107180526759

3.2 maven配置

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

image-20230107180845359
image-20230107180845359

3.3 pom.xml配置

代码仓库中pom.xml的位置

image-20230107182015492
image-20230107182015492

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

3.4 build

点击构建按钮

image-20230107210906999
image-20230107210906999

查看控制台输出:

image-20230107210033005
image-20230107210033005

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

image-20230107205137340
image-20230107205137340

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

image-20230107210504969
image-20230107210504969

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

image-20230107205216694
image-20230107205216694

运行jar包测试一下

代码语言:txt
复制
java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8888
image-20230107205314375
image-20230107205314375

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

image-20230107211031304
image-20230107211031304

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

image-20230107210350535
image-20230107210350535

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

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

4.1 安装Publish Over SSH插件

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

image-20230107212220556
image-20230107212220556

选中,点击Install without restart

image-20230107212301949
image-20230107212301949

4.2 修改Post Steps配置

image-20230107214419334
image-20230107214419334

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

image-20230107214542507
image-20230107214542507

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

image-20230107214605456
image-20230107214605456

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

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

image-20230108192905445
image-20230108192905445

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

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

image-20230108193352059
image-20230108193352059

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

image-20230108201037944
image-20230108201037944

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

image-20230108201449189
image-20230108201449189

查看控制台输出

image-20230108201506507
image-20230108201506507

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

image-20230108201903673
image-20230108201903673

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

代码语言:shell
复制
jps
image-20230108201600380
image-20230108201600380

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

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

image-20230108201657871
image-20230108201657871

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

4.4 publish over ssh优化

1、 超时机制

输出命令时一定要注意不要让窗口卡主,不然Jenkins会认为认为一直没完成

image-20230110223016984
image-20230110223016984

2、shell的日志输出

将jenkins构建成功后的脚本修改成如下命令:

代码语言:txt
复制
nohup java -jar /root/xxoo/demo*.jar >mylog.log 2>&1 &

或者下面这个也可以

代码语言:shell
复制
nohup java -jar /root/xxoo/demo*.jar &>mylog.log &

数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据传输到其他地方

标准输入(stdin):代码为0,使用<或<<;

标准输出(stdout):代码为1,使用>或>>;

标准错误输出(stderr):代码为2,使用2>或2>>

> 覆盖写

>> 追加写

>是数据流操作符,2>&1正常输出和错误输出全部追加

jenkins的配置文件修改下:

image-20230110223731492
image-20230110223731492
image-20230110223642795
image-20230110223642795

可以看到,201毫秒 ,时间缩短了

4.5 运行前清理

配置杀死之前运行的进程

image-20230110234339387
image-20230110234339387

我们需要在测试服务器上编写好这个x.sh脚本,脚本内容如下

image-20230110234423448
image-20230110234423448
代码语言:shell
复制
#!/bin/bash

#删除历史数据
rm -rf xxoo

appname=$1
#获取传入的参数
echo "arg:$1"


#获取正在运行的jar包pid
pid=`ps -ef | grep $1 | grep 'java -jar' | awk '{printf $2}'`

echo $pid

#如果pid为空,提示一下,否则,执行kill命令
if [ -z $pid ];
#使用-z 做空值判断
        then
                echo "$appname not started"

        else
               kill -9 $pid
                echo "$appname stoping...."

check=`ps -ef | grep -w $pid | grep java`
if [ -z $check ];

        then
                echo "$appname pid:$pid is stop"
        else
                echo "$appname stop failed"

fi


fi

4.6 代码提交测试

我们改动下代码,之后提交到GitLab服务器

image-20230110234525819
image-20230110234525819

然后执行构建

image-20230110234557199
image-20230110234557199

访问:http://192.168.159.52:8888/index/hello,看是否构建成功

image-20230110234637508
image-20230110234637508

这里都是手动的,颇为麻烦,后面用钩子改成自动的。

5、小插曲

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

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

代码语言:shell
复制
yum install -y java-devel
image-20230107202714630
image-20230107202714630

4.2镜像配置

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

代码语言:txt
复制
<?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-20230108201300736

然后重新构建就成功了

image-20230108201343290
image-20230108201343290

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本思路
  • 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.4 publish over ssh优化
                  • 4.5 运行前清理
                    • 4.6 代码提交测试
                    • 5、小插曲
                      • 4.1 构建的时候报错找不到jdk
                        • 4.2镜像配置
                          • 4.3 配置testserver之后构建异常
                          相关产品与服务
                          测试服务
                          测试服务 WeTest 包括标准兼容测试、专家兼容测试、手游安全测试、远程调试等多款产品,服务于海量腾讯精品游戏,涵盖兼容测试、压力测试、性能测试、安全测试、远程调试等多个方向,立体化安全防护体系,保卫您的信息安全。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档