0

Jenkins を使用して (とりわけ) 一連のテスト ジョブを実行します。テストごとに、必要な Docker イメージとその他のオブジェクトが Nexus リポジトリからダウンロードされます。必要なコンテナーとサービスは、docker-compose と maven を使用してビルドおよび実行されます。これはすべて機能し、テストは必要に応じて実行されます。

テストの後、ワークスペース ファイルとディレクトリをクリーンアップする必要があります。cleanWsこれは、プラグインを使用して可能にする必要があります。ただし、デフォルトでは、これはdeferredWipeoutオプションを使用します。その結果、リポジトリ ディレクトリのコピー全体が、ワークスペースの というディレクトリに置かれたままになります<test-name>-ws-cleanup-<run-ID>。これらは、テスト名に @2、@3 などを追加することにより、時間とともに蓄積されます。論理的に、オプションdeleteDirs: trueとを追加しましたdisableDeferredWipeout: true。これにより、次のようなエラーが生成されます。

hudson.AbortException: Cannot delete workspace: Unable to delete '/data/jenkins/workspace/XXXX-batch@2/XXX-batch-ant-core/target/classes/de/ubs/XXX/batch/ant/core/AbstractLicenseCheck.class'. Tried 3 times (of a maximum of 3) waiting 0.1 sec between attempts.

これが発生するのは、私には完全には明らかではない理由により、作成されたサブディレクトリとファイルの一部に、パーミッションが 755 に設定された "root" 所有者 (つまり、rwxr-xr-x) が含まれているためです。これらは通常、maven ビルドによって作成されたターゲット ディレクトリですが、他にないかどうかはわかりません。関連するファイルは数千あるため、すべてをチェックしていません...まだ. 私はそれをしなければならないことになるかもしれません。

この問題を回避するために、テスト サービスのビルドを定義するクリーンアップ サービス定義がdocker-compose.ymlファイルに追加されました。次のコマンドがテストされました。

command: rm -rf * && rm -rf /opt/test/*

これにより、rm コマンドの無効なオプション「c」に関するあいまいなエラー メッセージが表示されました。(??) それ以外の場合は効果がありません。他のスタックオーバーフローの質問を確認した後、これを試しました:

command: sh -c "rm -rf * && rm -rf /opt/test/*"

これによりエラーは発生しませんが、望ましい効果もありません。利回り--verboseでオプションを使用する:docker-compose run

2021-03-09 08:29:26 compose.cli.verbose_proxy.proxy_callable: docker inspect_container -> {'AppArmorProfile': '',
2021-03-09 08:29:26  'Args': ['rm', '-rf', '*', '&&', 'rm', '-rf', '/opt/test/*'],
2021-03-09 08:29:26  'Config': {'AttachStderr': True,
2021-03-09 08:29:26             'AttachStdin': True,
2021-03-09 08:29:26             'AttachStdout': True,
2021-03-09 08:29:26             'Cmd': ['rm', '-rf', '*', '&&', 'rm', '-rf', '/opt/test/*'],
2021-03-09 08:29:26             'Domainname': '',
2021-03-09 08:29:26             'Entrypoint': ['/usr/local/bin/mvn-entrypoint.sh'],
2021-03-09 08:29:26             'Env': ['TZ=Europe/Berlin',
2021-03-09 08:29:26                     'CONTAINERED=true',
2021-03-09 08:29:26 ...

これは、率直に言って、コマンドが何らかの形で認識されたことを示しています。

別のアプローチは、ファイルとディレクトリのパーミッションを 777 に変更することでした。

command: echo "<password>" | su -c "chmod -R 777 ."

これはコンソールで実行すると機能しますが、 docker-compose.ymlまたは Jenkins で使用されるパイプライン groovy スクリプトで使用すると効果がありません。

他に何ができるかわからないので、ヒントをいただければ幸いです。必要に応じて詳細をお知らせします。

4

1 に答える 1