GitLab Advanced CI/CD - ハンズオンラボ: ビルドパイプラインの最適化
このラボの目的は、GitLab CI/CD パイプラインにおけるキャッシングのメリットを実証することです。キャッシュとは、ジョブがダウンロードして保存する 1 つ以上のファイルのことです。同じキャッシュを使用する後続のジョブは、ファイルを再ダウンロードする必要がないため、より迅速に実行されます。キャッシュはアーティファクトとは異なり、GitLab には保存されません。
完了までの推定時間: 15 分
目標
このラボの目標:
- キャッシングのメリットを示す
タスク A. 基本的なパイプラインを作成する
まず、パイプラインビルドのデモに使用する基本的な Node.js アプリケーションを作成します。
ILT グループ(“My Test Group - XXXXXXXX” という名前で、X がユーザー名に置き換えられます)に移動してください。
New project を選択してください。
Create blank project を選択してください。
プロジェクト名を Node に設定し、その他のオプションはすべてデフォルトのまま Create project を選択してください。
このプロジェクトで、+ > New file を選択してください。
ファイル名を
index.jsに設定し、次のコードを追加してください:module.exports.binarySearch = function binarySearch(arr, val) { let start = 0; let end = arr.length - 1; while (start <= end) { let mid = Math.floor((start + end) / 2); if (arr[mid] === val) { return mid; } if (val < arr[mid]) { end = mid - 1; } else { start = mid + 1; } } return -1; } module.exports.linearSearch = function linearSearch(arr, val){ let index = 0; let found = false; while (!found && index < arr.length){ if (arr[index] == val){ found = true; }else{ index += 1; } } if (!found){ index = -1; } return index; }このコードは単純な二分探索で、ソートされた配列の中から値を検索し、値が配列に存在する場合はそのインデックスを、見つからない場合は -1 を返します。
Commit changes を選択し、適切なコミットメッセージを追加して Commit changes を選択してください。
Node プロジェクトを作成するには、
package.jsonファイルも作成する必要があります。プロジェクトリポジトリに移動してください。
+ > New file を選択してください。
ファイル名を
package.jsonに設定し、次のテキストを追加してください:{ "name": "ci-cd-demos", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" }Commit changes を選択し、適切なコミットメッセージを追加して Commit changes を選択してください。
タスク B. テストを作成する
キャッシングの概念を実証するために、アプリケーションにテストを追加してみましょう。まず、二分探索のテストを作成します。
コードリポジトリに移動してください。
+ > New file を選択してください。
ファイル名を
binarysearch.test.jsに設定し、次のコードを追加してください:const {binarySearch} = require("./index.js"); describe("Binary search tests", () => { test("Search should succeed on first element", () => { expect(binarySearch([1,2,3,4],1)).toBe(0); }); test("Search should succeed on last element", () => { expect(binarySearch([1,2,3,4],4)).toBe(3); }); test("Search should succeed on any element", () => { expect(binarySearch([1,2,3,4],2)).toBe(1); }); test("Search should return -1 on not found", () => { expect(binarySearch([1,2,3,4],10)).toBe(-1); }); });Commit changes を選択し、適切なコミットメッセージを追加して Commit changes を選択してください。
線形探索についても同様のテストセットを作成します。
linearsearch.test.jsという名前の新しいファイルを作成し、次のコードを追加してください:const {linearSearch} = require("./index.js"); describe("Linear search tests", () => { test("Search should succeed on first element", () => { expect(linearSearch([1,2,3,4],1)).toBe(0); }); test("Search should succeed on last element", () => { expect(linearSearch([1,2,3,4],4)).toBe(3); }); test("Search should succeed on any element", () => { expect(linearSearch([1,2,3,4],2)).toBe(1); }); test("Search should return -1 on not found", () => { expect(linearSearch([1,2,3,4],10)).toBe(-1); }); });linearsearch.test.jsファイルをコミットしてください。次に、テストを定義する
.gitlab-ci.ymlファイルを作成します。プロジェクトリポジトリに移動してください。
+ > New file を選択してください。
ファイル名に
.gitlab-ci.ymlと入力してください。ファイルに次のジョブ定義を追加してください:
stages: - test default: image: node:latest test binarysearch: stage: test script: - npm install jest - node_modules/.bin/jest binarysearch.test.js test linearsearch: stage: test script: - npm install jest - node_modules/.bin/jest linearsearch.test.jsCommit changes を選択し、適切なコミットメッセージを追加して Commit changes を選択してください。
タスク C. キャッシングを使用してジョブを最適化する
このジョブ定義のセットを確認して、より効率的にできるかどうかを見てみましょう。よくある最適化の一つは、ジョブ実行中のスクリプトの繰り返しを探すことです。この例では、両方のジョブで npm を使って jest-junit パッケージをインストールする必要があります。jest-junit を 2 回インストールする代わりに、ジョブ間でパッケージをキャッシュできます。
.gitlab-ci.ymlファイルに、次のジョブを追加してください:install deps: stage: deps script: - npm install jest cache: key: $CI_COMMIT_REF_SLUG paths: - node_modules次に、テストスクリプトが実行される前に依存関係がキャッシュされるよう、test ステージの前に ‘deps’ ステージを追加してください:
stages: - deps - test.gitlab-ci.ymlファイルは次のようになります:stages: - deps - test default: image: node:latest install deps: stage: deps script: - npm install jest cache: key: $CI_COMMIT_REF_SLUG paths: - node_modules test binarysearch: stage: test script: - npm install jest - node_modules/.bin/jest binarysearch.test.js test linearsearch: stage: test script: - npm install jest - node_modules/.bin/jest linearsearch.test.jsこの定義では、
CI_COMMIT_REF_SLUGに一致するキーを持つキャッシュを作成します。これにより、各ジョブが一意のキャッシュを受け取ることが保証されます。キャッシュされるデータはnode_modulesフォルダーです。キャッシュを使用するためにセットアップするには、テストの実行に使用するjestパッケージのインストールコマンドをスクリプトで実行します。キャッシュが定義されたので、各ジョブから
jestパッケージのインストールを削除できます。ジョブから
npm install jestコマンドを削除し、キャッシュ参照に置き換えてください。以下は完成した.gitlab-ci.ymlファイルの例です:stages: - deps - test default: image: node:latest install deps: stage: deps script: - npm install jest cache: key: $CI_COMMIT_REF_SLUG paths: - node_modules test binarysearch: stage: test script: - node_modules/.bin/jest binarysearch.test.js cache: key: $CI_COMMIT_REF_SLUG paths: - node_modules test linearsearch: stage: test script: - node_modules/.bin/jest linearsearch.test.js cache: key: $CI_COMMIT_REF_SLUG paths: - node_modules変更を
mainにコミットしてください。パイプラインに移動して、テストジョブが正常に実行されることを確認してください。
ラボガイドの完了
このラボ演習が完了しました。このコースの他のラボガイドを参照できます。
ご提案は?
ラボへの変更をご希望の場合は、マージリクエストで変更内容を送信してください。
