詹金斯搭建_与詹金斯一起将GitLab中的Gradle项目发布到Artifactory

詹金斯搭建

我将详细展示如何定期构建您的项目,然后如何进行发布。 它涉及许多工具的协作,我发现很难正确设置这些工具,这就是我编写此代码的原因。

目标

我将向您展示如何实现以下两种方案。 第一个是如何进行常规开发的非发行版:

  1. 实现一些东西,提交并推送到GitLab。
  2. 通过GitLab的Web钩子触发Jenkins构建。
  3. 生成,测试,组装然后将二进制JAR发布到Artifactory存储库。

第二个也是更有趣的目标是当您要构建发行版本时:

  1. 运行使用Gradle版本插件的参数化Jenkins构建:
    1. 验证项目符合要发布的特定条件。
    2. 使用发行版本号创建Git标签。
    3. 修改Gradle项目版本以允许进一步开发。
    4. 提交此更改并将其推送到GitLab。
  2. 触发另一个通用参数Jenkins构建,以将发布工件发布到Artifactory。

情况

我将演示描述使用Gradle构建的真实Scala项目的过程 构建服务器是Jenkins 。 二进制工件被发布到运行免费版本Artifactory的服务器上。 版本控制系统是GitLab的免费社区版本。 我确信您可以对任何Java应用程序遵循本指南。 为了清楚起见,假设您的网址如下:

  • GitLab存储库(SSH)= git@gitlab.local:com.buransky / release-example.git
  • Jenkins服务器= http:// jenkins /
  • Artifactory服务器= http:// artifactory /

项目结构

没什么特别的。 我使用常见的目录结构:

<project root>+ build (build output)+ gradle (Gradle wrapper)+ src (source code)+ main+ scala+ test+ scala- build.gradle- gradle.properties- gradlew- gradlew.bat- settings.gradle

Gradle项目

我使用Gradle包装器,如果尚未将Gradle本身安装在机器上,它只是下载和安装Gradle本身的便捷工具。 不需要。 但是您需要具有以下三个文件:

settings.gradle –用于多个项目的通用Gradle设置,对于我们来说并不是必需的

rootProject.name = name

gradle.properties –包含组名称,项目名称和版本

group=com.buransky
name=release-example
version=1.0.0-SNAPSHOT

build.gradle – Gradle项目的主要定义

buildscript {repositories {mavenCentral()maven { url 'http://repo.spring.io/plugins-release' }}...
}plugins {id 'scala'id 'maven'id 'net.researchgate.release' version '2.1.2'
}group = group
version = version...release {preTagCommitMessage = '[Release]: 'tagCommitMessage = '[Release]: creating tag 'newVersionCommitMessage = '[Release]: new snapshot version 'tagTemplate = 'v${version}'
}

添加以下内容以生成带有源的JAR文件:

task sourcesJar(type: Jar, dependsOn: classes) {classifier = 'sources'from sourceSets.main.allSource
}artifacts {archives sourcesJararchives jar
}

让我们测试一下。 从shell运行此命令:

$ gradle assemble
:compileJava
:compileScala
:processResources
:classes
:jar
:sourcesJar
:assembleBUILD SUCCESSFUL

现在,您应该在build / libs目录中有两个JAR文件:

  • 版本示例1.0.0-SNAPSHOT.jar
  • 版本示例1.0.0-SNAPSHOT-sources.jar

好的,所以如果这可行,让我们尝试释放它:

