Windows系统Jenkins企业级实战

news2025/7/14 1:14:47

目标

在Windows操作系统上使用Jenkins完成代码的自动拉取、编译、打包、发布工作。

实施

1.安装Java开发工具包(JDK)

Jenkins是基于Java的应用程序,因此需要先安装JDK。可以从Oracle官网或OpenJDK下载适合的JDK版本。推荐java17版本,因为Jenkins依赖高版本的jdk。

安装包下载地址:

Java Downloads | Oracle 中国

2.下载并安装Jenkins

访问Jenkins官方网站,下载最新的Windows安装包。运行安装程序,按照提示完成安装。

安装包下载地址:

Jenkins 的安装和设置

安装教程(文章内容比较多,看安装部分的内容):

Windows下Jenkins软件安装说明及配置_windows jenkins配置文件在哪里-CSDN博客

3.访问Jenkins

访问地址:服务器ip+配置的端口(安装过程中自己配置的端口号)

4.配置Jenkins

配置maven,用于程序打包

配置jdk,Jenkins依赖jdk运行(版本不能太低,最好是jdk17)

配置maven安装路径

基础配置完成。

5新建任务

创建maven项目

保存后,自动跳转到配置页面。

选择参数化构建,本地使用的是SVN源码管理工具,用branch分支作为参数,选择List XXX

配置参数化数据源(branch列表)

配置svn账号

配置svn用户名和密码 

排序规则选择

配置代码来源 

test 所在位置如下图所示,用来在打包时动态替换配置文件的,比如测试环境需要测试的配置文件,开发环境需要开发的配置文件,那么在发布测试版本时,就用如下的配置方式来激活测试配置文件。 在文章末尾,有完整的pom文件内容,供参考。

maven打包完成后,把war包放到Tomcat对应的webapps目录中,完成项目部署,这个步骤用脚本实现。

编写脚本,完成部署

脚本的内容根据实际需要进行编写,需要做什么操作,就写对应操作的shell脚本。

以上配置完成,进行项目构建。

6.构建项目

找打前面已经创建的任务,点击参数化构建

此时就可以看到所有的branch版本,选择需要的版本,然后点击构建。 

剩下的就是等着就可以了,等待构建完毕,整个部署动作就完成了。

点击对应的构建编号,可以看具体执行过程。

当看到success,表示构建完成。 

通过以上步骤,可以在Windows平台上成功搭建并配置Jenkins,实现自动化构建和部署。

问题及其处理方案:

1.本地包的引用

Jenkins构建时,出现如下报错:

包缺失问题,这些是本地jar包(jar包文件放在项目的lib目录中,项目结构如下图),不是从maven仓库拉取。解决方法是在pom文件中加载本地文件。

修改pom.xml,把缺失的包都引用上。 

<dependency>
    <groupId>com.sheca</groupId>
    <artifactId>words</artifactId>
    <version>1.6</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/web/WEB-INF/lib/aspose-words-15.8.0-jdk16.jar</systemPath>
</dependency>

 ${project.basedir} 表示项目的根目录。

2.版本冲突

Jenkins构建时,报错:程序包javax.xml.bind.annotation不存在

AI给出的错误原因:这些错误表明你的项目在编译时找不到 javax.xml.bind 包中的类。这通常是因为在 Java 9 及更高版本中,javax.xml.bind(JAXB)不再是 Java SE 的一部分,需要手动添加依赖。

因为Jenkins配置的jdk版本为jdk17。maven打包时,当前java项目依赖的jdk版本为jdk8,两个版本会冲突,解决方法:

修改pom.xml文件,在进行maven打包时,使用jdk8:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <fork>true</fork>
        <executable>C:\Program Files\Java\jdk1.8.0_191\bin\javac</executable>  <!-- 指定JDK路径-->
    </configuration>
</plugin>

3.权限问题

Jenkins构建时,出现如下报错:

解决方法:Jenkins服务配置为管理员账号运行

在服务中找到Jenkins,然后找到‘登录’,选择‘此账号’,点击浏览,输入administrator,自动会加载管理员账号,然后输入密码,点击确定。

