web-dev-qa-db-ja.com

ジェンキンスはスレーブではなくマスターでビルドをビルドします

私はAndroid Jenkinsを介したOSビルド自動化に取り組んでおり、リポジトリは大規模であり、ビルド自体にはかなりの時間がかかります。したがって、多くのスレーブで実行する必要がありますビルドに使用できるパワーとスレッドが増え、他の開発者が使用できないポイントまでマスターのディスク領域がいっぱいになりません。

最初のビルドを生成してマスターにデプロイしたときに、構成を確認し、Jenkinsのベストプラクティスを確認しました。

https://wiki.jenkins.io/display/JENKINS/Jenkins+Best+Practices

一部のユーザーにジョブの設定のみを許可し、Jenkinsの管理は許可しない、より複雑なセキュリティ設定がある場合は、マスターノードでビルドを実行できないようにする必要があります。そうでない場合、JENKINS_HOMEディレクトリへの無制限のアクセス権があります。 これを行うには、エグゼキュータカウントをゼロに設定します。代わりに、すべてのジョブがスレーブで実行されることを確認してください。これにより、jenkinsマスターがより多くのジョブをサポートするようにスケーリングでき、$ JENKINS_HOMEの機密データが誤って/悪意を持って変更されることからビルドを保護します。マスターで実行するジョブ(Jenkins自体のバックアップなど)が必要な場合は、ジョブ制限プラグインを使用して、そこで実行できるジョブを制限します。

私はマスター上で2つのエグゼキューターが利用可能であることに気づきました。マスター上に構築したくない場合は、ベストプラクティスに従ってこれをゼロに設定する必要があります。これをゼロに設定して、ビルドを再試行しました。

Master Server Executors

驚いたことに、それはまだマスターの上に構築されています。以下は、暗黙的に私のスレーブ上に構築するように言う私のJenkinsファイルです。

pipeline {
    agent {label 'van-droid'}

    stages {
        stage('Build') {
            steps {
        echo 'Building..'
        sh 'make clean'
        sh 'export USE_CCACHE=1'
        sh 'export CCACHE_DIR=/nvme/.ccache'
        sh './FFTools/make.sh'
             }
        }
    }
}

誰が何が起こっているのか知っていますか?

2
Husk Rekoms

OK、スレーブにビルドを強制できる唯一の方法は、Node/Labelプラグインをインストールし、リクエストした特定のスレーブでのみプロジェクトをビルドできることを示すパラメーターを追加することでした。一部の開発者は実際にマスターを使用して特定のプロジェクトをビルドしており、エグゼキューターをゼロにするとビルドが保留されていたため、これはより良い方法のようです。

1
Husk Rekoms

また、あなたは試すことができます

agent {label '!master'}

これにより、マスターノードでのジョブの実行が回避されます(マスターノードに割り当てたラベルでマスターを変更します)。

「驚いたことに、それはまだ主人の上に構築されています。」

すべてのパイプラインビルドは、マスターで "Flyweight" executors として実行されます。パイプラインビルドは、実際にデキューされるとすぐに開始されます。

Both Actual executions on the master and Flyweight Executors

表示の微妙な違いに注意してください。

ここに示す例では、マスターには番号が付けられた4つのエグゼキューターがあり、2つのジョブが実際にマスターで実行されています。他の2つ(わかりやすくするために黄色で強調表示)は「フライウェイト」です。OneOffExecutorsとも呼ばれ、他の場所にディスパッチされるまでしばらく表示されますが、実際にはジョブの実行中に実行されます。次のようなクエリを使用して、マスターで実行されているものをOneOffとして確認できます。

https://YOUR.JENKINS.URL/computer/(master)/ api/python?pretty = true&tree = oneOffExecutors [currentExecutable [fullDisplayName、result、id、url]]&depth = 1

pythonレンダリングを使用する必要はありませんが、XMLよりも読みやすいです。

Flyweightまたは「OneOffExecutors」は、マスターがパイプラインジョブを追跡および調整する方法です。上記の共有リンクでそれらの詳細を読むことができます。