From da044ebbecb2ff3a02f5935114966c21011ade19 Mon Sep 17 00:00:00 2001 From: Dmitry Sergeev Date: Tue, 28 Nov 2023 01:42:00 +0400 Subject: [PATCH] Change build-opts schema --- README.md | 27 +++++++++++++++------------ js-action/src/index.js | 29 +++++++++++++++++------------ 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 4d022f8..58fb045 100644 --- a/README.md +++ b/README.md @@ -31,13 +31,13 @@ Dockerfile'ы должны находится в одноименных папк tag: ${{ steps.set-tags.outputs.tag }} operation: build-and-push build-opts: | - server: + - name: sever args: - name: GITHUB_USER value: ${{ github.repository_owner }} - name: GITHUB_TOKEN value: ${{ secrets.COMMON_TOKEN }} - nginx: {} + - name: nginx ``` ### Разделение шагов сборки и пуша в registry и копирование файлов из образов @@ -61,14 +61,14 @@ Dockerfile'ы должны находится в одноименных папк tag: ${{ steps.set-tags.outputs.tag }} operation: build build-opts: | - server: + - name: server copy-files: ['/app/junut.xml'] args: - name: GITHUB_USER value: ${{ github.repository_owner }} - name: GITHUB_TOKEN value: ${{ secrets.COMMON_TOKEN }} - nginx-server: {} + - name: nginx-server - name: check copy files run: | @@ -110,7 +110,8 @@ registry, указывать без протокола (например `exampl ### `build-opts` Принимает структуру данных в yaml формате следующего вида: ```yaml -: +- name: + target: t1 args: - name: arg1 value: val2 @@ -120,7 +121,8 @@ registry, указывать без протокола (например `exampl - name: argn value: argn copy-files: ['path/to/file1', 'path/to/file2', ..., 'path/to/filen'] -: +- name: : + target: t1 args: - name: arg1 value: val2 @@ -131,15 +133,16 @@ registry, указывать без протокола (например `exampl value: argn copy-files: ['path/to/file1', 'path/to/file2', ..., 'path/to/filen'] ... -: +- name: ... - ``` +Структура представляет из себя массив, где каждый элемент это образ и дополнительные параметры, которые к нему относятся. -`, , ... ` - образы которые требуется собрать. Каждому образу можно передать аргументы требуемые для сборки и список файлов, которые хотели бы скопировать из образа. Оба этих поля опциональны, если не нужно собирать передавать аргументы и копировать файлы, то просто не указываем эти поля: -```yaml -: {} -``` +* `name` - образ который требуется собрать. + +* `args` (опционально) - список аргументов +* `copy-files` (опционально) - файлы которые требуется скопировать из образа после сборки +* `target` (опционально) - если указано то добавляется `--target target-value` в команду сборки ## Outputs diff --git a/js-action/src/index.js b/js-action/src/index.js index ca13b74..16c49ee 100644 --- a/js-action/src/index.js +++ b/js-action/src/index.js @@ -32,29 +32,34 @@ async function main() { let copyFiles = []; createDir('copy-files'); - for (const image in buildOpts) { + for (const image of buildOpts) { - const imageTag = `${registry}/${repoName}/${image}:${tag}`; + const imageTag = `${registry}/${repoName}/${image.name}:${tag}`; console.log(`Build image: ${imageTag}`); let args = ''; - if (buildOpts[image] && 'args' in buildOpts[image]) { - args = buildOpts[image].args.reduce((a,v) => { + if ('args' in image) { + args = image.args.reduce((a,v) => { return a + ' --build-arg ' + v.name + '=' + "'" + v.value + "'"; }, ''); } + let target = ''; + if ('target' in image) { + target = `--target ${image.target}`; + } + // build image - runCommand(`docker build --file ./docker/${image}/Dockerfile ${args} --tag ${imageTag} .`); + runCommand(`docker build --file ./docker/${image.name}/Dockerfile ${args} --tag ${imageTag} ${target} .`); // Copy files - if (buildOpts[image] && 'copy-files' in buildOpts[image]) { - console.log(`Copy files from ${image} (${imageTag})`); + if ('copy-files' in image) { + console.log(`Copy files from ${image.name} (${imageTag})`); const containerName = `copy-files-${generateRandomString(8)}`; runCommand(`docker run --name ${containerName} -d --entrypoint /bin/sleep ${imageTag} 30`); - for(const file of buildOpts[image]['copy-files']) { + for(const file of image['copy-files']) { const toFile = path.basename(file); runCommand(`docker cp ${containerName}:${file} ./copy-files/${toFile}`); copyFiles.push(`./copy-files/${toFile}`); @@ -73,17 +78,17 @@ async function main() { // Сначала выполняем prePush для временных тегов, это нужно чтобы затем как можно быстрее и параллельно запушить итоговые теги (слои уже будут в registry и это пройдет быстрее). Это полезно для argocd-image-updater и flux image reflector, это повысит вероятность, что новый тег будет обнаружен в образах за один проход let prePushImages = []; - for (const image in buildOpts) { - const imageTag = `${registry}/${repoName}/${image}:${tag}`; + for (const image of buildOpts) { + const imageTag = `${registry}/${repoName}/${image.name}:${tag}`; const prePushTag = `0000001-${generateRandomString(8)}`; - const imagePrePushTag = `${registry}/${repoName}/${image}:${prePushTag}`; + const imagePrePushTag = `${registry}/${repoName}/${image.name}:${prePushTag}`; runCommand(`docker tag ${imageTag} ${imagePrePushTag}`); runCommand(`docker push ${imagePrePushTag}`); images.push(imageTag); prePushImages.push({ registry: `https://${registry}`, - repo: `${repoName}/${image}`, + repo: `${repoName}/${image.name}`, tag: prePushTag, }) }