1

複数のAngularアプリが含まれたNxワークスペースがあります。master が私の GitHub リポジトリで更新されたら、ビルドを開始したいと思います。その部分は、GCB のトリガーで十分に簡単です。しかし、私がやりたいのは、このコマンドを実行することです:

npm run affected:apps

トリガーで、Docker イメージをビルドし、影響を受ける各アプリの Google Container Registry にプッシュします。これまでのところ、私の cloudbuild.yaml ファイルは次のようになっています。

steps:
    - name: 'gcr.io/cloud-builders/git'
        args: ['fetch', '--unshallow']
    - name: node:10.15.1
        entrypoint: npm
        args: ['run affected:apps --base=origin/master --head=HEAD']

このコマンドは、次のような結果を返します。

> project-name@0.0.0 affected:apps /Users/username/projects/project-folder
> nx affected:apps

Note: Nx defaulted to --base=master --head=HEAD
my-app-1

その結果で Google Cloud をどうするかはわかりません。ノード スクリプトを使用すると、次のようにして、影響を受けるアプリの配列を出力できます。

const { exec } = require('child_process');

function getApps() {
    exec('npm run affected:apps', (err, out) => {
        if (err) {
            console.log(null);
        } else {
            const lines = out.split('\n');
            const apps = lines[lines.length - 2].split(' ');
            console.log(JSON.stringify(apps));
        }
    });
}

getApps();

影響を受けるアプリの配列を返し、エラーの場合は null を返します。それでも、Google Cloud ビルドの次のステップで何をするかはわかりません。コマンドまたはそのスクリプトの結果を使用して、理想的には、次のように docker build コマンドを実行できます。

docker build --file ./:loop variable:/Dockerfile

:loop variable:、影響を受けるアプリの名前です。配列内の各値に対してそれを行いたいのですが、何らかの理由でコマンドが影響を受けるアプリを返さない場合は何もしません。

Nx Workspaces で Google Cloud Build を使用する方法についてのアイデア、または Google Cloud ビルドの経験があり、次のステップがどうあるべきかを知っているなら、それは素晴らしいことです。

4

2 に答える 2

1

@chinoche のコメントを続けてください。影響を受けるアプリのリストを related.txt ファイルに保存する方法の例があります。

  - name: 'gcr.io/cloud-builders/npm'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        IFS=' ' read -a apps <<< $(npx nx affected:apps --base=origin/master~1 --plain)
        for app in "${apps[@]}"
        do
          echo $app
        done >> affected.txt

次のステップでは、ファイルを読み取り、他のコマンドを呼び出すことができます。たとえば、docker イメージの作成などです。

  - name: 'gcr.io/cloud-builders/docker'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        while IFS= read -r project; do
          docker build -t gcr.io/$PROJECT_ID/$project -f <path-to>/Dockerfile .
        done < affected.txt

トリックの 1 つは、プロジェクトごとに個別の cloudbuild.yaml ファイルを作成し、影響を受けるプロジェクトごとに新しいクラウド ビルド プロセスをトリガーすることです。これにより、プロジェクトごとに完全に異なるビルド プロセスを使用できます。

  - name: 'gcr.io/cloud-builders/gcloud'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        while IFS= read -r project; do
         gcloud builds submit --config ./<path-to>/$project/project-specific-cloudbuild.yaml .
        done < affected.txt
于 2020-03-25T03:26:33.917 に答える