Skip to content

Commit

Permalink
Change build-opts schema
Browse files Browse the repository at this point in the history
  • Loading branch information
identw committed Nov 27, 2023
1 parent 8978dcd commit 4e365a0
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 21 deletions.
23 changes: 14 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 и копирование файлов из образов
Expand All @@ -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: |
Expand Down Expand Up @@ -110,7 +110,8 @@ registry, указывать без протокола (например `exampl
### `build-opts`
Принимает структуру данных в yaml формате следующего вида:
```yaml
<image1>:
- name: <image1>
target: t1
args:
- name: arg1
value: val2
Expand All @@ -120,7 +121,8 @@ registry, указывать без протокола (например `exampl
- name: argn
value: argn
copy-files: ['path/to/file1', 'path/to/file2', ..., 'path/to/filen']
<image2>:
- name: <image2>:
target: t1
args:
- name: arg1
value: val2
Expand All @@ -131,15 +133,18 @@ registry, указывать без протокола (например `exampl
value: argn
copy-files: ['path/to/file1', 'path/to/file2', ..., 'path/to/filen']
...
<imagen>:
- name: <imagen>
...
```

`<image1>, <image2>, ... <imagen>` - образы которые требуется собрать. Каждому образу можно передать аргументы требуемые для сборки и список файлов, которые хотели бы скопировать из образа. Оба этих поля опциональны, если не нужно собирать передавать аргументы и копировать файлы, то просто не указываем эти поля:
* `name` - образ, который требуется собрать. Каждому образу можно передать аргументы требуемые для сборки и список файлов, которые хотели бы скопировать из образа. Оба этих поля опциональны, если не нужно собирать передавать аргументы и копировать файлы, то просто не указываем эти поля:
```yaml
<image1>: {}
- name: <image1>:
```
* `args` (опционально) - список аргументов
* `copy-files` (опционально) - файлы которые требуется скопировать из образа после сборки
* `target` (опционально) - если указано то добавляется `--target target-value` в команду сборки

## Outputs

Expand Down
29 changes: 17 additions & 12 deletions js-action/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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}`);
Expand All @@ -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,
})
}
Expand Down

0 comments on commit 4e365a0

Please sign in to comment.