しばらくの間、Jenkinsを継続的インテグレーションに使用しています。典型的なビルドジョブは、「ソースコード管理」セクションでSVNリポジトリと資格情報を指定し、「ビルドトリガー」セクションで10分ごとのポーリングスケジュール(H/10 * * * *)で「ポーリングSCM」を有効にします。 。 Jenkinsの最新バージョンに更新し、パイプラインビルドのセットアップを検討しています。典型的なパイプラインスクリプトは次のようになります。
node {
stage 'Build'
build job: 'MyApplication Build'
stage 'Deploy to test environment'
build job: 'MyApplication Deploy', parameters: [
[$class: 'StringParameterValue', name: 'DatabaseServer', value: 'DatabaseServer1'],
[$class: 'StringParameterValue', name: 'WebServer', value: 'WebServer1']
]
stage 'RunIntegrationTests'
build job: 'MyApplication Test', parameters: [
[$class: 'StringParameterValue', name: 'DatabaseServer', value: 'DatabaseServer1'],
[$class: 'StringParameterValue', name: 'WebServer', value: 'WebServer1']
]
}
パイプラインジョブが手動でトリガーされると、すべてが正常に実行されますが、新しいリビジョンがSVNリポジトリにチェックインされるたびにこのパイプラインが実行されるようにします。パイプライン構成には「ポーリングSCM」ビルドトリガーオプションがありますが、リポジトリを指定できる「ソースコード管理」セクションはありません。どうすればこれを達成できますか?
私が働いていることがわかった解決策は次のとおりです:
ポーリングトリガーが正しいリポジトリをポーリングしてポーリングする原因となったパイプラインジョブを手動で実行するステップ4のようです。それ以前は、どこを見るべきかわからなかったようです。
Jenkins Declarative Pipeline スクリプトを使用すると、次のように10分ごとにSVNリポジトリURLをポーリングするようにジョブを設定できます。
pipeline {
agent any
triggers {
pollSCM 'H/10 * * * *'
}
stages {
stage('checkout') {
steps {
checkout([
$class: 'SubversionSCM',
additionalCredentials: [],
excludedCommitMessages: '',
excludedRegions: '',
excludedRevprop: '',
excludedUsers: '',
filterChangelog: false,
ignoreDirPropChanges: false,
includedRegions: '',
locations: [[
credentialsId: 'mySvnCredentials',
depthOption: 'infinity',
ignoreExternalsOption: true,
local: '.',
remote: 'http://example.com/svn/url/trunk']],
workspaceUpdater: [$class: 'CheckoutUpdater']
])
}
}
}
}
pollSCM
トリガーは、checkout
ステップで指定されたURL、SCMからのDeclarative PipelineスクリプトのURL、グローバルパイプラインライブラリのURLなど、ビルドに関連付けられたすべてのSCMリポジトリURLを自動的にポーリングする必要があります。 。ただし、パイプラインをすべてのリビジョンに対して本当に実行したい場合は、代わりに post-commit hook を設定する必要があります。
SCM情報で構成されるBuildステージの前にCheckoutステージが必要だと思います。これにより、ジョブはPoll SCMを必要な間隔で実行し、パイプラインを実行できます。
SCMにJenkinsFileとして保存するパイプラインコードがなくても、パイプラインスクリプトを使用することもできます。
以下は私のSVN チェックアウトステージパイプラインコードですビルドステージの前:
stage('Checkout') {
checkout([$class: 'SubversionSCM',
additionalCredentials: [],
excludedCommitMessages: '',
excludedRegions: '',
excludedRevprop: '',
excludedUsers: 'buildbot',
filterChangelog: false,
ignoreDirPropChanges: false,
includedRegions: '',
locations: [[credentialsId: 'b86bc2b6-994b-4811-ac98-0f35e9a9b114',
depthOption: 'infinity',
ignoreExternalsOption: true,
local: '.',
remote: "http://svn/something/trunk/"]],
workspaceUpdater: [$class: 'UpdateUpdater']])
}
しかし、私のパイプラインの仕事のために働きます。お役に立てれば。
パイプラインスクリプトがプロジェクトの一部ではない場合、またはジョブで定義されている場合の代替として、poll: true
チェックアウトステージへ。
例:
stage('checkout') {
checkout(
changelog: true,
poll: true, /*This is the important option*/
scm: [
$class: 'SubversionSCM',
filterChangelog: false,
ignoreDirPropChanges: false,
locations: [...], /*ommited for obvious reasons*/
workspaceUpdater: [$class: 'CheckoutUpdater']
])
}
最初の実行後、このSCMからのポーリングが開始され、パイプラインが存在する場合はSCMからのポーリングも開始されます。
このオプションは https://jenkins.io/doc/pipeline/steps/workflow-scm-step/#code-checkout-code-general-scm で文書化されています。詳細なし。
そのため、これを機能させるためにA LOTの問題が発生しました。問題の解決方法は次のとおりです。
Jenkinsでは、Pipeline Jobを作成します。このジョブに必要なコンテンツは次のとおりです。
@monthly
などの任意の値を使用)他のすべての設定は、Jenkinsfileに入ります。しかしながら:
triggers {
pollSCM('@monthly')}
[〜#〜] still [〜#〜]は、ジョブで既に指定されていても、Jenkinsfileで指定する必要があります。
ただし、 zionyx は、他に何かを行う前にcheckoutを行う必要があると述べています。私たちのケースでは、多くの理由でこれを避けたいと思っていました。幸運なことに、depthOption: 'empty'
があれば機能します。
最後に、最初のジョブの実行を手動で開始する必要があります。
おそらく使用できる小さな機能を作成しました。
def checkoutSVN(Boolean ignoreExternalsOption, String local, String remote, String updater) {
checkout([$class: 'SubversionSCM',
additionalCredentials:
[[credentialsId: 'get-this-from-your-jenkins',
realm: '<https://your-server> CollabNet Subversion Repository']],
excludedCommitMessages: '',
excludedRegions: '',
excludedRevprop: '',
excludedUsers: '',
filterChangelog: false,
ignoreDirPropChanges: false,
includedRegions: '',
locations: [[credentialsId: 'get-this-from-your-jenkins',
depthOption: 'empty',
ignoreExternalsOption: ignoreExternalsOption,
local: local,
remote: remote]],
quietOperation: false,
workspaceUpdater: [$class: updater]])}