web-dev-qa-db-ja.com

Gitのコードを使用してJenkins Pipelineを実行する

私はジェンキンスのgitから次のパイプラインスクリプトを使用したい

#!groovy
pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building..'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}

リポジトリURLを右に設定し、[追加の動作]の下に[サブディレクトリにチェックアウト]を追加して、そこにサブディレクトリを作成しました。

「Script-Path」で次のように書きました:mysubdirectory/Jenkinsfile

実行しようとすると、次のエラーが発生します。

Java.io.FileNotFoundException
    at jenkins.plugins.git.GitSCMFile$3.invoke(GitSCMFile.Java:167)
    at jenkins.plugins.git.GitSCMFile$3.invoke(GitSCMFile.Java:159)
    at jenkins.plugins.git.GitSCMFileSystem$3.invoke(GitSCMFileSystem.Java:162)
    at org.jenkinsci.plugins.gitclient.AbstractGitAPIImpl.withRepository(AbstractGitAPIImpl.Java:29)
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.withRepository(CliGitAPIImpl.Java:71)
    at jenkins.plugins.git.GitSCMFileSystem.invoke(GitSCMFileSystem.Java:158)
    at jenkins.plugins.git.GitSCMFile.content(GitSCMFile.Java:159)
    at jenkins.scm.api.SCMFile.contentAsString(SCMFile.Java:338)
    at org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition.create(CpsScmFlowDefinition.Java:101)
    at org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition.create(CpsScmFlowDefinition.Java:59)
    at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.Java:262)
    at hudson.model.ResourceController.execute(ResourceController.Java:97)
    at hudson.model.Executor.run(Executor.Java:415)
Finished: FAILURE

何が間違っていますか?

GitからJenkins Scriptを正しく実行するにはどうすればよいですか?

20
J.Doe

JenkinsfileをGitリポジトリから正常に実行するにはJenkinsfileはメインディレクトリパスで使用できますが、サブディレクトリでは使用できません。例えば:

.
├── .setting
├── project
└── Jenkinsfile

Jenkinsfileはサブディレクトリに配置しないでください。

24
Chandra Sekhar

Jenkinsは、パイプラインスクリプトを探すときに2つのチェックアウトを行います。 gitでは、最初の1つは多くの場合、リポジトリ全体ではなくJenkinsfileのみを取得する軽量のチェックアウトですが、2つの別個のチェックアウトです。 2番目のチェックアウトは、Jenkinsfileを実行する実際のチェックアウトです。

2回のチェックアウトを行う理由は、最初にJenkinsfileを見て、何をしたいのかを確認し、構文などを検証する必要があるためです。スクリプトでSCMチェックアウトをスキップして、後でまたは異なる方法で実行できる場合は、次に、「実際の」チェックアウトを行わないようにする必要があります。その点については、理論的には1つのレポジトリからJenkinsfileをプルし、SCMチェックアウトをスキップし、完全に異なるレポ(またはブランチ、タグ)をプルしてビルドしますが、最初のチェックアウトからJenkinsfileを使用します。

そのため、Jenkinsfileのサブディレクトリを調べるようにJenkinsに指示すると、実際には存在しない元のチェックアウトのどこかを調べるように指示します。これは、Jenkinsfileが実際にgitリポジトリのルートにあるためです。

2番目のチェックアウトがサブディレクトリに行われるとき、Jenkinsfileはワークスペースのルートから実行されるため、Jenkinsfileでこれを考慮する必要があります。ビルドファイルなどを見つけるには、ディレクトリ(dir( "mysubdirectory"){}など)に設定する必要があります。

5
Rob Hales

同じエラーが発生しました。ジョブ構成でLightweight checkoutを無効にすることで、エラーは解決しました!

1
Coco

Sript-pathからサブディレクトリを省略してみてください。

サブディレクトリを指定してプロジェクトのクローンを作成すると、Jenkinsはそのディレクトリ内のパイプラインファイルを検索します。あなたの場合、ジェンキンスは「mysubdirectory/mysubdirectory/Jenkinsfile」でジェンキンスファイルを探しています。

1
Carlos Lucas

これと同様の問題がありましたが、私の場合、名前の不一致はGitのブランチでした。パイプライン設定では、レポではブランチ名が小文字であったときに、ブランチ名を大文字で指定していました。 (明らかに元の問題の解決策ではありませんが、他の貧しい人々には役立つかもしれません!)

0
Mike P

パイプラインジョブをコピーしたときに、同様の問題が発生しました。

解決済み:コピーされたパイプラインジョブからパイプラインscmパーツを削除します。変更内容を保存。空のラウンドを1つ作成します。その後、パイプラインscmブロックを再度作成します。

0
Kimi