1

我有一个包含多个 Angular 应用程序的 Nx 工作区。当 master 在我的 GitHub 存储库中更新时,我希望开始构建。使用 GCB 的触发器,这部分很容易。但我想要发生的是运行这个命令:

npm run affected:apps

在触发器上,并为每个受影响的应用构建 Docker 映像并将其推送到 Google Container 注册表。到目前为止,我的 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:受影响的应用程序的名称在哪里。我想对数组中的每个值执行此操作,如果由于某种原因该命令未返回任何受影响的应用程序,则不执行任何操作。

关于如何将 Google Cloud Build 与 Nx Workspaces 结合使用的任何想法,或者如果您刚刚获得了 Google Cloud 构建经验并且知道我的下一步应该是什么,那就太好了。

4

2 回答 2

1

继续@chinoche 评论有一个示例,说明如何将受影响的应用程序列表保存到受影响的.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

其中一个技巧可能是为每个项目创建单独的 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 回答
0

如果您能够使用节点脚本获取受影响的应用程序,我建议您在 Cloud Build自定义步骤中使用受影响的应用程序编写一个文件,该文件将被写入“/workspace”目录,并且能够可能在后续步骤中执行的任何其他自定义步骤,您应该能够运行 docker build 命令

于 2019-08-20T23:51:33.927 回答