$ gradle release
:release
:release-example:createScmAdapter
:release-example:initScmAdapter
:release-example:checkCommitNeeded
:release-example:checkUpdateNeeded
:release-example:unSnapshotVersion
> Building 0% > :release > :release-example:confirmReleaseVersion
??> This release version: [1.0.0]
:release-example:confirmReleaseVersion
:release-example:checkSnapshotDependencies
:release-example:runBuildTasks
:release-example:beforeReleaseBuild UP-TO-DATE
:release-example:compileJava UP-TO-DATE
:release-example:compileScala
:release-example:processResources UP-TO-DATE
:release-example:classes
:release-example:jar
:release-example:assemble
:release-example:compileTestJava UP-TO-DATE
:release-example:compileTestScala
:release-example:processTestResources
:release-example:testClasses
:release-example:test
:release-example:check
:release-example:build
:release-example:afterReleaseBuild UP-TO-DATE
:release-example:preTagCommit
:release-example:createReleaseTag
> Building 0% > :release > :release-example:updateVersion
??> Enter the next version (current one released as [1.0.0]): [1.0.1-SNAPSHOT]
:release-example:updateVersion
:release-example:commitNewVersionBUILD SUCCESSFUL

由于我尚未使用必需的参数运行发布任务,因此该构建是交互式的,要求我首先输入(或确认)发布版本1.0.0。 然后,它再次要求我输入下一个工作版本,该插件自动建议该版本为1.0.1-SNAPSHOT。 我没有输入任何内容,只是按Enter确认了默认值。

查看Git历史记录,您应该在本地存储库以及GitLab中看到名为v1.0.0的标签。 还要打开gradle.properties文件,您应该看到版本已更改为version = 1.0.1-SNAPSHOT。

发布任务需要做很多事情。 例如,您的工作目录不得包含未提交的更改。 或所有项目依赖项都必须是发行版(它们不能是快照)。 否则您当前的分支必须是主分支。 另外,您还必须具有在GitLab中推送到master分支的权限,因为发布插件将执行git push。

设置工厂

在Artifactory方面没有特殊要求。 我假设它已经启动并在http:// artifactory /上运行。 当然,您的网址可能有所不同。 默认安装已经有两个存储库,我们将发布它们:

  • libs-release-local
  • libs-snapshot-local

Jenkins Artifactory插件

该插件将Jenkins与Artifactory集成在一起,从而可以发布Jenkins构建中的工件。 安装插件,转到Jenkins配置,在Artifactory部分中添加新的Artifactory服务器并进行以下设置:

  • 网址= http:// artifactory /(您有所不同)
  • 默认部署者凭证
    • 为有权部署的现有Artifactory用户提供用户名和密码

单击测试连接按钮,以确保该部分正常工作。

持续集成Jenkins构建

这是在每次向master分支提交并推送到GitLab之后运行的构建。 将其创建为新的自由式项目,并为其命名。 这是此构建的步骤和设置的列表:

  • 源代码管理– Git
    • 资料库URL = git@gitlab.local:com.buransky / release-example.git(您有所不同)
  • 构建触发器
    • 轮询SCM(这是必需的,以便GitLab上的Webhook起作用)
  • 搭建环境
    • Gradle-Artifactory集成(需要Artifactory插件)
  • 人工配置
    • Artifactory服务器= http:// artifactory /(您有所不同)
  • 构建–调用Gradle脚本
    • 使用Gradle包装器

运行构建,然后转到Artifactory,以检查快照是否已成功发布。 我使用树浏览器导航到libs-snapshot-local / com / buransky / release-example / 1.0.1-SNAPSHOT。 在那里您应该找到:

  • 二进制JAR
  • 源JAR
  • POM文件

每次运行此构建时,都会在此处添加新的三个文件。 您可以配置Artifactory删除旧快照以节省空间。 我只保留5张最新快照。

从GitLab触发Jenkins构建

我们懒得手动运行我们刚刚创建的持续集成Jenkins构建。 我们可以将GitLab配置为在每次推送后自动为我们完成。 转到您的GitLab项目设置的Web Hooks部分。 输入以下内容,然后单击“添加Web挂钩”按钮:

  • 网址= http:// jenkins / git / notifyCommit?url=git@gitlab.local:com.buransky / release-example.git
    • 嘿!
  • 触发=推送事件

