web-dev-qa-db-ja.com

Jenkins shスクリプトが特定のコンテナで実行されるとハングする

公式のArgoCD Dockerイメージを使用して展開を自動化しようとしています( https://hub.docker.com/r/argoproj/argocd/dockerfile

エージェントのkubernetesプラグインを使用して宣言的なjenkinsパイプラインを作成し、yamlを使用してポッドを定義しました。コンテナー定義は次のようになります。

_pipeline {
    agent {
        kubernetes {
            yaml """
kind: Pod
metadata:
  name: agent
spec:
  containers:
  - name: maven
    image: maven:slim
    command:
    - cat
    tty: true
    volumeMounts:
      - name: jenkins-maven-cache
        mountPath: /root/.m2/repository
  - name: argocd
    image: argoproj/argocd:latest
    command:
    - cat
    tty: true
    ...
_

そのコンテナー内でコマンドを実行しようとしています。パイプラインのステップは次のようになります。

_stage('Build') {
    steps {
        container('maven') {
            sh 'echo testing' // this works just fine
        }
    }
}
stage('Deploy') {
    steps {
        container('argocd') {
            sh "echo testing" // this does not work
            // more deploy scripts here, once sh works
        }
    }
}
_

だから私は2つのコンテナーを持っています。1つはshスクリプトが適切に機能し、もう1つは機能しません。 「argocd」コンテナ内のshスクリプトが5分間ハングした後、Jenkinsがそれを強制終了すると、終了メッセージは次のようになります。process apparently never started in /home/jenkins/agent/workspace/job-name@tmp/durable-46cefcae (running Jenkins temporarily with -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true might make the problem clearer)

この特定のコンテナで単純な文字列をエコーすることはできません。

DockerのMavenのオフィシャルのような他のコンテナーでも問題なく機能します。私は、スプリングブートアプリケーションの構築に使用しています。 docker execを使用してコマンドラインから手動でargocdコンテナーでコマンドを直接実行することもできますが、jenkinsは何らかの理由でパイプラインに含まれません。どうなり得るか?

耐久性のあるタスクプラグインの最新バージョン(1.33)を実行しています。

Update:argo-cd(連続展開ツール)のイメージargoproj/argocd:latestにはargocd以外のコマンドが含まれていないため、問題はJenkins自体ではなく、使用しようとしたコンテナイメージにありました。私の解決策は、Argo-CD CLIをカスタムDockerコンテナーにインストールし、公式のコンテナーの代わりにそれを使用することでした。

5
Würden

私が作成したカスタムDockerイメージで同様の問題が発生しました。結局、私はUSER nobodyそのイメージのDockerfileで、どういうわけか、この方法でjenkinsエージェントポッドは、パイプラインスクリプトからcatコマンドまたはその他のシェルコマンドを実行できませんでした。 rootユーザーで特定のコンテナーを実行するとうまくいきました。

したがって、あなたのケースでは、以下のようにsecurityContext:runAsUser:0を追加します。

...
  - name: argocd
    image: argoproj/argocd:latest
    command:
    - cat
    tty: true
    securityContext:
      runAsUser: 0
...

Kubernetesリファレンス: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container

1
gkc

問題がジェンキンスに関連している場合、ここで問題の解決に役立つ可能性があるいくつかのことを示します。

  1. working directory の問題。Jenkinsを古いバージョンから更新した場合、workdirは/home/jenkinsでしたが、最近のバージョンでは/home/jenkins/agentであるか、Windowsで実行している場合パスはC:\dirではなく/dirで始まる必要があります
  2. apt-get --purge remove jenkins、次にapt-get install jenkinsを使用して、新しいクリーンインストールを試すことができます
  3. 最新バージョンの永続タスクプラグインを実行しているため、これは当てはまりません。しかし、他の人は1.28-1.30より前のバージョンを参照します 同じ問題が発生したため

Jenkinsがクリーンな場合、別の方法で問題を調査する必要があります。shコマンドに終了コードが返されていないか、スクリプトが別のシェルで実行されているようです。コンテナーの作業ディレクトリに配置されるshファイルを実行しようとします

#!/bin/bash
echo "testing"
echo $?

source my_script.shまたはbash my_script.shで実行してみてください

$?最新のbash操作の終了コードです。これを出力すると、スクリプトが正しく終了することが保証されます。スクリプトを実行する source コマンドを実行すると、スクリプトを呼び出しているのと同じシェルでスクリプトが実行され、シェル変数にアクセスできるようになります。 Bashコマンドは、代わりに別のサブシェルで実行します。

0
David