web-dev-qa-db-ja.com

動的な環境変数を定義するJenkinsfile宣言パイプライン

私はJenkinsパイプラインは初めてです。宣言的な構文パイプラインを定義していますが、解決策が見つからなかったため、問題を解決できるかどうかわかりません。

この例では、変数をansibleプラグインに渡す必要があります(古いバージョンではENV_VARを使用するか、injectプラグインを使用してファイルからインジェクトします)。

これは私の完璧なシナリオです(ただし、環境{}のため機能しません):

pipeline {
  agent { node { label 'jenkins-node'}}

  stages {
    stage('Deploy') {
      environment {
        ANSIBLE_CONFIG = '${WORKSPACE}/chimera-ci/ansible/ansible.cfg'
        VERSION = sh("python3.5 docker/get_version.py")
      }
      steps {
        ansiblePlaybook credentialsId: 'example-credential', extras: '-e version=${VERSION}', inventory: 'development', playbook: 'deploy.yml'
      }
    }
  }
}

他の投稿でenv変数がどのように機能するかをテストする他の方法を試しました。

pipeline {
  agent { node { label 'jenkins-node'}}

  stages {
    stage('PREPARE VARS') {
      steps {
        script {
          env['VERSION'] = sh(script: "python3.5 get_version.py")
        }
        echo env.VERSION
      }
    }
  }
}

ただし、「echo env.VERSION」はnullを返します。

また、同じ例を試してみました:-VERSION = python3.5 get_version.py-VERSION = python3.5 get_version.py> props.file(それを注入しようとしましたが、どのように見つかりませんでした)

これが不可能な場合は、ansibleロールで実行します。

UPDATE

Ansible Pluginには別の「問題」があります。追加の変数で変数を使用するには、単一ではなく二重引用符が必要です。

ansiblePlaybook credentialsId: 'example-credential', extras: "-e version=${VERSION}", inventory: 'development', playbook: 'deploy.yml'
42
DEL

パイプラインブロックが開始する前に変数を作成できます。 shにstdoutを返させて、これらの変数に割り当てることができます。 environmentスタンザの環境変数に割り当てるのと同じ柔軟性はありません。ここでスクリプトのpython3.5 get_version.pyがあるecho 0.0.1で置き換えます(そして、pythonスクリプトが単にバージョンをstdoutに返すことを確認してください):

def awesomeVersion = 'UNKNOWN'

pipeline {
  agent { label 'docker' }
  stages {
    stage('build') {
      steps {
        script {
          awesomeVersion = sh(returnStdout: true, script: 'echo 0.0.1')
        }
      }
    }
    stage('output_version') {
      steps {
        echo "awesomeVersion: ${awesomeVersion}"
      }
    }
  }
}

上記のパイプラインの出力は次のとおりです。

awesomeVersion: 0.0.1
91
burnettk

Jenkins 2.76では、@ burnettkから次のソリューションを簡素化できました。

pipeline {
  agent { label 'docker' }
  environment {
    awesomeVersion = sh(returnStdout: true, script: 'echo 0.0.1')
  }
  stages {
    stage('output_version') {
      steps {
        echo "awesomeVersion: ${awesomeVersion}"
      }
    }
  }
}
19

「パイプラインユーティリティステップ」プラグインを使用して、プロパティファイルからすべてのステージで使用可能な一般的な変数を定義できます。たとえば、props.txtを次のようにします。

version=1.0
fix=alfa

スクリプトと宣言型Jenkinsパイプラインを次のように組み合わせます。

def props
def VERSION
def FIX
def RELEASE

node {
   props = readProperties file:'props.txt'
   VERSION = props['version']
   FIX = props['fix']
   RELEASE = VERSION + "_" + FIX
}

pipeline {
   stages {
      stage('Build') {
         echo ${RELEASE}
      }
   }
}
2
dpinya

すべての変数をファイルにダンプしてから、「-e @file」構文を使用することもできます。移入する変数が多数ある場合、これは非常に便利です。

steps {
  echo "hello World!!"
  sh """
  var1: ${params.var1}
  var2: ${params.var2}
  " > vars
  """
  ansiblePlaybook inventory: _inventory, playbook: 'test-playbook.yml', sudoUser: null, extras: '-e @vars'
}
0
krad