mito’s blog

IT技術メインの雑記。思い立ったが吉日。

[Jenkins] パイプライン内で$文字列をsedで置換する


はじめに

Jenkinsのパイプラインの「$xxx」をsedコマンドで変換します。


成功パターン

$の前に「\」バックスラッシュをつけ「'」シングルクォーテーションで囲む
sh "sed -i 's/\$xxx/AAA/g' test.txt"


  • Jenkinsfile
pipeline {
    agent any
    
    stages {
        stage('sed') {
            steps {
                sh "echo '\$xxx' > ./test.txt"
                sh "cat test.txt"
                sh "sed -i 's/\$xxx/AAA/g' test.txt"
                sh "cat test.txt"
            }
        }

         stage('delete_ws') {
            steps {
                cleanWs()
            }
        }       
    }
}


  • 実行ログ
Started by user user
[Pipeline] Start of Pipeline
[Pipeline] node
Running on node in /home/ec2-user/workspace/test_job
[Pipeline] {
[Pipeline] stage
[Pipeline] { (sed)
[Pipeline] sh
+ echo '$xxx'
[Pipeline] sh
+ cat test.txt
$xxx
[Pipeline] sh
+ sed -i 's/$xxx/AAA/g' test.txt
[Pipeline] sh
+ cat test.txt
AAA
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (delete_ws)
[Pipeline] cleanWs
[WS-CLEANUP] Deleting project workspace...
[WS-CLEANUP] Deferred wipeout is used...
[WS-CLEANUP] done
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS


失敗パターン

$の前に「\」をつけるのみ
sh "sed -i s/\$xxx/AAA/g test.txt"


  • Jenkinsfile
pipeline {
    agent any
    
    stages {
        stage('sed') {
            steps {
                sh "echo '\$xxx' > ./test.txt"
                sh "cat test.txt"
                sh "sed -i s/\$xxx/AAA/g test.txt"
                sh "cat test.txt"
            }
        }

         stage('delete_ws') {
            steps {
                cleanWs()
            }
        }       
    }
}


  • 実行ログ
    • $xxxを変数として扱い、それが未設定であり初回実行でもあるため、エラーになります。
    • 「\」を付けない場合でも、同様にエラーとなります。
Started by user user
[Pipeline] Start of Pipeline
[Pipeline] node
Running on node in /home/ec2-user/workspace/test_job
[Pipeline] {
[Pipeline] stage
[Pipeline] { (sed)
[Pipeline] sh
+ echo '$xxx'
[Pipeline] sh
+ cat test.txt
$xxx
[Pipeline] sh
+ sed -i s//AAA/g test.txt
sed: -e expression #1, char 0: no previous regular expression
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (delete_ws)
Stage "delete_ws" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE


$の前に「\」をつけ、引数は「"」で、全体は「'」で囲む
sh 'sed -i "s/\$xxx/AAA/g" test.txt'


  • Jenkinsfile
pipeline {
    agent any
    
    stages {
        stage('sed') {
            steps {
                sh "echo '\$xxx' > ./test.txt"
                sh "cat test.txt"
                sh 'sed -i "s/\$xxx/AAA/g" test.txt'
                sh "cat test.txt"
            }
        }

         stage('delete_ws') {
            steps {
                cleanWs()
            }
        }       
    }
}


  • 実行ログ
    • $xxxを変数として扱い、それが未設定であり初回実行でもあるため、エラーになります
Started by user user
[Pipeline] Start of Pipeline
[Pipeline] node
Running on node in /home/ec2-user/workspace/test_job
[Pipeline] {
[Pipeline] stage
[Pipeline] { (sed)
[Pipeline] sh
+ echo '$xxx'
[Pipeline] sh
+ cat test.txt
$xxx
[Pipeline] sh
+ sed -i s//AAA/g test.txt
sed: -e expression #1, char 0: no previous regular expression
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (delete_ws)
Stage "delete_ws" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE


$の前に「\」をつけ、引数は「"」で、全体も「"」で囲む
sh "sed -i "s/\$xxx/AAA/g" test.txt"


  • Jenkinsfile
pipeline {
    agent any
    
    stages {
        stage('sed') {
            steps {
                sh "echo '\$xxx' > ./test.txt"
                sh "cat test.txt"
                sh "sed -i "s/\$xxx/AAA/g" test.txt"
                sh "cat test.txt"
            }
        }

         stage('delete_ws') {
            steps {
                cleanWs()
            }
        }       
    }
}


  • 実行ログ
    • 構文エラーになります。
    • 「'」に置き換えても、全体を囲まない場合でも、構文エラーになります。
Started by user user
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 9: expecting '}', found 's' @ line 9, column 29.
                   sh "sed -i "s/\$xxx/AAA/g" test.txt"
                               ^

1 error
Finished: FAILURE