03.CI/CD:Jenkins pipeline 小教程-pipeline的另一种写法

在前两节中,写了二个简单的pipeline脚本。这节,会把这个脚本换一种方式来编写。

pipeline支持两种书写语法格式,分别为Declarative和Scripted。Declarative Pipeline与Scripted Pipeline的区别在于语法及灵活性上。Declarative Pipeline对用户的使用有更为严格及预先定义的结构要求,是针对较为简单的持续交付项目的一种理想选择。Scripted Pipeline对用户的限制比较小,如果有限制的话,也是在Groovy本身层面的限制,因此Scripted Pipeline更适合一些复杂的持续交付项目的需求。

在前两节中,使用的是Scripted语法,在这一节中,会将第二节中的脚本按Declarative语法重写。当然,在pipeline中,这两种语法是可以共存的,也就是在一个脚本中,可以既有Declarative,也可以有Scripted 。

在这一节中,用另一种方法来写 第二个小教程 中的脚本。原脚本如下:

  1. Scripted Pipeline范例:
def DEPLOY_ENVIRONMENT = "dev"
def DEPLOY_VER = "1.1"
if (DEPLOY_ENVIRONMENT == "dev") {
    CURRENT_ENVIRONMENT="development"
} else if (DEPLOY_ENVIRONMENT == "test"){
    CURRENT_ENVIRONMENT="test"
}
def CURRENT_VER = "${CURRENT_ENVIRONMENT}-${DEPLOY_VER}"
node {
   echo "当前的部署环境为:${CURRENT_ENVIRONMENT}"
   echo "当前的部署版本为:${CURRENT_VER}"
}
  1. Declarative Pipeline范例:
def DEPLOY_ENVIRONMENT = "dev"
def DEPLOY_VER = "1.1"
if (DEPLOY_ENVIRONMENT == "dev") {
    CURRENT_ENVIRONMENT="development"
} else if (DEPLOY_ENVIRONMENT == "test"){
    CURRENT_ENVIRONMENT="test"
}
def CURRENT_VER = "${CURRENT_ENVIRONMENT}-${DEPLOY_VER}"
pipeline {
	agent any
	stages {
		stage(Stu01) {
			steps {
				echo "当前的部署环境为:${CURRENT_ENVIRONMENT}"
				echo "当前的部署版本为:${CURRENT_VER}"
			}
		}
	}
}

Jenkins 中截图:
在这里插入图片描述

执行截图:
在这里插入图片描述



如果有什么问题,可以加入QQ群进行讨论。QQ群:839421316

谢谢支持。
在这里插入图片描述