重启一下Jenkins服务。

4.开发和测试环境配置文件不同的问题

情况一:整个文件替换

在打包时,利用maven的profiles配置,可以做到动态引用配置文件,假如当前需要在打包时,动态引用测试配置文件,具体操作如下:

a.先在系统的resources/test目录中,把测试配置文件放进去。如下图:

项目中放置两份配置文件,pom.xml中添加如下配置:

  <!--Jenkins打测试war包时使用测试的配置文件-->
    <profiles>
       <profile>
           <id>test</id>
           <build>
               <resources>
                   <resource>
                       <directory>resources/test</directory>
                       <filtering>true</filtering>  <!-- 关键配置 -->
                       <includes>
                           <include>properties.config</include>
                           <include>log4j2.xml</include>
                           <include>quartz_jobs.xml</include>
                       </includes>
                   </resource>
               </resources>
           </build>
       </profile>
   </profiles>

Jenkins的任务配置中,在执行打包命令时,激活上面ID为test的配置,如下图:

-Ptest 表示激活pom.xml中ID=test的配置。

情况二:文件中局部内容替换

如果只是想在打包时,替换文件中的部分内容,比如数据库链接。

在pom.xml文件中引入专门替换字符串的打包插件replacer,完整配置如下:

<!-- jenkins 在maven打包时 动态替换数据库连接 -->
<plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>replacer</artifactId>
    <version>1.5.0</version>
    <executions>
        <execution>
            <phase>prepare-package</phase>
            <goals>
                <goal>replace</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <file>resources/data.config</file>
        <replacements>
            <replacement>
                <token>aaa</token>
                <value>bbb</value>
            </replacement>
        </replacements>
    </configuration>
</plugin>

上面的这段配置,表示将resources/data.config文件中的字符串aaa,在打包时,替换为字符串bbb。

通过以上两种方式,可以做到动态替换不同环境的配置。

