はじめに
FIELDNOTES には正しい来館者テストがありますが、ローカル公開スクリプトはテスト失敗後も続行したり、別のパッケージを公開したりする可能性があります。判定を実際の配信につなげることが今回の課題です。
この新しい環境には、前の実習で完成した来館者テストと未変更の公開サイトが用意されています。短い Bash パイプラインを修正し、不正な入力を拒否し、正常な入力を公開して、その後の草稿編集が保存済みパッケージを変えないことを確認します。Workstation、Live Website、Candidate Preview は準備済みです。これはローカル学習用パイプラインで、GitHub Actions や本番のセキュリティ境界ではありません。
失敗したら公開を止める
このステップでは、一つの候補引数をテストと公開の両方へ渡します。Live Website から始め、展示、Plan your visit、来館案内のダウンロードを開きます。現在の入口は East gate です。FIELDNOTES でホームに戻ります。
Workstation に切り替えます。cat で提供されたパイプラインを表示します。
cat pipeline.sh
初期スクリプトはテストを実行した後、固定の packages/candidate.tar.gz を公開しようとします。独立したコマンド行は、前のコマンドが失敗しても続行します。公開ツール自体も未テストのパッケージを拒否しますが、パイプラインにも失敗を返させ、両段階へ意図した入力を渡す必要があります。
Bash の $1 は最初の引数です。candidate="$1" はそれを変数に保存します。"$candidate" は、パスに空白があっても値を一つの引数として展開します。&& は前のコマンドの終了状態がゼロの場合だけ次を実行します。ゼロは成功、非ゼロは失敗です。この短いスクリプトの結果は、最後に実行したコマンドで決まります。
最初の実習のヒアドキュメントでスクリプト全体を置き換えます。最後の BASH がそのままのテキストブロックを終えます。
cat > pipeline.sh <<'BASH'
#!/bin/bash
candidate="$1"
python3 tools.py check "$candidate" &&
python3 tools.py publish "$candidate"
BASH
#!/bin/bash はインタープリターを指定します。ここでは bash を明示して実行するので、実行権限の変更は不要です。両コマンドには同じパッケージ引数が渡ります。|| true を加えたり、テストを削除したり、引数を固定の正常パッケージに置き換えたりしないでください。
不具合のある候補を試します。この失敗は意図的です。
bash pipeline.sh packages/wrong.tar.gz
FAIL: Wrong visitor guide content が出て、Published 行は出ないはずです。すぐに状態を調べます。$? は直前のコマンドの終了状態で、echo はそれを表示します。パイプラインの直後に、別のコマンドとして実行します。
echo $?
1 が表示されます。間に別のコマンドを挟むと状態が置き換わります。Live Website を再読み込みし、来館案内とダウンロードをたどります。正常な基準サイトは使えるままです。公開を拒否した際もサービスは動き続ける必要があります。
Bash の構文エラーが出たら、保存したファイルを読み直して上の内容に戻します。壊れたスクリプトは有効な公開判定の証拠ではありません。次のステップでは正常な入力も受け入れることを確認します。
テストしたパッケージを公開する
このステップでは正常な候補を公開し、保存されたパッケージのバイト列と編集可能な作業コピーを区別します。Workstation から始めます。
提供された packages/candidate.tar.gz は環境準備時に drafts/ から作られました。パイプラインはその保存済みパッケージを使い、後の草稿内容から再構築してはいけません。
まず候補を明示的に確認します。
python3 tools.py check packages/candidate.tar.gz
成功メッセージと凍結したパッケージの識別子が出ます。次に、パッケージ作成後の通常の開発編集を再現します。> はこの草稿テキストファイルだけを置き換え、echo は引用符内を表示します。
echo 'UNREVIEWED DRAFT: use the West gate' > drafts/downloads/guide.txt
草稿が本当に変わったことを確認します。
cat drafts/downloads/guide.txt
UNREVIEWED DRAFT: use the West gate と表示されます。意図的な草稿だけの編集です。保存済みパッケージを編集、再構築しないでください。
修正済みパイプラインを保存された候補に対して実行します。
bash pipeline.sh packages/candidate.tar.gz
PASS: visitor checks. Frozen package ... に続き、同じ識別子の Published frozen package ... が出ます。実行ツールは凍結コピーをテストし、その正確なバイト列を公開します。成功したチェックのないバイト列は拒否します。識別子は補助証拠であり、実際のサイト確認の代わりにはなりません。
Live Website に切り替え、FIELDNOTES でホームへ戻って再読み込みします。Explore the exhibition、Plan your visit、Download visitor guide を開きます。未確認の草稿編集があっても、ページとダウンロードはどちらも East gate です。Step-free route と Download access guide も開き、Garden ramp が維持されていることを確認します。イラストとページのスタイルも正常である必要があります。
Workstation に戻ります。curl は HTTP 要求を送り、-sS は進捗を隠して接続エラーを表示します。127.0.0.1 はこの実習環境、8081 は公開サーバーのポートです。自分のコンピューターの端末ではなく、Workstation で実行します。
curl -sS http://127.0.0.1:8081/downloads/guide.txt
本文は FIELDNOTES Visitor Guide で始まり、Entrance: East gate を含みます。公開サイトは変更済み草稿ではなく保存済みパッケージを使っています。草稿の文面が出たら公開している入力を調べ、未変更の提供候補に修正済みパイプラインを再実行します。
最後に再び拒否を確認します。
bash pipeline.sh packages/missing.tar.gz
意図した 404 の失敗となり、公開されません。Live Website を再読み込みして来館案内を再ダウンロードします。受け入れた候補は使えるままです。これで両方の判定を確認できました。この実習は静的サイトのローカル公開経路を保護します。アクセス制御、署名、ホスト型 CI、データベース移行の取り消しは実装しません。
まとめ
条件付き実行で不正な公開を止め、一つのパッケージを両段階へ渡し、後の草稿編集に影響されずにテスト済みの内容をそのまま公開しました。一般来館者と段差のない経路の両方が利用できます。