如果尝试测试此挂钩并单击“测试挂钩”按钮,则可能会惊讶于没有触发任何构建。 原因(很多时候)可能是该机制非常智能,如果没有新的提交,则构建不会运行。 因此,对源代码进行更改,提交,推送,然后触发Jenkins构建。

休息一下,喝杯咖啡

这已经是很多工作了。 我们现在可以做很多事情。 服务器工作并相互通信。 我希望您可能需要在各个计算机之间设置SSH,但这超出了此范围。 准备继续吗? 让我们释放这个sh * t。

通用Jenkins构建后将发布发布给Artifactory

我们将创建一个参数化的Jenkins构建,该构建从git中检出发行版,进行构建并将工件部署到Artifactory。 此构建是通用的,因此可以将其重新用于单个项目。 让我们从新的自由式Jenkins项目开始,然后设置以下内容:

  • 项目名称=向Artifactory发布发行
  • 此构建已参数化
    • 字符串参数
  • 源代码管理– Git
    • 存储库URL = $ GIT_REPOSITORY_URL
  • 搭建环境
    • 开始构建之前删除工作空间
  • 人工配置
    • Artifactory服务器= http:// artifactory /(您有所不同)
  • 构建–调用Gradle脚本
    • 使用Gradle包装器

通用Jenkins构建以发布Gradle项目

我们还需要一个可重用的参数化Jenkins构建,它使用提供的参数运行Gradle版本插件,然后触发我们已经创建的通用发布Jenkins构建。

  • 项目名称= Release Gradle项目
  • 此构建已参数化
    • 字符串参数
  • 源代码管理– Git
    • 存储库URL = $ GIT_REPOSITORY_URL
  • 其他行为
    • 签到特定的本地分支机构
  • 构建–调用Gradle脚本
    • 使用Gradle包装器
  • 触发器/调用建立在另一个项目上(需要参数化触发器插件)
    • 要构建的项目=将发布发布到Artifactory

最终版本

现在我们终于准备好为我们的项目创建一个构建,该构建将创建一个发行版。 它只会调用先前创建的通用内部版本。 上一次,创建新的自由式Jenkins项目,然后:

  • 项目名称=示例发行版
  • 此构建已参数化
    • 字符串参数
  • 为运行准备环境
    • 保留Jenkins环境变量
  • 源代码管理– Git
    • 从另一个项目使用SCM
  • 搭建环境
    • 开始构建之前删除工作空间
  • 建立
    • 使用其他项目中的构建器

让我们尝试发布示例项目。 如果按照我的步骤进行操作,则该项目当前应为1.0.1-SNAPSHOT版本。 将发布版本1.0.1,并将当前项目版本提升到下一个开发版本1.0.2-SNAPSHOT。 因此,只需运行示例发布版本并进行设置:

  • RELEASE_VERSION = 1.0.1
  • NEW_VERSION = 1.0.2-快照

使用的工具

  • 斯卡拉 2.11
  • Gradle 2.4
    • Gradle Release插件 2.1.2
  • 詹金斯 1.617
    • Artifactory插件 2.3.1
  • Artifactory 3.3.0
  • 亚搏体育app 7.7.2

结论

我确信本指南中肯定有一些错误,也许我也忘记提及关键步骤了。 如果您遇到任何问题,请告诉我,我们将尝试解决。 它可以在我的机器上工作,因此必须有一种方法使其在您的机器上工作。

翻译自: https://www.javacodegeeks.com/2015/09/release-gradle-project-in-gitlab-with-jenkins-to-artifactory.html

詹金斯搭建

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

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

相关文章

java socket优化_Java Socket编程代码优化

1.问题&#xff1a;在学习Java的Socket编程&#xff0c;写了一些代码练习&#xff0c;但是又不知道是否规范&#xff0c;是否有优化的空间&#xff1f;2.代码&#xff1a;package com.nekolr.socket;import com.google.common.util.concurrent.ThreadFactoryBuilder;import jav…