5.pom.xml文件示例

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>groupId</groupId>
    <artifactId>MBXM</artifactId>
    <version>1.2-RELEASE</version>
    <packaging>war</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <skipTests>true</skipTests>
        <tomcat.version>8.5.75</tomcat.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <log4j2.version>2.17.1</log4j2.version>
    </properties>

    <dependencies>
       
        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>3.0.0</version>
        </dependency>
        

        <!--本地包-->
        <dependency>
            <groupId>com.sheca</groupId>
            <artifactId>pdf</artifactId>
            <version>1.6</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/web/WEB-INF/lib/aspose.pdf-17.3.0.jar</systemPath>
        </dependency>
       
    

    </dependencies>



    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <fork>true</fork>
                    <executable>C:\Program Files\Java\jdk1.8.0_191\bin\javac</executable>  <!-- 指定JDK路径-->
                </configuration>
            </plugin>

            <!-- war包的信息-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.3.1</version>
                <configuration>
                    <warName>ZJZF</warName>
                    <webXml>web/WEB-INF/web.xml</webXml>
                    <!--<packagingExcludes>web/WEB-INF/web.xml,WEB-INF/lib/javax.servlet-api-3.1.0.jar</packagingExcludes>-->
                    <warSourceDirectory>web</warSourceDirectory>
                </configuration>
            </plugin>



            <!-- jenkins 在maven打包时 动态替换数据库连接 -->
            <plugin>
                <groupId>com.google.code.maven-replacer-plugin</groupId>
                <artifactId>replacer</artifactId>
                <version>1.5.0</version>
                <executions>
                    <execution>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>replace</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <file>resources/Inter.HTTPHandler.Core.URLMapSetting.config</file>
                    <replacements>
                        <replacement>
                            <token>Data Source=jdbc:oracle:thin:@123/orcl;User ID=a;Password=a;</token>
                            <value>Data Source=jdbc:oracle:thin:@456/orcl;User ID=b;Password=b;</value>
                        </replacement>
                    </replacements>
                </configuration>
            </plugin>


        </plugins>
        <sourceDirectory>src</sourceDirectory>
        <resources>
            <resource>
                <directory>resources</directory>
                <filtering>false</filtering>
                <excludes>
                    <exclude>test/**</exclude>  <!-- 排除测试配置 -->
                </excludes>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>src/Test</directory>
            </testResource>
        </testResources>
    </build>


    <!--Jenkins打测试war包时使用测试的配置文件-->
    <profiles>
       <profile>
           <id>test</id>
           <build>
               <resources>
                   <resource>
                       <directory>resources/test</directory>
                       <filtering>true</filtering>  <!-- 关键配置 -->
                       <includes>
                           <include>properties.config</include>
                           <include>log4j2.xml</include>
                           <include>quartz_jobs.xml</include>
                       </includes>
                   </resource>
               </resources>
           </build>
       </profile>
   </profiles>

</project>

项目整体文件解构,如下图:

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

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

相关文章

C# 方法(ref局部变量和ref返回)

>本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 ref局部变量和ref返回 …

滑动窗口,438找出字符串中所有字母的异位词

1.题目 2.解析 这道题我们用滑动窗口来实现&#xff0c;加上哈希表和vector容器的使用来实现这道题目&#xff0c;每次滑动之后我们都对其和答案进行比较&#xff0c;如果全部相等我们返回left&#xff0c;不相等继续滑动即可。 本质就是我们把p中相同数量的字母框起来&#…

「国产嵌入式仿真平台:高精度虚实融合如何终结Proteus时代?」——从教学实验到低空经济,揭秘新一代AI赋能的产业级教学工具

引言&#xff1a;从Proteus到国产平台的范式革新 在高校嵌入式实验教学中&#xff0c;仿真工具的选择直接影响学生的工程能力培养与创新思维发展。长期以来&#xff0c;Proteus作为经典工具占据主导地位&#xff0c;但其设计理念已难以满足现代复杂系统教学与国产化技术需求。…

《Python星球日记》 第52天:反向传播与优化器

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、引言二、反向传播算法原理简述1. 什么是反向传播&#xff1f;2. 从数学角度…

Java常用类概述

Java常用类概述 一、字符串三剑客1. String&#xff08;不可变字符串&#xff09;2. StringBuilder&#xff08;可变&#xff0c;线程不安全&#xff09;3. StringBuffer&#xff08;可变&#xff0c;线程安全&#xff09; 二、日期时间类&#xff08;重点掌握新版API&#xff…

C++STL——priority_queue

优先队列 前言优先队列仿函数头文件 前言 本篇主要讲解优先队列及其底层实现。 优先队列 优先队列的本质就是个堆&#xff0c;其与queue一样&#xff0c;都是容器适配器&#xff0c;不过优先队列是默认为vector实现的。priority_queue的接口优先队列默认为大根堆。 仿函数 …

深入解析WPF中的3D图形编程:材质与光照

引言 在Windows Presentation Foundation (WPF) 中创建三维(3D)图形是一项既有趣又具有挑战性的任务。为了帮助开发者更好地理解如何使用WPF进行3D图形的渲染&#xff0c;本文将深入探讨GeometryModel3D类及其相关的材质和光源设置。 1、GeometryModel3D类简介 GeometryMode…

SolidWork-2023 鼠標工程

地址 https://github.com/MartinxMax/SW2023-Project/tree/main/mouse 鼠標

vscode预览模式(点击文件时默认覆盖当前标签,标签名称显示为斜体,可通过双击该标签取消)覆盖标签、新窗打开

文章目录 VS Code 预览模式如何取消预览模式&#xff08;即“固定”标签页&#xff09;&#xff1f;预览模式有什么用&#xff1f; VS Code 预览模式 在 VS Code 中&#xff0c;当你单击文件浏览器&#xff08;例如&#xff0c;资源管理器侧边栏&#xff09;中的某个文件时&am…

记录踩过的坑-金蝶云苍穹平台-轻分析和轻报表(慢慢更新)

未发现AppIdName(qing rpt)服务或访问服务网络异常 前提是有许可和权限。 去console&#xff08;云基础平台控制台&#xff09;&#xff0c;点击服务管理&#xff0c;编辑mservice-更新升级-环境变量&#xff0c;在appIds里增加qing_rpt 查看数据库 如果是采用公共数据源连接…

每日一题洛谷T534125 合数c++

字符串输入&#xff0c;看所有位数加起来的数是不是3的倍数 是&#xff0c;直接输出&#xff0c;不是&#xff0c;删除1或2 特判全是1和全是2的情况 直接检测末尾数字可以特判2 特判1时&#xff0c;还要特判11和111&#xff0c;其他数字&#xff0c;k是奇数时是质数&#x…

数据链共享:从印巴空战到工业控制的跨越性应用

摘要 本文通过对印巴空战中数据链共享发挥关键作用的分析&#xff0c;引出数据链共享在工业控制领域同样具有重大价值的观点。深入阐述 DIOS 工业控制操作系统作为工业数据链共享基础技术的特点、架构及应用优势&#xff0c;对比空战场景与工业控制场景下数据链共享的相…

图解gpt之Seq2Seq架构与序列到序列模型

今天深入探讨如何构建更强大的序列到序列模型&#xff0c;特别是Seq2Seq架构。序列到序列模型&#xff0c;顾名思义&#xff0c;它的核心任务就是将一个序列映射到另一个序列。这个序列可以是文本&#xff0c;也可以是其他符号序列。最早&#xff0c;人们尝试用一个单一的RNN来…

Linux--JsonCpp

1.JsonCpp 简介 JsonCpp 是一个用于 C 的 JSON 解析和生成库&#xff0c;支持 JSON 数据的读写、解析和序列化。它提供了简单的 API 来操作 JSON 对象、数组、字符串、数字等类型&#xff0c;是 C 开发中处理 JSON 数据的常用工具。 核心功能与类 JsonCpp 主要包含以下核心类…

如何利用 QuickAPI 生成 PostgreSQL 样本测试数据:全面解析与实用指南

目录 一、什么是 QuickAPI&#xff1f; 二、为什么需要生成样本测试数据&#xff1f; 三、如何在 QuickAPI 中生成 PostgreSQL 样本测试数据&#xff1f; 1. 登录 QuickAPI 平台 2. 选择 PostgreSQL 数据库和目标表 3. 配置样本数据生成规则 4. 导出或直接插入数据 四、…

DeepSeek API接口调用示例(开发语言C#,替换其中key值为自己的key值即可)

示例&#xff1a; DeepSeek官方接口说明文档&#xff1a;对话补全 | DeepSeek API Docs 官网暂未提供C#代码实现&#xff1a;&#xff08;以下为根据CURL接口C#代码调用&#xff09; using System; using System.Collections.Generic; using System.Linq; using System.Text; …

远程调试---在电脑上devtools调试运行在手机上的应用

1、启动项目–以vite项目为例:先ipconfig查看ip地址 ,然后在vite中配置host为ip地址 2、手机上查看项目:保证手机和电脑在同一局域网, 在手机浏览器打开我们vite启动的项目地址, 3、使用chii进行远程调试 (1) 安装 npm install chii -g (2)启动 chii start -p 8080 (3)在…

[git]如何关联本地分支和远程分支

主题 本文总结如何关联git本地分支和远程分支的相关知识点。 详情 查看本地分支 git branch 查看远程分支 git branch -r 查看所有分支(本地远程) git branch -a 查看本地分支及其关联的远程分支(如有) git branch -vv 关联本地分支到远程分支&#xff1a; git branch …

跨境电商生死局:动态IP如何重塑数据生态与运营效率

凌晨三点的深圳跨境电商产业园&#xff0c;某品牌独立站运营总监李明&#xff08;化名&#xff09;正盯着突然中断的广告投放系统。后台日志显示&#xff0c;过去24小时内遭遇了17次IP封禁&#xff0c;直接导致黑五促销期间损失23%的预期流量。这并非个案——2023年跨境电商行业…

springboot3+vue3融合项目实战-大事件文章管理系统-更新用户信息

在一下三个代码处进行修改 在UserController里面增加uadate方法 PutMapping ("/update")public Result update(RequestBody Validated User user){userService.update(user);return Result.success();}在userservice中增加update方法 void update(User user); 然…