web-dev-qa-db-ja.com

Jenkins宣言型パイプラインのドッカーハブからプッシュおよびプルする方法

標準の「sh」コマンドを使用して、スレーブ上のjenkinsfileパイプラインからdockerイメージを正常に構築しています。

Docker/Hubからイメージを取得してプルできるようにしたいのですが、失敗した場合(まだ保存されていないため)、ビルドしてDockerハブにプッシュします。

明らかに、ドッカーハブの資格情報を何らかの方法で保存し、Dockerログインコマンドに提供する必要があります。

私の問題は混乱していることです。ドッカーパイプラインプラグインはありますが、それらはドッカーコンテナー内でジェンキンスステップを実行するためのものだと思います-私がやろうとしていることではありません。また、多くの例は、宣言的というよりもスクリプト化されたパイプラインのようです。

簡単な「ステップ」の用語では、次のようなことをしたいと思います

agent {
    label 'pi'
}
steps {
  sh 'docker login -u my-account -p xxxx'
  sh 'docker pull my-account/image:version || (docker build -f dockerfile -t my-account/image:version && docker Push my-account/image:version)'
....
}

しかし、私は多分何かをする必要があると思う

steps {
  script {
    withDockerRegistry([credentialsId: 'something', url: 'docker.io/my-account']) {
      sh 'docker pull my-account/image:version || (docker build -f dockerfile -t my-account/image:version && docker Push my-account/image:version)'
    ....
  }
}

しかし、少しの間違いを除いて、現在正常に動作しているパイプラインをねじ込みたくありません。

私は正しい線に沿っていますか?

10
akc42

Dockerパイプラインプラグイン がある場合、このようなイメージを作成してプッシュできます。

dir(config.buildFolder){
                newImage = docker.build(${imageTag})
                docker.withRegistry("https://${registryAddress}", '${credentialsId}'){
                     newImage.Push("${variables.version}")

            }

次のように、コンテナ内のコードをプルして実行できます。

testbed = docker.image('${imageName}')
testbed.inside("-u root:root"){
                echo 'executing build inside container'
                sh 'dotnet restore'
            }

これにより、コンテナーを作成したフォルダーがコンテナーのルートディレクトリとして自動的にマウントされ、そのデータを操作できるようになります(アプリケーションのビルドなど)

7
herm

私も同じ問題に取り組んでいます。 DockerhubリポジトリからDockerイメージを取得し、それらでいくつかのテストを実行したいと思います。ここに示す手順に従って、パイプラインを機能させることができました。

https://Gist.github.com/jglick/0aa389c053196e38e2a1

0
Swagrid