39

私のプロジェクトはバージョン番号を受け取ります ('.' または '_' で区切られています)。これらの数値の最初の 2 つだけを使用して Jenkins 環境変数を作成する Groovy スクリプトを作成してみました。

//Get the version parameter
def env = System.getenv()
def version = env['currentversion']
def m = version =~/\d{1,2}/
env = ['miniVersion':m[0].m[1]]

私はこれを正しくやっていますか?新しい環境変数を作成することはできますか? これに対するより良い解決策はありますか?

4

11 に答える 11

53

ジェンキンス 1.x

次の groovy スニペットは、(既に提供されているように) バージョンを渡し、ジョブの変数に「miniVersion」として格納する必要があります。

import hudson.model.*
  
def env = System.getenv()
def version = env['currentversion']
def m = version =~/\d{1,2}/
def minVerVal = m[0]+"."+m[1]
  
def pa = new ParametersAction([
  new StringParameterValue("miniVersion", minVerVal)
])
  
// add variable to current job
Thread.currentThread().executable.addAction(pa)

その後、変数は他のビルド ステップからアクセスできるようになります。例えば

echo miniVersion=%miniVersion%

出力:

miniVersion=12.34

「Groovy プラグイン」ではなく、「システム Groovy スクリプト」(マスター ノードのみ) を使用する必要があると思います - https://wiki.jenkins-ci.org/display/JENKINS/Groovy+plugin# Groovyplugin-GroovyScriptvsSystemGroovyScript

ジェンキンス 2.x

以前の ( Jenkins 1.x ) の動作は、このセキュリティ アドバイザリが原因で機能しなくなったと思います...

解決策 (セキュリティ アドバイザリからの言い換え)

hudson.model.ParametersAction.keepUndefinedParametersシステム プロパティを に設定すると、以前の動作に戻すことができますtrueこれは非常に危険な可能性があり、短期的な回避策としてのみ意図されています。

java -Dhudson.model.ParametersAction.keepUndefinedParameters=true -jar jenkins.war

特定の既知の安全なパラメーター名をビルドに渡すことができるようにするには、システム プロパティhudson.model.ParametersAction.safeParametersを安全なパラメーター名のコンマ区切りリストに設定します。

例えば

java -Dhudson.model.ParametersAction.safeParameters=miniVersion,FOO,BAR -jar jenkins.war

groovy では、これらの 2 行は次のように記述します。

System.setProperty("hudson.model.ParametersAction.keepUndefinedParameters","true");
System.setProperty("hudson.model.ParametersAction.safeParameters","miniVersion,FOO,BAR");  
于 2012-10-04T06:31:29.543 に答える
23

Groovy システム スクリプト内で EnvInject プラグインを使用せずに変数を定義することもできます。

import hudson.model.*
def build = Thread.currentThread().executable
def pa = new ParametersAction([
  new StringParameterValue("FOO", "BAR")
])
build.addAction(pa)

次に、(たとえば) Windows バッチ コマンドである次のビルド ステップでこの変数にアクセスできます。

@echo off
Setlocal EnableDelayedExpansion
echo FOO=!FOO!

このエコーは「FOO=BAR」を表示します。

よろしく

于 2014-02-21T13:59:42.287 に答える
10

他の回答が述べているように、新しい設定ParametersActionは1つ以上の環境変数を注入する方法です、ジョブがすでにパラメーター化されている場合、新しいアクションの追加は有効になりません。代わりに、同じパラメーター セットを指すビルド パラメーターへの 2 つのリンクが表示され、追加したいリンクはnull.

以下は、両方の場合 (パラメーター化されたジョブとパラメーター化されていないジョブ) でパラメーター リストを更新するスニペットです。

import hudson.model.*

def build = Thread.currentThread().executable

def env = System.getenv()
def version = env['currentversion']
def m = version =~/\d{1,2}/
def minVerVal = m[0]+"."+m[1]

def newParams = null

def pl = new ArrayList<StringParameterValue>()
pl.add(new StringParameterValue('miniVersion', miniVerVal))

def oldParams = build.getAction(ParametersAction.class)

if(oldParams != null) {
  newParams = oldParams.createUpdated(pl)
  build.actions.remove(oldParams)
} else {
  newParams = new ParametersAction(pl)
}

build.addAction(newParams)
于 2014-09-11T20:37:35.657 に答える
9

Jenkins EnvInject Pluginが役立つかもしれません。ビルド環境に環境変数を挿入できます。

スクリプトを実行する機能があることはわかっているので、必要なことを実行できる可能性があります。単純なプロパティを設定するためだけに使用しました (例: "LOG_PATH=${WORKSPACE}\logs")。

于 2012-05-02T14:00:35.007 に答える
4

同じ問題がありました。グルーヴィーなスクリプトの結果に基づいて、パラメーター化されたダウンストリーム ジョブを動的にトリガーしたいと考えていました。

残念ながら、Jenkins では System Groovy スクリプトを実行できません。したがって、小さな回避策を講じる必要がありました。

  1. 設定する環境変数が指定されたプロパティ ファイルを作成する groovy スクリプトを実行します。

    def props = new File("properties.text")
    if (props.text == 'foo=bar') {
        props.text = 'foo=baz'
    } else {
        props.text = 'foo=bar'
    }
    
  2. env inject プラグインを使用して、このスクリプトに記述された変数を注入します

    Inject environment variable
    Property file path: properties.text
    

その後、パラメータ化されたトリガー プラグインのパラメータとして変数「foo」を使用することができました。ある種の回避策。しかし、動作します!

于 2015-09-09T16:48:14.533 に答える
1

私の環境は、Jenkins などの以前のツールであり、バッチ ファイルで実行されていました (私は年をとっています)。したがって、これらのバッチ ファイル (およびそのサブバッチ ファイル) は環境変数を使用しています。これは、環境変数を挿入する私のグルーヴィーなスクリプトです。使用される名前とパラメーターはダミーのものです。

// The process/batch which uses environment variables
def buildLabel = "SomeVersionNr"
def script = "startBuild.bat"
def processBuilder = new ProcessBuilder(script, buildLabel)

//Inject our environment variables
Map<String, String> env = processBuilder.environment()
env.put("ProjectRoot", "someLocation")
env.put("SomeVar", "Some")

Process p = processBuilder.start()
p.waitFor()

もちろん、Jenkins を最初からセットアップする場合は、おそらく別の方法で変数を共有したり、パラメーターを渡したりするでしょうが、これは便利な場合があります。

于 2017-08-04T17:31:03.000 に答える