java 函数式编程_Java函数式编程:Javaslang入门

java 函数式编程Java是一门古老的语言&#xff0c;并且该领域中有很多新手在他们自己的领域&#xff08;JVM&#xff09;上挑战Java。 但是Java 8到来并带来了一些有趣的功能。 这些有趣的功能使编写新的惊人框架&#xff08;例如Spark Web框架或Javaslang&#xff09;成为可能…

java 线程组作用_Java线程组(ThreadGroup)使用

JDK 对线程组类注释&#xff1a;A thread group represents a set of threads. In addition, a thread group can also include other thread groups. The thread groups form a tree in which every thread group except the initial thread group has a parent.A thread is a…

web.xml.jsf_JSF 2.2在30秒内创建一个自定义Hello World组件

web.xml.jsf让我们直接跳到很酷的东西上&#xff0c;说在JSF 2.0中&#xff0c;通过在Facelet标记库&#xff08; *taglib.xml &#xff09;中对其进行配置&#xff0c;使页面作者可以使用自定义组件。 此外&#xff0c;当将组件映射到JAR中时&#xff0c;需要在web.xml一个特殊…

java左上角图标太小_Eclipse在高分屏下图标过小的解决方法

自己败了一台Surface Pro 4&#xff0c;打算用来看PDF、练代码。安装了Eclipse并且打开之后&#xff0c;发现图标显示极其细小&#xff0c;肉眼几乎无法看清了。这是由于Eclipse对高分屏没有作适配导致的。Windows 10本身对于高分屏的支持已是相当不错&#xff0c;苏菲4的屏幕分…

java胜任理由_Java在几乎所有方面均能胜任本机响应

java胜任理由我与一位同事讨论了Java与JavaScript的话题&#xff0c;这是一个有问题的话题。 然后他提到React Native多么出色&#xff0c;我决定我必须研究一下&#xff0c;也许要为Codename One掌握一些想法…… 那里有一些不错的主意&#xff0c;但是它们都不是革命性的或例…

java发送文件_java 模拟http发送文件和参数

一、maven&#xff1a;org.apache.httpcomponentshttpmime4.5.3二、工具类&#xff1a;import java.io.File;import java.util.Map;import java.util.Map.Entry;import org.apache.http.*;import org.apache.http.client.HttpClient;import org.apache.http.client.config.Requ…

设置Elasticsearch N-Gram字分析器的过程

说n-gram是一个大话题&#xff0c;这是轻描淡写的。 进行快速搜索&#xff0c;您会发现自己盯着语言学和语言模型&#xff0c;数据挖掘或特定蛋白质的分解对首次亮相文化的衰落所隐含的信息量。 好吧&#xff0c;我在跟那最后一个开玩笑。 但是&#xff0c;如果您是开发人员&a…

java字节码反编译_javap 反编译 java 字节码文件

概述&#xff1a;javap是 Java class文件分解器&#xff0c;可以反编译&#xff0c;也可以查看java编译器生成的字节码&#xff0c;从而对代码内部的执行逻辑进行分析。语法&#xff1a;把java文件编译为class文件&#xff1a;javac Test.java (Test.java为java文件名) 生成对…

javaone_JavaOne演讲者选择了您不容错过的10个会话

javaone确保会议安排中包含这些JavaOne会话 JavaOne 2015从这个星期日开始&#xff0c;数百个会话同时进行&#xff0c;因此很难筛选所有会话并选择要参加的会话。 这就是为什么我们邀请5位最喜欢的JavaOne发言人让我们了解他们的会议&#xff0c;并选择他们最期待的会议。 好…

java servlet文件下载_Java之Servlet文件下载20190228

jsp页面:pageEncoding"utf-8"%>Insert title here下载index.jsp下载1.jpg下载test.jspServlet:packageorg.jimmy.testwebproject2019012602.servlet.download;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjavax.se…

