Jenkins安装
docker
- 创建网桥
docker network create jenkins
- 初始化Jenkins
docker run \
--name jenkins-docker \
--rm \
--detach \
--privileged \
--network jenkins \
--network-alias docker \
--env DOCKER_TLS_CERTDIR=/certs \
--volume jenkins-docker-certs:/certs/client \
--volume jenkins-data:/var/jenkins_home \
--publish 2376:2376 \
docker:dind \
--storage-driver overlay2 - 编写Dockerfile
FROM jenkins/jenkins:2.401.2
USER root
RUN apt-get update && apt-get install -y lsb-release
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
https://download.docker.com/linux/debian/gpg
RUN echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow" - 构建docker镜像
docker build -t myjenkins-blueocean:2.401.2-1 .
- 运行docker容器
docker run \
--name jenkins-blueocean \
--restart=on-failure \
--detach \
--network jenkins \
--env DOCKER_HOST=tcp://docker:2376 \
--env DOCKER_CERT_PATH=/certs/client \
--env DOCKER_TLS_VERIFY=1 \
--publish 8080:8080 \
--publish 50000:50000 \
--volume jenkins-data:/var/jenkins_home \
--volume jenkins-docker-certs:/certs/client:ro \
myjenkins-blueocean:2.401.2-1
Jenkins凭据
Jenkins支持以下几种类型的凭据:
凭据类型 | 描述 |
---|---|
Secret text | 保存API token |
Username and password | 用来保存gitlab/nexus用户和密码 |
Secret file | 存储加密文件 |
SSH Username with private key | ssh私钥 |
Certificate | 存储证书 |
创建全局凭据
- 使用Linux命令获取一个随机
UUID
#uuidgen
8f7110b4-e402-41b2-97c6-b0ebb18dcc49 - Dashboard》Manage Jenkins》凭据》系统》全局凭据,创建凭据
Pipeline
Jenkins Pipeline 是 Jenkins 中的一个强大功能,它允许你使用可扩展的脚本语言定义和管理持续交付(Continuous Delivery)流水线。
Jenkins Pipeline 提供了一种将软件交付过程定义为代码的方式,这使得流水线的创建、管理和版本控制变得更加灵活和可重复。它基于 Groovy 编程语言,并提供了丰富的语法和函数,用于描述和自定义不同的构建和部署阶段。
Jenkins Pipeline 的核心概念是将整个软件交付过程划分为一系列的阶段(Stage)和步骤(Step)。每个阶段代表流水线中的一个逻辑单元,而每个步骤代表具体的操作或任务。你可以定义并组合这些阶段和步骤,以构建复杂的持续交付流水线。
通过 Pipeline,你可以实现以下功能:
- 将整个软件交付过程定义为可执行的代码,以便在版本控制系统中进行管理和追踪。
- 自定义构建和部署阶段,包括编译、测试、静态代码分析、部署等。
- 引入并行处理,同时执行多个任务,以加速整体交付流程。
- 集成各种工具和插件,例如代码质量检查、部署到不同环境、自动化测试等。
- 创建可重复且一致的交付流程,提高团队的协作和交付质量。
声明式流水线语法
pipeline { |
脚本式流水线语法
node { |
声明式流水线
agent
在 Jenkins Pipeline 中,agent 是用来指定运行 Pipeline 的代理(执行代理或者构建代理)。它决定了 Pipeline 在哪个节点(计算机或者容器)上运行,并且可以控制运行 Pipeline 的环境和工具。 agent 有多种形式,每种形式都对应不同的运行环境。以下是 agent 的一些常见形式及其作用:
下面是使用 Markdown 表格展示不同 agent
形式的示例:
agent 形式 |
描述 |
---|---|
agent any |
在任意可用节点上运行 Pipeline。 |
agent none |
不在任何节点上运行 Pipeline,需要手动触发或外部触发。 |
agent { label 'label_name' } |
只在具有指定标签(label_name)的节点上运行。 |
agent { docker { image 'docker_image_name' } } |
在 Docker 容器中运行 Pipeline,指定 Docker 镜像。 |
agent { dockerfile { filename 'Dockerfile' } } |
在使用指定 Dockerfile 构建的 Docker 容器中运行。 |
agent { kubernetes { label 'kubernetes_label' } } |
在 Kubernetes 集群中运行 Pipeline,指定运行的节点标签。 |
agent { docker { reuseNode true } } |
在 Docker 容器中运行 Pipeline,并允许复用已存在的节点。 |
示例:agent用法
pipeline { |
options
选项 | 中文描述 |
---|---|
buildDiscarder | 保留特定数量最近的 Pipeline 运行的构建结果和控制台输出。例如:options { buildDiscarder(logRotator(numToKeepStr: '1')) } |
checkoutToSubdirectory | 将自动的源代码控制检出放置在工作空间的子目录中。例如:options { checkoutToSubdirectory('foo') } |
disableConcurrentBuilds | 禁止 Pipeline 的并发执行。这对于防止对共享资源的同时访问等情况可能很有用。例如:options { disableConcurrentBuilds() } 或 options { disableConcurrentBuilds(abortPrevious: true) } |
disableResume | 如果控制器重启,则不允许 Pipeline 恢复。例如:options { disableResume() } |
newContainerPerStage | 与 docker 或 dockerfile 顶级代理一起使用。当指定时,每个阶段将在同一节点上的一个新容器实例中运行,而不是所有阶段在同一个容器实例中运行。 |
overrideIndexTriggers | 允许覆盖默认的分支索引触发器处理方式。如果在多分支或组织标签处禁用了分支索引触发器,则 options { overrideIndexTriggers(true) } 会仅为此作业启用它们。否则,options { overrideIndexTriggers(false) } 会仅为此作业禁用分支索引触发器。 |
preserveStashes | 保留已完成构建的暂存内容,以供阶段重新启动时使用。例如:options { preserveStashes() } 保留最近完成的构建的暂存内容,或者 options { preserveStashes(buildCount: 5) } 保留最近五次完成构建的暂存内容。 |
quietPeriod | 设置 Pipeline 的静默期(quiet period),以秒为单位,覆盖全局默认值。例如:options { quietPeriod(30) } |
retry | 失败时,重试整个 Pipeline 的指定次数。例如:options { retry(3) } |
skipDefaultCheckout | 在 agent 指令中默认跳过从源代码控制中检出代码。例如:options { skipDefaultCheckout() } |
skipStagesAfterUnstable | 一旦构建状态变为 UNSTABLE,跳过后续阶段。例如:options { skipStagesAfterUnstable() } |
timeout | 为 Pipeline 运行设置超时时间,超过该时间 Jenkins 将中止 Pipeline。例如:options { timeout(time: 1, unit: 'HOURS') } |
timestamps | 在 Pipeline 运行生成的所有控制台输出前加上输出时间。例如:options { timestamps() } |
parallelsAlwaysFailFast | 为 Pipeline 中后续的所有并行阶段设置 failfast 为 true 。例如:options { parallelsAlwaysFailFast() } |
disableRestartFromStage | 完全禁用“从阶段重新启动”选项,该选项在经典 Jenkins UI 和 Blue Ocean 中可见。例如:options { disableRestartFromStage() } 。此选项不能在 stage 内部使用。 |
customWorkspace | 自定义workspace工作路径 |
示例:pipeline打印时间戳 |
properties([parameters([string(name: 'branch', defaultValue: 'master')])]) |
parameters
可用参数类型:
参数名称 | 描述 |
---|---|
string | 字符串 |
text | 一般用于多行文本 |
booleanParam | 定义参数为true或false |
choice | 选择参数 |
password | 用来加密用户的密码 |
parameters可以用两种方式表示:
写在pipeline{}
外层,示例:
properties([parameters([string(name: 'branch', defaultValue: 'master')])]) |
写在pipeline{}
内
pipeline { |
environment
指定一系列键值对,这些键值对将被定义为所有步骤或特定于阶段的步骤的环境变量,具体取决于环境指令在管道中的位置。该指令支持特殊的辅助方法credentials(),该方法可用于通过 Jenkins 环境中的标识符来访问预定义的凭证。
支持的Credentials类型:
参数 | 中文描述 |
---|---|
Secret Text | 指定的环境变量将设置为“Secret Text”的内容。 |
Secret File | 指定的环境变量将设置为“File”文件的位置,该文件是临时创建的。 |
Username and password | 指定的环境变量将设置为“username:password”,并且会自动定义两个额外的环境变量:分别是 MYVARNAME_USR 和 MYVARNAME_PSW。 |
SSH with Private Key | 指定的环境变量将设置为 SSH 密钥文件的位置,该文件是临时创建的,并且会自动定义两个额外的环境变量:分别是 MYVARNAME_USR 和 MYVARNAME_PSW(包含密钥的密码)。 |
用户名和密码
pipeline { |
tools
定义自动安装并放在 PATH 中的工具的部分。如果未指定代理,则忽略此选项。支持以下几种:
工具 | 作用 |
---|---|
Maven | Maven 是一个项目管理和构建工具,主要用于 Java 项目。它通过使用一个项目对象模型(POM)文件来描述项目的配置和依赖,并能够自动下载依赖、编译、测试、打包和部署项目。 |
JDK | JDK(Java Development Kit)是 Java 开发工具包,它包含了 Java 编译器、运行时环境(JRE)和其他开发工具,用于开发、编译和运行 Java 应用程序。 JDK 是 Java 开发的核心。 |
Gradle | Gradle 是一个灵活、高效的构建自动化工具,支持多种编程语言,但主要用于构建和管理 Java 项目。它使用 Groovy 或 Kotlin 作为脚本语言,并能够自动化执行编译、测试、打包等任务。 |
stage
在 Jenkins Pipeline 中,stage 是一个用于组织和划分 Pipeline 执行的重要块。stage 块用于将 Pipeline 分成不同的阶段,并允许您在 Jenkins 中可视化地查看每个阶段的执行结果。每个 stage 块通常表示一个构建阶段或一个功能单元。示例:
stage('Build') { |
step
在 Jenkins Pipeline 中,step 是一个用于执行具体构建任务的基本块。step 块用于定义单个构建步骤,每个步骤代表了 Pipeline 中的一个具体操作,例如构建代码、运行测试、部署应用等。示例:
stage('Test') { |
Pipeline示例
pipeline { |
triggers
触发器定义了如何自动触发pipeline执行流水线任务,触发器可用参数如下:
参数 | 描述 |
---|---|
cron | 根据时间表达式触发job,例如:triggers { cron('H */4 * * 1-5') } |
pollSCM | pollSCM是Jenkins流水线中的触发器函数,用于轮询源代码管理系统,检测是否有新的代码提交,并触发流水线执行。 |
upstream | 通过触发器调用job任务,例如:triggers { upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCCESS) } 当上游job运行成功之后触发器才会执行job1和job2 |
结果处理post
Pipeline
运行之后根据运行结果要进行的操作,比如发送邮件等信息
参数 | 描述 |
---|---|
always | 无论 Pipeline 或 stage 运行的完成状态如何,都执行后续步骤。 |
changed | 仅在当前 Pipeline 的运行状态与上一次运行状态不同时执行后续步骤。 |
fixed | 仅在当前 Pipeline 的运行成功且上一次运行失败或不稳定时执行后续步骤。 |
regression | 仅在当前 Pipeline 或状态为失败、不稳定或中止,且上一次运行成功时执行后续步骤。 |
aborted | 仅在当前 Pipeline 的运行状态为 “aborted” 时执行后续步骤,通常是由于手动中止 Pipeline。在网页界面中通常以灰色显示。 |
failure | 仅在当前 Pipeline 或 stage 的运行状态为 “failed” 时执行后续步骤,通常以红色在网页界面中显示。 |
success | 仅在当前 Pipeline 或 stage 的运行状态为 “success” 时执行后续步骤,通常以蓝色或绿色在网页界面中显示。 |
unstable | 仅在当前 Pipeline 的运行状态为 “unstable” 时执行后续步骤,通常由于测试失败、代码违规等导致。在网页界面中通常以黄色显示。 |
unsuccessful | 仅在当前 Pipeline 或 stage 的运行状态不为 “success” 时执行后续步骤。在网页界面中通常根据前面提到的状态进行显示(对于 stages 可能会在构建本身不稳定时触发)。 |
cleanup | 在所有其他后续条件评估完毕后,无论 Pipeline 或 stage 的状态如何,都执行后续步骤。 |
示例:
pipeline { |
input
在 Jenkins Pipeline 中,input 步骤用于在流水线执行过程中暂停,并等待用户的交互输入。它允许用户对流水线的执行进行确认或提供其他必要的信息,然后再继续执行后续的流程。
当流水线执行到 input 步骤时,Jenkins 将会暂停执行,并在 Jenkins 界面上显示一个输入对话框,等待用户输入。在输入对话框中,用户可以看到定义好的输入消息(可以是提示信息、问题或其他需要用户响应的信息),然后根据提示进行输入。用户可以点击 “Proceed” 或 “Abort” 按钮来确认或中止流水线的执行。
input 步骤通常用于需要人工干预或批准的场景,例如:
- 在执行部署操作前,确认是否继续执行;
- 在触发发布步骤后,确认发布的版本号或部署目标;
- 在执行关键任务前,确保具备必要的条件或资源;
- 在某个阶段执行失败后,决定是否继续执行后续步骤等。
input可用参数如下:
参数 | 描述 |
---|---|
message | 必填项。在用户提交输入时,将显示此消息。 |
id | 可选项。用于此输入的标识符。默认值基于阶段名称。 |
ok | 可选项。输入表单上 “ok” 按钮的文本。 |
submitter | 可选项。允许提交此输入的用户或外部组名的逗号分隔列表。默认允许任何用户。 |
submitterParameter | 可选项。如果存在,用于设置提交者名称的环境变量的名称。 |
parameters | 可选项。提示提交者提供的参数列表。有关更多信息,请参阅参数(parameters)的说明。 |
示例:
pipeline { |
when
When 指令允许 Pipeline 根据给定条件确定是否应执行该阶段。 When 指令必须至少包含一个条件。 如果when指令包含多个条件,则所有子条件都必须返回true才能执行该阶段。 这与子条件嵌套在 allOf 条件中相同(请参阅下面的示例)。 如果使用 anyOf 条件,请注意,一旦找到第一个“true”条件,该条件就会跳过剩余的测试。内置参数:
参数 | 描述 |
---|---|
branch | 当构建的分支匹配指定的分支模式(ANT 风格的路径通配符)时执行该阶段。例如:when { branch 'master' } 。请注意,该条件仅适用于多分支 Pipeline。 |
buildingTag | 当构建正在构建一个标签时执行该阶段。例如:when { buildingTag() } 。 |
changelog | 当构建的 SCM 变更日志包含给定的正则表达式模式时执行该阶段。例如:when { changelog '.*^\\[DEPENDENCY\\] .+$' } 。 |
changeset | 当构建的 SCM 变更集包含与给定模式匹配的一个或多个文件时执行该阶段。例如:when { changeset "**/*.js” } 。 |
environment | 当指定的环境变量的值等于给定的值时执行该阶段。例如:when { environment name: 'DEPLOY_TO', value: 'production' } 。 |
equals | 当期望的值等于实际值时执行该阶段。例如:when { equals expected: 2, actual: currentBuild.number } 。 |
expression | 当指定的 Groovy 表达式求值为 true 时执行该阶段。例如:when { expression { return params.DEBUG_BUILD } } 。 |
tag | 当 TAG_NAME 变量匹配给定的模式时执行该阶段。例如:when { tag "release-*" } 。如果提供了空模式,则在 TAG_NAME 变量存在时执行该阶段(等同于 buildingTag() )。 |
not | 当嵌套条件为 false 时执行该阶段。必须包含一个条件。例如:when { not { branch 'master' } } 。 |
allOf | 当所有嵌套条件都为 true 时执行该阶段。必须包含至少一个条件。例如:when { allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } } 。 |
anyOf | 当至少有一个嵌套条件为 true 时执行该阶段。必须包含至少一个条件。例如:when { anyOf { branch 'master'; branch 'staging' } } 。 |
triggeredBy | 当当前构建是由指定的参数触发时执行该阶段。 |
示例:当分支为production或staging时执行
stage('Example Deploy') { |
script
在 Jenkins Pipeline 中,script 是一个重要的步骤,它允许您在 Pipeline 中执行任意的 Groovy 脚本代码。script 步骤非常灵活,可以用于执行复杂的逻辑、调用外部插件或执行其他 Jenkins Pipeline 支持的操作。
示例:
pipeline { |
git
拉取代码可用参数:
参数 | 描述 |
---|---|
url |
Git 仓库的 URL。 |
branch |
要拉取的分支名称。 |
credentialsId |
使用凭据 ID 来访问私有 Git 仓库。 |
changelog |
是否生成更改日志。 |
clean |
是否在拉取之前清理工作目录。 |
cloneOptions |
传递给 git clone 命令的额外选项。 |
shallow |
是否执行浅克隆(只拉取最近的历史记录)。 |
depth |
设置浅克隆的深度(历史记录的数量)。 |
submodules |
是否拉取并初始化 Git 子模块。 |
poll |
是否在拉取之前执行 SCM 轮询。 |
disableSubmodules |
是否禁用 Git 子模块。 |
extensions |
传递给 git 命令的额外扩展选项。 |
reference |
使用已有的 Git 仓库作为引用进行克隆。 |
lfs |
是否使用 Git LFS(大文件存储)。 |
lfsSkipSmudge |
是否跳过 Git LFS 清除过滤器。 |
lfsInclude |
包含哪些文件用于 Git LFS。 |
lfsExclude |
排除哪些文件不用于 Git LFS。 |
lfsFetchInclude |
包含哪些文件在拉取时使用 Git LFS。 |
lfsFetchExclude |
排除哪些文件在拉取时不使用 Git LFS。 |
name |
设置远程仓库的名称。 |
示例:
stage('Git Checkout') { |
checkout
checkout可用参数:
参数 | 描述 |
---|---|
branch |
要拉取的分支名称。 |
changelog |
是否生成更改日志。 |
credentialId |
使用凭据 ID 来访问私有仓库。 |
poll |
是否在拉取之前执行 SCM 轮询。 |
submoduleCfg |
是否启用子模块的配置数据。 |
submoduleUpdate |
是否更新子模块。 |
depth |
设置浅克隆的深度,即拉取的历史记录数量。 |
quiet |
是否在控制台中输出更少的信息。 |
sparseCheckoutPaths |
用于设置 Sparse Checkout 的路径,仅拉取指定路径的文件。 |
git |
用于更细粒度地指定 Git 操作,如 fetch 和 clone。 |
示例:
stage('Checkout Code') { |
withEnv
withEnv 是 Jenkins Pipeline 中的一个步骤指令,用于临时设置环境变量。它允许您在指定的代码块中使用自定义的环境变量,而在代码块之外,环境变量不会生效。
基本语法
pipeline { |
withCredentials
withCredentials 是 Jenkins Pipeline 中的一个步骤指令,用于在 Pipeline 中使用敏感凭据,如用户名、密码、SSH 密钥等。它允许您在指定的代码块中使用凭据,而在代码块之外,凭据不会被暴露。
基本语法
pipeline { |
Jenkins Shared Libraries
Jenkins Shared Libraries(共享库)是一种在Jenkins中共享和重用代码的机制。它允许你在Jenkins Pipeline中引入自定义的Groovy代码,使得你可以在多个Pipeline脚本中共享和重用这些代码逻辑。
- Libraries目录结构:
目录 | 描述 |
---|---|
vars | 包含可在Pipeline中直接调用的全局变量脚本 |
src | 包含供全局变量脚本使用的辅助类和方法 |
resources | 可选,包含共享库使用的资源文件 |
- 引入共享库:要在Jenkins中使用共享库,需要在Jenkins系统配置中设置共享库的全局配置。可以通过指定库的名称、库的来源(如Git仓库)和版本等来配置共享库。
- 定义全局变量:在共享库的vars/目录下,可以创建多个Groovy脚本文件,每个文件定义一个全局变量。这些全局变量可在Pipeline中直接调用,类似于Jenkins内置的全局变量(如sh、echo等)。
- 辅助类和方法:在共享库的src/目录下,可以创建Groovy类和方法,供全局变量脚本使用。这些辅助类和方法可以提供更复杂的逻辑和功能,用于支持全局变量的实现。
- 版本管理:共享库可以使用版本控制系统进行管理,例如Git。通过指定库的版本,可以确保Pipeline使用特定版本的共享库代码。
- 用例:共享库适用于需要在多个Pipeline中共享和重用相同的代码逻辑的场景。通过使用共享库,可以提高代码的可维护性、重用性和一致性,减少重复编写代码的工作量。
构建Libraries groovy项目
- 创建groovy项目
- 在项目根目录下创建vars和resources目录,目录结构如下:
├── lib
├── resources
├── src
└── vars - 在
vars/log.groovy
定义日志lib库def info(message) {
echo "INFO: ${message}"
}
def debug(message) {
echo "DEBUG: ${message}"
}
def error(message) {
echo "ERROR: ${message}"
} - 在
src/Helper.groovy
中定义:package com.example
class Helper {
static void printMessage(String message) {
echo "Helper: ${message}"
}
} - Jenkins中配置gitee用户和密码凭据
- 在配置全局共享库
- Jenkinsfile测试调用定义的方法
'ops-lib@master') _ (
log.info "info"
log.debug "debug" - 修改时区,用户》设置》用户定义的时区,选择Asia/ShangHai
- Jenkins执行结果
[2023-07-07 07:00:18] INFO: info
[2023-07-07 07:00:18] DEBUG: debug
Finished: SUCCESS - 使用动态参数引入library
properties([parameters([string(name: 'LIB_VERSION', defaultValue: 'master')])])
library "ops-lib@${params.LIB_VERSION}"
log.info "info"
log.debug "debug" - 动态检索Library
properties([parameters([string(name: 'LIB_VERSION', defaultValue: 'master')])])
library identifier: "ops-lib@${params.LIB_VERSION}", retriever: modernSCM(
[$class: 'GitSCMSource',
remote: 'https://gitee.com/acaiblog/libraries.git',
credentialsId: '8918B00D-5DE0-489C-9D32-EC790E5ED4D1'])
log.info "info"
log.debug "debug"汇总
打印文件下载路径
// 获取当前构建的url
def buildUrl = env.BUILD_URL
// 构建文件下载地址
def fileUrl = "${buildUrl}/excution/node/3/ws/devops/utils/xxx.xlsx"
echo "File: ${fileUrl}"args序列化为json
import groovy.json.JsonOutput
def paramsJson = JsonOutput.toJson(args)向列表添加元素
def paramsList = ['a','b','c']
paramsList.add('d')解析JSON数据
def jsonString = '{"key1": "value1", "key2": "value2", "key3": {"nested_key": "nested_value"}}'
def jsonSlurper = new JsonSlurper()
def jsonData = jsonSlurper.parseText(jsonString)
echo "Value of key1: ${jsonData.key1}"
echo "Value of key2: ${jsonData.key2}"
echo "Value of nested_key: ${jsonData.key3.nested_key}"Pipeline调用其他Job
pipeline{
agent{ label Master }
states{
stage("Running Job"){
steps{
script{
if(xxx in xxx_list){
jobName = "aaa"
}else{
jobName = "bbb"
}
build(
job: jobName,
paramters:[
// name参数为需要传递给job的参数名称,value是给job传递变量的名称
string(name: 'xxx', value: xxx)
]
)
}
}
}
}
}给GIT打TAG
pipeline{
stages{
stage('Check Tag'){
steps{
dir("${WORKSPACE}"){
script{
def tagExists = sh(script: "git rev-parse ${TAG_NAME}", returnStatus: true) == 0
if (tagExists) {
println "tag ${TAG_NAME} is exist"
} else {
sh """
git checkout ${branch}
git tag ${TAG_NAME}
git push --tags http://xxxxxxx.git ${TAG_NAME}
"""
}
}
}
}
}
}
}Maven发布包到Nexus
设置env.VERSION可以让不同stage获取该变量pipeline {
agent any
stages {
stage('Get Version') {
steps {
script {
env.VERSION = sh(script: 'mvn -q help:evaluate -Dexpression=project.version', returnStdout: true)
echo "Project Version: ${env.VERSION}"
}
}
}
stage('Deploy') {
steps {
echo "Project Version: ${env.VERSION}"
sh "mvn deploy:deploy-file \
-Durl=https://your-nexus-repo-url/repository/maven-releases/ \
-DrepositoryId=your-nexus-repo-id \
-DgroupId=your.groupId \
-DartifactId=your-artifactId \
-Dversion=${env.VERSION} \
-Dpackaging=jar \
-Dfile=/path/to/your-artifact.jar \
-DpomFile=pom.xml"
}
}
}
}