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 スクリプトで使用すると効果がありません。
他に何ができるかわからないので、ヒントをいただければ幸いです。必要に応じて詳細をお知らせします。