Запустите команду 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