Started by user admin [Pipeline] Start of Pipeline [Pipeline] node Running on Jenkins in /var/jenkins_home/workspace/model_lora [Pipeline] { [Pipeline] withCredentials Masking supported pattern matches of $GITLAB_TOKEN [Pipeline] { [Pipeline] withEnv [Pipeline] { [Pipeline] stage [Pipeline] { (🔍 参数校验) [Pipeline] script [Pipeline] { [Pipeline] echo [INFO] 校验输入参数... [Pipeline] } [Pipeline] // script [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (📁 创建远程工作目录) [Pipeline] script [Pipeline] { [Pipeline] sshCommand Executing command on target[10.100.15.95]: #!/bin/bash set -eo pipefail rm -rf '/opt/tmp/lora/20250918_172215' mkdir -p '/opt/tmp/lora/20250918_172215/model' \ '/opt/tmp/lora/20250918_172215/dataset' \ '/opt/tmp/lora/20250918_172215/model_lora' echo -e "\033[1;32m✅ 工作目录已创建:/opt/tmp/lora/20250918_172215\033[0m" sudo: false ✅ 工作目录已创建:/opt/tmp/lora/20250918_172215 [Pipeline] } [Pipeline] // script [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (📥 克隆模型仓库 (main 分支)) [Pipeline] script [Pipeline] { [Pipeline] withCredentials Masking supported pattern matches of $GITLAB_TOKEN_VALUE [Pipeline] { [Pipeline] echo [INFO] 克隆模型仓库(仅 main 分支):models/qwen-VL -> /opt/tmp/lora/20250918_172215/model [Pipeline] sshCommand Warning: A secret was passed to "sshCommand" using Groovy String interpolation, which is insecure. Affected argument(s) used the following variable(s): [GITLAB_TOKEN, GITLAB_TOKEN_VALUE] See https://jenkins.io/redirect/groovy-string-interpolation for details. Executing command on target[10.100.15.95]: #!/bin/bash set -eo pipefail set -x cd '/opt/tmp/lora/20250918_172215/model' rm -rf ./* .git* git clone -b main --depth 1 'http://root:****@10.100.15.95:8181/models/qwen-VL.git' . git config user.email "jenkins@auto.dev" git config user.name "Jenkins CI Bot" # 可选:检查关键模型文件(如 config.json) if [ ! -f ./config.json ] && [ ! -f ./model_index.json ]; then echo -e "\033[1;33m⚠️ 注意:未发现标准模型配置文件\033[0m" fi echo -e "\033[1;32m✅ 模型文件克隆完成\033[0m" sudo: false + cd /opt/tmp/lora/20250918_172215/model + rm -rf './*' '.git*' + git clone -b main --depth 1 http://root:****@10.100.15.95:8181/models/qwen-VL.git . Cloning into '.'... Updating files: 71% (15/21) Updating files: 76% (16/21) Updating files: 80% (17/21) Updating files: 85% (18/21) Updating files: 90% (19/21) Updating files: 95% (20/21) Updating files: 100% (21/21) Updating files: 100% (21/21), done. + git config user.email jenkins@auto.dev + git config user.name 'Jenkins CI Bot' + '[' '!' -f ./config.json ']' + echo -e '\033[1;32m✅ 模型文件克隆完成\033[0m' ✅ 模型文件克隆完成 [Pipeline] } [Pipeline] // withCredentials [Pipeline] } [Pipeline] // script [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (📥 克隆数据集仓库 (main 分支)) [Pipeline] script [Pipeline] { [Pipeline] withCredentials Masking supported pattern matches of $GITLAB_TOKEN_VALUE [Pipeline] { [Pipeline] echo [INFO] 克隆数据集仓库(仅 main 分支):datasets/test_lora -> /opt/tmp/lora/20250918_172215/dataset [Pipeline] sshCommand Warning: A secret was passed to "sshCommand" using Groovy String interpolation, which is insecure. Affected argument(s) used the following variable(s): [GITLAB_TOKEN, GITLAB_TOKEN_VALUE] See https://jenkins.io/redirect/groovy-string-interpolation for details. Executing command on target[10.100.15.95]: #!/bin/bash set -eo pipefail set -x cd '/opt/tmp/lora/20250918_172215/dataset' rm -rf ./* .git* git clone -b main --depth 1 'http://root:****@10.100.15.95:8181/datasets/test_lora.git' . git config user.email "jenkins@auto.dev" git config user.name "Jenkins CI Bot" # ✅ 关键修复:使用相对路径检查文件是否存在 if [ ! -f ./train.jsonl ]; then echo -e "\033[1;31m❌ 错误:数据集文件 ./train.jsonl 不存在,请确认仓库中包含该文件\033[0m" exit 1 fi echo -e "\033[1;32m✅ 数据集文件克隆完成\033[0m" sudo: false + cd /opt/tmp/lora/20250918_172215/dataset + rm -rf './*' '.git*' + git clone -b main --depth 1 http://root:****@10.100.15.95:8181/datasets/test_lora.git . Cloning into '.'... + git config user.email jenkins@auto.dev + git config user.name 'Jenkins CI Bot' + '[' '!' -f ./train.jsonl ']' + echo -e '\033[1;32m✅ 数据集文件克隆完成\033[0m' ✅ 数据集文件克隆完成 [Pipeline] } [Pipeline] // withCredentials [Pipeline] } [Pipeline] // script [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (🚀 执行微调命令) [Pipeline] script [Pipeline] { [Pipeline] echo [INFO] 原始命令: CUDA_VISIBLE_DEVICES=显卡 \ swift sft \ --torch_dtype 'bfloat16' \ --model '模型地址' \ --dataset '数据集地址' \ --split_dataset_ratio '0.2' \ --max_length '2048' \ --use_galore 'True' \ --galore_rank '64' \ --task_type 'causal_lm' \ --per_device_train_batch_size '14' \ --per_device_eval_batch_size '28' \ --learning_rate '1e-4' \ --num_train_epochs '2' \ --gradient_accumulation_steps '4' \ --eval_steps '500' \ --output_dir '模型保存地址' \ --neftune_noise_alpha '0' \ --report_to 'tensorboard' \ --add_version False [Pipeline] echo [DEBUG] 最终执行命令: CUDA_VISIBLE_DEVICES=7\ swift sft \ --torch_dtype 'bfloat16' \ --model '/opt/tmp/lora/20250918_172215/model' \ --dataset '/opt/tmp/lora/20250918_172215/dataset/train.jsonl}' \ --split_dataset_ratio '0.2' \ --max_length '2048' \ --use_galore 'True' \ --galore_rank '64' \ --task_type 'causal_lm' \ --per_device_train_batch_size '14' \ --per_device_eval_batch_size '28' \ --learning_rate '1e-4' \ --num_train_epochs '2' \ --gradient_accumulation_steps '4' \ --eval_steps '500' \ --output_dir '/opt/tmp/lora/20250918_172215/model_lora' \ --neftune_noise_alpha '0' \ --report_to 'tensorboard' \ --add_version False [Pipeline] sshCommand Executing command on target[10.100.15.95]: #!/bin/bash set -eo pipefail set -x export CUDA_VISIBLE_DEVICES=7 cd '/opt/tmp/lora/20250918_172215' source '/root/anaconda3/etc/profile.d/conda.sh' || true conda activate 'swift' || { echo 'Failed to activate conda env'; exit 1; } CUDA_VISIBLE_DEVICES=7\ swift sft \ --torch_dtype 'bfloat16' \ --model '/opt/tmp/lora/20250918_172215/model' \ --dataset '/opt/tmp/lora/20250918_172215/dataset/train.jsonl}' \ --split_dataset_ratio '0.2' \ --max_length '2048' \ --use_galore 'True' \ --galore_rank '64' \ --task_type 'causal_lm' \ --per_device_train_batch_size '14' \ --per_device_eval_batch_size '28' \ --learning_rate '1e-4' \ --num_train_epochs '2' \ --gradient_accumulation_steps '4' \ --eval_steps '500' \ --output_dir '/opt/tmp/lora/20250918_172215/model_lora' \ --neftune_noise_alpha '0' \ --report_to 'tensorboard' \ --add_version False echo -e "\033[1;32m✅ 微调任务执行成功!\033[0m" sudo: false + export CUDA_VISIBLE_DEVICES=7 + CUDA_VISIBLE_DEVICES=7 + cd /opt/tmp/lora/20250918_172215 + source /root/anaconda3/etc/profile.d/conda.sh ++ _CONDA_EXE=/root/anaconda3/bin/conda ++ _CONDA_ROOT=/root/anaconda3 ++ _conda_set_vars ++ '[' -n x ']' ++ _CONDA_SHELL_FLAVOR=bash ++ '[' -z x ']' ++ '[' -z x ']' ++ '[' -z x ']' + conda activate swift + '[' 2 -lt 1 ']' + local cmd=activate + shift + case "$cmd" in + _conda_activate swift + '[' -n '' ']' + local ask_conda ++ PS1='[\[\033[01;31m\]\u\[\033[00m\]@\[\033[01;32m\]\h\[\e[0m\](\[\e[01;33m\]15.95\[\e[0m\]) \[\033[01;34m\]\W\[\e[0m\]]# ' ++ /root/anaconda3/bin/conda shell.posix activate swift + ask_conda='PS1='\''(swift) [\[\033[01;31m\]\u\[\033[00m\]@\[\033[01;32m\]\h\[\e[0m\](\[\e[01;33m\]15.95\[\e[0m\]) \[\033[01;34m\]\W\[\e[0m\]]# '\'' \export CONDA_DEFAULT_ENV='\''swift'\'' \export CONDA_PREFIX='\''/opt/tpapp/conda/envs/swift'\'' \export CONDA_PREFIX_1='\''/root/anaconda3'\'' \export CONDA_PROMPT_MODIFIER='\''(swift) '\'' \export CONDA_SHLVL='\''2'\'' \export PATH='\''/opt/tpapp/conda/envs/swift/bin:/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'\''' + eval 'PS1='\''(swift) [\[\033[01;31m\]\u\[\033[00m\]@\[\033[01;32m\]\h\[\e[0m\](\[\e[01;33m\]15.95\[\e[0m\]) \[\033[01;34m\]\W\[\e[0m\]]# '\'' \export CONDA_DEFAULT_ENV='\''swift'\'' \export CONDA_PREFIX='\''/opt/tpapp/conda/envs/swift'\'' \export CONDA_PREFIX_1='\''/root/anaconda3'\'' \export CONDA_PROMPT_MODIFIER='\''(swift) '\'' \export CONDA_SHLVL='\''2'\'' \export PATH='\''/opt/tpapp/conda/envs/swift/bin:/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'\''' ++ PS1='(swift) [\[\033[01;31m\]\u\[\033[00m\]@\[\033[01;32m\]\h\[\e[0m\](\[\e[01;33m\]15.95\[\e[0m\]) \[\033[01;34m\]\W\[\e[0m\]]# ' ++ export CONDA_DEFAULT_ENV=swift ++ CONDA_DEFAULT_ENV=swift ++ export CONDA_PREFIX=/opt/tpapp/conda/envs/swift ++ CONDA_PREFIX=/opt/tpapp/conda/envs/swift ++ export CONDA_PREFIX_1=/root/anaconda3 ++ CONDA_PREFIX_1=/root/anaconda3 ++ export 'CONDA_PROMPT_MODIFIER=(swift) ' ++ CONDA_PROMPT_MODIFIER='(swift) ' ++ export CONDA_SHLVL=2 ++ CONDA_SHLVL=2 ++ export PATH=/opt/tpapp/conda/envs/swift/bin:/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ++ PATH=/opt/tpapp/conda/envs/swift/bin:/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + _conda_hashr + case "$_CONDA_SHELL_FLAVOR" in + hash -r + CUDA_VISIBLE_DEVICES='7 swift' + sft ' --torch_dtype' bfloat16 ' --model' /opt/tmp/lora/20250918_172215/model ' --dataset' '/opt/tmp/lora/20250918_172215/dataset/train.jsonl}' ' --split_dataset_ratio' 0.2 ' --max_length' 2048 ' --use_galore' True ' --galore_rank' 64 ' --task_type' causal_lm ' --per_device_train_batch_size' 14 ' --per_device_eval_batch_size' 28 ' --learning_rate' 1e-4 ' --num_train_epochs' 2 ' --gradient_accumulation_steps' 4 ' --eval_steps' 500 ' --output_dir' /opt/tmp/lora/20250918_172215/model_lora ' --neftune_noise_alpha' 0 ' --report_to' tensorboard ' --add_version' False bash: line 10: sft: command not found Failed command target#180 with status 127: #!/bin/bash set -eo pipefail set -x export CUDA_VISIBLE_DEVICES=7 cd '/opt/tmp/lora/20250918_172215' source '/root/anaconda3/etc/profile.d/conda.sh' || true conda activate 'swift' || { echo 'Failed to activate conda env'; exit 1; } CUDA_VISIBLE_DEVICES=7\ swift sft \ --torch_dtype 'bfloat16' \ --model '/opt/tmp/lora/20250918_172215/model' \ --dataset '/opt/tmp/lora/20250918_172215/dataset/train.jsonl}' \ --split_dataset_ratio '0.2' \ --max_length '2048' \ --use_galore 'True' \ --galore_rank '64' \ --task_type 'causal_lm' \ --per_device_train_batch_size '14' \ --per_device_eval_batch_size '28' \ --learning_rate '1e-4' \ --num_train_epochs '2' \ --gradient_accumulation_steps '4' \ --eval_steps '500' \ --output_dir '/opt/tmp/lora/20250918_172215/model_lora' \ --neftune_noise_alpha '0' \ --report_to 'tensorboard' \ --add_version False echo -e "\033[1;32m✅ 微调任务执行成功!\033[0m" [Pipeline] } [Pipeline] // script [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (📤 上传结果到 GitLab) Stage "📤 上传结果到 GitLab" skipped due to earlier failure(s) [Pipeline] getContext [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (Declarative: Post Actions) [Pipeline] cleanWs [WS-CLEANUP] Deleting project workspace... [WS-CLEANUP] Deferred wipeout is used... [WS-CLEANUP] done [Pipeline] echo ❌ 流水线执行失败,请检查日志。 [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // withCredentials [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline Also: org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: 67051e7b-50e1-410e-8e7a-eaebb550a4d2 org.hidetake.groovy.ssh.session.BadExitStatusException: Command returned exit status 127: #!/bin/bash set -eo pipefail set -x export CUDA_VISIBLE_DEVICES=7 cd '/opt/tmp/lora/20250918_172215' source '/root/anaconda3/etc/profile.d/conda.sh' || true conda activate 'swift' || { echo 'Failed to activate conda env'; exit 1; } CUDA_VISIBLE_DEVICES=7\ swift sft \ --torch_dtype 'bfloat16' \ --model '/opt/tmp/lora/20250918_172215/model' \ --dataset '/opt/tmp/lora/20250918_172215/dataset/train.jsonl}' \ --split_dataset_ratio '0.2' \ --max_length '2048' \ --use_galore 'True' \ --galore_rank '64' \ --task_type 'causal_lm' \ --per_device_train_batch_size '14' \ --per_device_eval_batch_size '28' \ --learning_rate '1e-4' \ --num_train_epochs '2' \ --gradient_accumulation_steps '4' \ --eval_steps '500' \ --output_dir '/opt/tmp/lora/20250918_172215/model_lora' \ --neftune_noise_alpha '0' \ --report_to 'tensorboard' \ --add_version False echo -e "\033[1;32m✅ 微调任务执行成功!\033[0m" at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Unknown Source) at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source) at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83) at org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:77) at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrap.callConstructor(ConstructorSite.java:84) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:258) at PluginClassLoader for ssh-steps//org.hidetake.groovy.ssh.session.execution.Command$Helper.execute(Command.groovy:52) at jdk.internal.reflect.GeneratedMethodAccessor5302.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98) at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite$StaticMetaMethodSiteNoUnwrapNoCoerce.invoke(StaticMetaMethodSite.java:151) at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:91) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:144) at PluginClassLoader for ssh-steps//org.hidetake.groovy.ssh.session.execution.Command$Trait$Helper.execute(Command.groovy:30) at org.hidetake.groovy.ssh.session.execution.Command$Trait$Helper$execute$0.call(Unknown Source) at PluginClassLoader for ssh-steps//org.hidetake.groovy.ssh.session.SessionHandler.execute(SessionHandler.groovy) at jdk.internal.reflect.GeneratedMethodAccessor5300.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSite.invoke(PogoMetaMethodSite.java:169) at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:71) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:136) at PluginClassLoader for ssh-steps//org.hidetake.groovy.ssh.session.execution.Command$Trait$Helper.execute(Command.groovy) at org.hidetake.groovy.ssh.session.execution.Command$Trait$Helper$execute.call(Unknown Source) at PluginClassLoader for ssh-steps//org.hidetake.groovy.ssh.session.SessionHandler.execute(SessionHandler.groovy) at jdk.internal.reflect.GeneratedMethodAccessor5299.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:352) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:68) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:169) at PluginClassLoader for ssh-steps//org.jenkinsci.plugins.sshsteps.SSHService$_executeCommand_closure3$_closure13.doCall(SSHService.groovy:182) at PluginClassLoader for ssh-steps//org.jenkinsci.plugins.sshsteps.SSHService$_executeCommand_closure3$_closure13.doCall(SSHService.groovy) at jdk.internal.reflect.GeneratedMethodAccessor5298.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:264) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:41) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:56) at PluginClassLoader for ssh-steps//org.hidetake.groovy.ssh.util.Utility.callWithDelegate(Utility.groovy:17) at jdk.internal.reflect.GeneratedMethodAccessor4848.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.invoke(StaticMetaMethodSite.java:46) at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.callStatic(StaticMetaMethodSite.java:102) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:217) at PluginClassLoader for ssh-steps//org.hidetake.groovy.ssh.session.SessionTask.wetRun(SessionTask.groovy:64) at jdk.internal.reflect.GeneratedMethodAccessor5267.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210) at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:161) at PluginClassLoader for ssh-steps//org.hidetake.groovy.ssh.session.SessionTask.call(SessionTask.groovy:48) at java_util_concurrent_Callable$call$0.call(Unknown Source) at PluginClassLoader for ssh-steps//org.hidetake.groovy.ssh.core.Service.run(Service.groovy:81) at org.hidetake.groovy.ssh.core.Service$run$0.call(Unknown Source) at PluginClassLoader for ssh-steps//org.jenkinsci.plugins.sshsteps.SSHService.executeCommand(SSHService.groovy:177) at PluginClassLoader for ssh-steps//org.jenkinsci.plugins.sshsteps.steps.CommandStep$Execution$CommandCallable.execute(CommandStep.java:89) at PluginClassLoader for ssh-steps//org.jenkinsci.plugins.sshsteps.util.SSHMasterToSlaveCallable.call(SSHMasterToSlaveCallable.java:35) at hudson.remoting.LocalChannel.call(LocalChannel.java:47) at PluginClassLoader for ssh-steps//org.jenkinsci.plugins.sshsteps.steps.CommandStep$Execution.run(CommandStep.java:77) at PluginClassLoader for ssh-steps//org.jenkinsci.plugins.sshsteps.util.SSHStepExecution.lambda$start$0(SSHStepExecution.java:88) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.base/java.util.concurrent.FutureTask.run(Unknown Source) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.base/java.lang.Thread.run(Unknown Source) Finished: FAILURE
09-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值