トラックの各種ツールは、Dockerイメージとしてデプロイされています。
それぞれのツールには、マシンをどのように構築するかを指定するDockerfileが必要です。
Dockerfileはリポジトリのルートディレクトリに置き、名前はDockerfileにしてください。
Dockerfileは、ツールが正しく、すばやく動作するために必要な最小限のイメージを作成するようにしてください。 ベストプラクティスのページには、この目標を達成するためのヒントがたくさんあります。
テストランナーは、解答1つにつき20秒間の間、100%のCPUと3GBのメモリを利用できます。 20秒が経過すると、プロセスは停止され、408エラーコードとともにタイムアウトが報告されます。
タイムアウトの可能性を減らすために、パフォーマンスのベストプラクティスに従うことを強くおすすめします。
ツールの実行では、標準出力と標準エラー出力を合わせて最大1メガバイトまで出力できます。 それを超える出力があると、413エラーコードとともに強制終了されます。
各実行のstdoutとstderrの内容は、ファイルに保存されます。
出力ディレクトリには、デバッグ情報を含むresults.outファイルを書き込むこともできます。
現時点では、メンテナーがこれらのファイルの内容を閲覧することはできません。
結果ファイルは500キロバイト以下でなければなりません(スタックトレースなどを含む)。 ファイルがこれより大きい場合、ツールの実行は460エラーコードとともに強制終了されます。
各解答は、20秒間の間、マシンのリソースを100%利用できます。 20秒が経過すると、プロセスは停止され、タイムアウトとして報告されます。
一部のツールは、デフォルトの設定から(多少の)変更を必要とします。
その場合は、Tooling Invokerリポジトリのtools.jsonファイルで設定します。
ツールはインターネットにアクセスできない状態で実行されます。使用できる設定は2つあります。
none。コンテナ内のネットワークデバイスを無効にします。internal。コンテナ内にネットワークデバイスを追加しますが、そのネットワークは外部の何ものにもアクセスできません。言語によって、設定との相性の良し悪しがあります(例:Rubyはnoneの場合2倍速くなります。Elixirはinternalの場合12x速くなります。
Dockerを実行するときに--networkフラグを使うと、ローカルで試せます。--network noneはデフォルトでサポートされています。
内部ネットワークを使うには、まずdocker network create --internal internalを実行してネットワークを作成し、次にコンテナの実行時に--network internalを指定します。
言語ごとに、ジョブの実行に必要な最大メモリを設定できます。これを可能な限り低く設定すると、より多くのジョブを並行してすばやく実行できます。また、メモリを悪用しようとする人が成功できないようにもなります。言語によって、必要な最大メモリ使用量は大きく異なります。Dockerの実行をベンチマークして最大メモリ使用量を測定することをおすすめします。ご協力に感謝します。
メモリは、バイト、キロバイト、メガバイト、ギガバイトを表すb、k、m、gの接尾辞を付けた数値で指定します。
上記の設定は、次のコマンドでテストできます。
docker container run -v /path/to/job:/mnt/exercism-iteration --network none -m 1GB exercism/ruby-test-runner lasagna /mnt/exercism-iteration/ /mnt/exercism-iteration/
セキュリティ上の脆弱性が持ち込まれるのを避けるため、Dockerfileへのすべての変更には、@exercism/maintainers-adminチームによるPRレビューが必要です。