Запустите команду Google Cloud Build для каждого результата массива

У меня есть рабочее пространство Nx с несколькими приложениями Angular. Когда мастер обновляется в моем репозитории 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();

Это возвращает массив затронутых приложений, и нуль, если ошибка. Тем не менее, даже несмотря на это, я не уверен, что буду делать для следующего шага в сборке Google Cloud. С результатами либо команды, либо сценария, в идеале, я бы мог выполнить команду сборки Docker, например так:

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

где :loop variable: это имя уязвимого приложения. Я хотел бы сделать это для каждого значения в массиве, и ничего не делать, если по какой-то причине команда не возвращает уязвимых приложений.

Любые идеи о том, как использовать Google Cloud Build с Nx Workspaces, или если вы только что получили опыт сборки Google Cloud и знаете, каким должен быть мой следующий шаг, это было бы здорово.

1 ответ

Продолжить комментарий @chinoche есть пример того, как вы могли бы сохранить список затронутых приложений в файле disabled.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

Следующим шагом может быть чтение файла и вызов любых других команд, например, создание образа докера.

  - 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

Если вы можете получить уязвимые приложения с помощью скрипта узла, я бы предложил вам написать файл с уязвимыми приложениями в пользовательских шагах Cloud Build, этот файл будет записан в каталог "/workspace" и сможет любой другой пользовательский шаг, который может быть выполнен на более поздних шагах, при этом вы сможете запустить команду сборки docker

Другие вопросы по тегам