2021年10月14日10:29:56 星期四
pipeline script groovy 基础,注意点
错误代码示例 1. 传参没有注意“字符串”要加引号
Definition Pipeline script
node(demo_slave)
{
stage('show_ip')
{
sh """!/bin/bash -xe
ip -o -4 a
"""
}
}
运行日志
Console Output
10:25:02 Started by user apple
10:25:02 Running in Durability level: MAX_SURVIVABILITY
10:25:02 [Pipeline] Start of Pipeline
10:25:02 [Pipeline] End of Pipeline
10:25:03 hudson.remoting.ProxyException: groovy.lang.MissingPropertyException: No such property: demo_slave for class: WorkflowScript
10:25:03 at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53)
错误显示 No such property: demo_slave
实际上配置了 jenkins slave node 名字是 'demo_slave',
如果要在 script 中 使用 node(node_name)来用 demo_slave,
要注意加引号 node('demo_slave'),
如果不加引号,就表示引用的是变量,如果没有定义变量,就会报上面的错误。
修改代码
node_name='demo_slave'
node(node_name)
{
stage('show_ip')
{
sh """!/bin/bash -xe
ip -o -4 a
"""
}
}
运行 Console Output
10:40:15 Started by user apple
10:40:15 Running in Durability level: MAX_SURVIVABILITY
10:40:15 [Pipeline] Start of Pipeline
10:40:15 [Pipeline] node
10:40:15 Running on demo_slave in /home/jenkins/workspace/demo_slave
10:40:15 [Pipeline] {
10:40:16 [Pipeline] stage
10:40:16 [Pipeline] { (show_ip)
10:40:16 [Pipeline] sh
10:40:16 + !/bin/bash -xe
10:40:16 /home/jenkins/workspace/demo_slave@tmp/durable-04a6f628/script.sh: 1: /home/jenkins/workspace/demo_slave@tmp/durable-04a6f628/script.sh: !/bin/bash: not found
10:40:16 [Pipeline] }
10:40:16 [Pipeline] // stage
10:40:17 [Pipeline] }
10:40:17 [Pipeline] // node
10:40:17 [Pipeline] End of Pipeline
10:40:18 ERROR: script returned exit code 127
10:40:18 Finished: FAILURE
这个报错是 !/bin/bash 前面少了个 # 注释符
正确代码
node_name='demo_slave'
node(node_name)
{
stage('show_ip')
{
sh """#!/bin/bash -xe
ip -o -4 a
"""
}
}
Console Output
10:46:54 Started by user apple
10:46:54 Running in Durability level: MAX_SURVIVABILITY
10:46:55 [Pipeline] Start of Pipeline
10:46:55 [Pipeline] node
10:46:55 Running on target_ubuntu_h620_182 in /home/jenkins/workspace/demo
10:46:55 [Pipeline] {
10:46:55 [Pipeline] stage
10:46:55 [Pipeline] { (show_ip)
10:46:55 [Pipeline] sh
10:46:56 + ip -o -4 a
10:46:56 1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever
10:46:56 2: eno1 inet 192.168.1.8/24 brd 192.168.1.255 scope global dynamic eno1\ valid_lft 1249488sec preferred_lft 1249488sec
10:46:56 [Pipeline] }
10:46:56 [Pipeline] // stage
10:46:56 [Pipeline] }
10:46:56 [Pipeline] // node
10:46:56 [Pipeline] End of Pipeline
10:46:57 Finished: SUCCESS
总结
- 注意语法规范(使用变量,使用字符串,不能搞混了)
- 要细心,程序是严格遵循语法的,你写错了一个标点、多写了、少写了,程序是会报错,它是不讲人情,六亲不认的。所以写代码编程要严谨。
- 重要的事说三遍:基础很重要,多听、多读、多写,就是练习,练习,再练习。刻意练习难题,把心思精力放在上面,思考。知其然,知其所以然。
- 遵循定理原理,发挥想象探索。
错误代码 2:要注意不能使用无中生有(没有定义的)变量
node_name='demo_slave'
node(node_name)
{
stage('log')
{
script.archiveArtifacts artifacts: "logs/*", fingerprint: true
}
}
Console Output
11:39:00 Started by user apple
11:39:00 Running in Durability level: MAX_SURVIVABILITY
11:39:00 [Pipeline] Start of Pipeline
11:39:00 [Pipeline] node
11:39:01 Running on target_ubuntu_518_dm1_100 in /home/jenkins/workspace/demo
11:39:01 [Pipeline] {
11:39:01 [Pipeline] stage
11:39:01 [Pipeline] { (log)
11:39:01 [Pipeline] }
11:39:01 [Pipeline] // stage
11:39:02 [Pipeline] }
11:39:02 [Pipeline] // node
11:39:02 [Pipeline] End of Pipeline
11:39:02 hudson.remoting.ProxyException: groovy.lang.MissingPropertyException: No such property: script for class: WorkflowScript
报错显示 No such property: script for class: WorkflowScript
说明 script 这个是无中生有(没有定义的变量),在 WorkflowScript 空间直接使用 archiveArtifacts 就可以
正确代码
node_name='demo_slave'
node(node_name)
{
stage('log')
{
archiveArtifacts artifacts: "logs/*", fingerprint: true
}
}
Console Output
11:48:22 Started by user apple
11:48:22 Running in Durability level: MAX_SURVIVABILITY
11:48:22 [Pipeline] Start of Pipeline
11:48:22 [Pipeline] node
11:48:22 Running on demo_slave in /home/jenkins/workspace/demo
11:48:22 [Pipeline] {
11:48:23 [Pipeline] stage
11:48:23 [Pipeline] { (log)
11:48:23 [Pipeline] archiveArtifacts
11:48:23 Archiving artifacts
11:48:23 Recording fingerprints
11:48:25 [Pipeline] }
11:48:25 [Pipeline] // stage
11:48:25 [Pipeline] }
11:48:25 [Pipeline] // node
11:48:25 [Pipeline] End of Pipeline
11:48:27 Finished: SUCCESS
错误3: map 要先定义,后设置
错误代码
import groovy.transform.Field
@Field def g_detailed_results = [:]
class CLOG implements Serializable
{
def script
def CLOG(WorkflowScript)
{
this.script = WorkflowScript
}
def test_map()
{
def mode_result='COV'
script.g_detailed_results["${mode_result}"]['KEY'] = 'key'
}
}
node_name='demo_slave'
node(node_name)
{
stage('log')
{
clog=new CLOG(this)
clog.test_map()
}
}
Console Output
15:18:20 Started by user apple
15:18:20 Running in Durability level: MAX_SURVIVABILITY
15:18:20 [Pipeline] Start of Pipeline
15:18:20 [Pipeline] node
15:18:20 Running on demo_slave in /home/jenkins/workspace/demo
15:18:21 [Pipeline] {
15:18:21 [Pipeline] stage
15:18:21 [Pipeline] { (log)
15:18:21 [Pipeline] }
15:18:21 [Pipeline] // stage
15:18:21 [Pipeline] }
15:18:21 [Pipeline] // node
15:18:22 [Pipeline] End of Pipeline
15:18:23 java.lang.NullPointerException: Cannot set property 'KEY' on null object
报错 Cannot set property 'KEY' on null object,
因为 g_detailed_results["${mode_result}"] 没有定义,所以它是 null object,我们要把它当 map 使用,所以就要在使用前定义它
script.g_detailed_results["${mode_result}"] = [:]
正确代码
import groovy.transform.Field
@Field def g_detailed_results = [:]
class CLOG implements Serializable
{
def script
def CLOG(WorkflowScript)
{
this.script = WorkflowScript
}
def test_map()
{
def mode_result='COV'
script.g_detailed_results["${mode_result}"] = [:]
script.g_detailed_results["${mode_result}"]['KEY'] = 'key'
}
}
node_name='demo_slave'
node(node_name)
{
stage('log')
{
clog=new CLOG(this)
clog.test_map()
}
}
Console Output
15:35:35 Started by user apple
15:35:35 Running in Durability level: MAX_SURVIVABILITY
15:35:35 [Pipeline] Start of Pipeline
15:35:36 [Pipeline] node
15:35:36 Running on demo_slave in /home/jenkins/workspace/demo
15:35:36 [Pipeline] {
15:35:36 [Pipeline] stage
15:35:36 [Pipeline] { (log)
15:35:37 [Pipeline] }
15:35:37 [Pipeline] // stage
15:35:37 [Pipeline] }
15:35:37 [Pipeline] // node
15:35:37 [Pipeline] End of Pipeline
15:35:37 Finished: SUCCESS
总结
不能想那当然的使用无中生有的代码(没有定义的代码),要遵守编程规范,不然,就会出低级和莫名其妙的问题。
注意基础,注意仔细。
网友评论