activiti 多租户_Activiti中具有独立数据库架构的多租户

activiti 多租户我们过去听到的一项功能请求是以多租户方式运行Activiti引擎&#xff0c;使租户的数据与其他数据隔离。 当然&#xff0c;在某些云/ SaaS环境中&#xff0c;这是必须的。 几个月前&#xff0c;波恩大学的学生拉斐尔吉伦&#xff08;Raphael Gielen&#xff09;…

jigsaw kaggle_使用Project Jigsaw的JDK 9 Early Access上的Eclipse IDE

jigsaw kaggle几周前&#xff0c;我写了关于在Java 9上运行Eclipse Neon的文章 &#xff08;尽管&#xff0c;我在帖子标题中错误地且令人尴尬地留下了“火星”&#xff09;。 值得注意的是&#xff0c;我列出的步骤也适用于带有Project Jigsaw &#xff08;Java模块化&#xf…

win7 activemq_带有骆驼,ActiveMQ,Elasticsearch的关键HL7用例

win7 activemqML7上的HL7是可以说HL7协议格式的系统的一种非常常见的传输机制。 JBoss Fuse是一个非常强大的微服务样式集成平台&#xff0c;在为关键医疗保健提供者构建灵活&#xff0c;有弹性&#xff0c;高可用性的集成方案方面拥有良好的经验。 此外&#xff0c;在JCAPS上替…

jboss4 迁移_应用程序服务器迁移:从JBoss EE5到Wildfly EE7

jboss4 迁移几周前&#xff0c;我发布了一个有关从Java EE 5迁移到7的博客 。这主要是关于如何使用新的Java EE 7改进Java EE 5代码。 现在&#xff0c;在这篇文章中&#xff0c;我将对应用程序服务器端的迁移路径进行一些研究。 如果您使用的是Java EE 5&#xff0c;则很有可…

java xmlrpc2.0 实现_简单的java xmlrpc

&#xfeff;&#xfeff;简单的 XMLRPCjava---XmlRpcClientpackage com.company;import org.apache.xmlrpc.XmlRpcClient;import org.apache.xmlrpc.XmlRpcException;import java.net.MalformedURLException;import java.util.Hashtable;import java.util.Vector;public class…

操作方法:带有Thymeleaf和Spring Boot的Java 8日期和时间

如果您碰巧使用Spring Boot和Thymeleaf&#xff0c;并且需要在视图中格式化Java 8 Date&#xff06;Time对象&#xff0c;则可以使用thymeleaf-extras-java8time –用于Java 8 Date&#xff06;Time API的Thymeleaf模块。 向现有的基于Maven或Gradle的Spring Boot项目中添加th…

java boundary_上传文件multipart form-data boundary 说明

含义 ENCTYPE"multipart/form-data" 说明&#xff1a;通过 http 协议上传文件 rfc1867协议概述&#xff0c;客户端发送内容构造。概述在最初的 http 协议中&#xff0c;没有上传文件方面的功能。 rfc1867为 http 协议添加了这个功能。客户端的浏览器&#xff0c;如 M…

java 预处理语句_预处理语句PreparedStatement到底咋用啊

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我自己试了一下直接查询id为1的语句&#xff0c;有一条结果出来&#xff0c;但是用了PreparedStatement后就没有结果了&#xff0c;有大佬知道为什么吗orzpackage test;import java.io.IOException;import java.io.PrintWriter;imp…

crud-table_我个人的CRUD故事-或我如何来到CUBA平台

crud-table在此博客文章中&#xff0c;我想介绍一下我如何使用CUBA平台以及该工具的好处。 在我年轻的“业务应用程序开发”历史上&#xff0c;我将深入探讨各个阶段&#xff0c;只是给您一些背景知识。 因此&#xff0c;让我们从如何进入典型的CRUD应用程序开始&#xff0c;以…