web-dev-qa-db-ja.com

SubVersionのポーリングによってJenkins Pipelineがトリガーされるように構成するにはどうすればよいですか?

しばらくの間、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」ビルドトリガーオプションがありますが、リポジトリを指定できる「ソースコード管理」セクションはありません。どうすればこれを達成できますか?

14
Jon Lawson

私が働いていることがわかった解決策は次のとおりです:

  1. パイプラインスクリプトをファイル(デフォルトはJenkinsFile)に移動し、Subversionのプロジェクトのルートに保存します。
  2. パイプラインジョブ定義ソースを「SCMからのパイプラインスクリプト」に設定し、通常のJenkinsビルドジョブに従ってSubversionでプロジェクトを検索する場所の詳細を入力し、パイプラインスクリプトを含むJenkinsFileを指すようにスクリプトパスを設定します。
  3. パイプラインジョブのビルドトリガーを「Poll SCM」に設定し、スケジュールを入力します。
  4. パイプラインジョブを手動で実行する

ポーリングトリガーが正しいリポジトリをポーリングしてポーリングする原因となったパイプラインジョブを手動で実行するステップ4のようです。それ以前は、どこを見るべきかわからなかったようです。

9
Jon Lawson

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 を設定する必要があります。

6
heenenee

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']])
}

しかし、私のパイプラインの仕事のために働きます。お役に立てれば。

4
zionyx

パイプラインスクリプトがプロジェクトの一部ではない場合、またはジョブで定義されている場合の代替として、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 で文書化されています。詳細なし。

2

そのため、これを機能させるためにA LOTの問題が発生しました。問題の解決方法は次のとおりです。

Jenkinsでは、Pipeline Jobを作成します。このジョブに必要なコンテンツは次のとおりです。

  • POLL SCM(@monthlyなどの任意の値を使用)
  • ジョブがあなたのJenkinsfileを見つけるべき場所

他のすべての設定は、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]])}
2
Dakimaz