Skip to content

Commit fd21d77

Browse files
Stepan IvankovStepan Ivankov
authored andcommitted
feat(deploy_kube_feature): skip_e2e deploy
1 parent 5c4169b commit fd21d77

9 files changed

Lines changed: 179 additions & 46 deletions

File tree

.changeset/docker-package-extraction.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ dev-зависимостей) у них общий.
2121
Попутно починен `archive-build`: он падал с `TypeError: Cannot read properties of undefined
2222
(reading 'c')`, потому что в `tar@7` нет default-экспорта, а код использовал `import tar from 'tar'`.
2323

24+
Команды `arui-scripts docker-build`, `docker-build:compiled` и `archive-build` теперь запускают CLI
25+
`@alfalab/arui-scripts-artifacts` с конфигом, который arui-scripts возит с собой. Благодаря этому
26+
`arui-scripts-artifacts.ts` в корне проекта работает и через команды arui-scripts: он находится по
27+
обычным правилам и кладется поверх настроек из конфига arui-scripts. Заводить его по-прежнему не
28+
обязательно.
29+
2430
Настройки сборки артефактов в конфиге arui-scripts (`dockerRegistry`, `baseDockerImage`,
2531
`nginxRootPath`, `nginx`, `runFromNonRootUser`, `removeDevDependenciesDuringDockerBuild`,
2632
`archiveName`, `additionalBuildPath`) и оверрайды `Dockerfile`, `DockerfileCompiled`, `nginx`,

packages/arui-scripts-artifacts/src/cli/__tests__/config-file.test.ts

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { getAvailableCommands, resolveCommandOptions } from '../config-file';
1+
import { getAvailableCommands, mergeConfigFiles, resolveCommandOptions } from '../config-file';
22

33
describe('resolveCommandOptions', () => {
44
it('should return null for an unknown command', () => {
@@ -117,6 +117,55 @@ describe('resolveCommandOptions', () => {
117117
});
118118
});
119119

120+
describe('mergeConfigFiles', () => {
121+
it('should merge sections by field, not replace them', () => {
122+
const merged = mergeConfigFiles(
123+
{ docker: { registry: 'registry.example', baseImage: 'base:1.0.0' } },
124+
{ docker: { baseImage: 'base:2.0.0' } },
125+
);
126+
127+
expect(merged).toEqual({
128+
docker: { registry: 'registry.example', baseImage: 'base:2.0.0' },
129+
});
130+
});
131+
132+
it('should merge commands by name and keep the ones declared only once', () => {
133+
const merged = mergeConfigFiles(
134+
{
135+
commands: {
136+
'archive-build': { build: { removeDevDependencies: true } },
137+
'docker-build': { serverPort: 3000 },
138+
},
139+
},
140+
{
141+
commands: {
142+
'archive-build': { archive: { name: 'app.tar' } },
143+
'docker-build:server': { artifact: 'docker' },
144+
},
145+
},
146+
);
147+
148+
expect(merged.commands).toEqual({
149+
'archive-build': {
150+
build: { removeDevDependencies: true },
151+
archive: { name: 'app.tar' },
152+
},
153+
'docker-build': { serverPort: 3000 },
154+
'docker-build:server': { artifact: 'docker' },
155+
});
156+
});
157+
158+
it('should not add an empty commands section', () => {
159+
expect(mergeConfigFiles({ serverPort: 3000 }, {})).not.toHaveProperty('commands');
160+
});
161+
162+
it('should let the last config win for scalar options', () => {
163+
expect(mergeConfigFiles({ serverPort: 3000 }, { serverPort: 4000 })).toEqual({
164+
serverPort: 4000,
165+
});
166+
});
167+
});
168+
120169
describe('getAvailableCommands', () => {
121170
it('should list built-in and declared commands without duplicates', () => {
122171
const commands = getAvailableCommands({

packages/arui-scripts-artifacts/src/cli/config-file.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,36 @@ function mergeOptions(base: ArtifactsOptions, patch: ArtifactsOptions): Artifact
9898
return result;
9999
}
100100

101+
/**
102+
* Сливает несколько конфигов в один: каждый следующий переопределяет предыдущие по тем же правилам,
103+
* что и команда переопределяет верхний уровень — секции по полям, `commands` по имени команды.
104+
*
105+
* Нужно тем, кто отдает CLI собственный конфиг (`-c`) и хочет доложить поверх пользовательский —
106+
* так делает arui-scripts, чтобы `arui-scripts-artifacts.ts` в корне проекта продолжал работать.
107+
*/
108+
export function mergeConfigFiles(...configFiles: ArtifactsConfigFile[]): ArtifactsConfigFile {
109+
return configFiles.reduce<ArtifactsConfigFile>((base, patch) => {
110+
const { commands: baseCommands, ...baseShared } = base;
111+
const { commands: patchCommands, ...patchShared } = patch;
112+
113+
const merged: ArtifactsConfigFile = mergeOptions(baseShared, patchShared);
114+
const commandNames = [
115+
...new Set([...Object.keys(baseCommands ?? {}), ...Object.keys(patchCommands ?? {})]),
116+
];
117+
118+
if (commandNames.length) {
119+
merged.commands = Object.fromEntries(
120+
commandNames.map((name) => [
121+
name,
122+
mergeOptions(baseCommands?.[name] ?? {}, patchCommands?.[name] ?? {}),
123+
]),
124+
);
125+
}
126+
127+
return merged;
128+
}, {});
129+
}
130+
101131
/** Список команд, доступных с данным конфигом: встроенные плюс объявленные в проекте. */
102132
export function getAvailableCommands(configFile: ArtifactsConfigFile = {}): string[] {
103133
return Array.from(

packages/arui-scripts-artifacts/src/cli/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export {
88
BUILT_IN_COMMANDS,
99
defineConfig,
1010
getAvailableCommands,
11+
mergeConfigFiles,
1112
resolveCommandOptions,
1213
type ArtifactsConfigFile,
1314
type ArtifactsConfigFileExport,
Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,5 @@
1-
import { buildArchive } from '@alfalab/arui-scripts-artifacts';
2-
3-
import { getArtifactsOptions } from '../util/artifacts-options';
1+
import { runArtifactsCli } from '../util/run-artifacts-cli';
42

53
(async () => {
6-
try {
7-
await buildArchive(
8-
getArtifactsOptions({
9-
// archive-build исторически всегда удаляет dev-зависимости, независимо от
10-
// removeDevDependenciesDuringDockerBuild
11-
build: { removeDevDependencies: true },
12-
}),
13-
);
14-
} catch {
15-
// buildArchive уже напечатал ошибку (и стек, если включен debug)
16-
process.exit(1);
17-
}
4+
await runArtifactsCli('archive-build');
185
})();
Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,5 @@
1-
import { buildDockerImage } from '@alfalab/arui-scripts-artifacts';
2-
3-
import { getArtifactsOptions } from '../util/artifacts-options';
1+
import { runArtifactsCli } from '../util/run-artifacts-cli';
42

53
(async () => {
6-
try {
7-
await buildDockerImage({
8-
...getArtifactsOptions({
9-
docker: { variant: 'compiled', addNodeModulesToDockerIgnore: true },
10-
localFiles: { allowDockerfile: false, allowStartScript: false },
11-
}),
12-
argv: process.argv.slice(3),
13-
});
14-
} catch {
15-
// buildDockerImage уже напечатал ошибку (и стек, если включен debug)
16-
process.exit(1);
17-
}
4+
await runArtifactsCli('docker-build:compiled');
185
})();
Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,5 @@
1-
import { buildDockerImage } from '@alfalab/arui-scripts-artifacts';
2-
3-
import { getArtifactsOptions } from '../util/artifacts-options';
1+
import { runArtifactsCli } from '../util/run-artifacts-cli';
42

53
(async () => {
6-
try {
7-
await buildDockerImage({
8-
...getArtifactsOptions({
9-
docker: { variant: 'runtime', addNodeModulesToDockerIgnore: false },
10-
localFiles: { allowDockerfile: true, allowStartScript: true },
11-
}),
12-
argv: process.argv.slice(3),
13-
});
14-
} catch {
15-
// buildDockerImage уже напечатал ошибку (и стек, если включен debug)
16-
process.exit(1);
17-
}
4+
await runArtifactsCli('docker-build');
185
})();
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { defineConfig, mergeConfigFiles, resolveConfigFile } from '@alfalab/arui-scripts-artifacts';
2+
3+
import { configs } from '../../configs/app-configs';
4+
5+
import { getArtifactsOptions } from './artifacts-options';
6+
7+
/**
8+
* Конфиг сборки артефактов, который arui-scripts возит с собой.
9+
*
10+
* Команды `docker-build`, `docker-build:compiled` и `archive-build` не зовут либу напрямую, а
11+
* запускают ее CLI с этим файлом в `-c` — тот же прием, что и `rsbuild build -c ...`. Поэтому
12+
* заводить свой `arui-scripts-artifacts.ts` в корне проекта не обязательно: без него настройки
13+
* берутся из конфига arui-scripts.
14+
*
15+
* Если такой файл в проекте есть, он подхватывается по стандартным правилам либы и кладется
16+
* поверх — именно туда deprecated-настройки arui-scripts и просят перенести.
17+
*
18+
* Экспортируется функция, а не объект: `configs` читает package.json и файлы проекта, и делать это
19+
* нужно в момент запуска команды, а не при загрузке модуля.
20+
*/
21+
export default defineConfig(async () => {
22+
const aruiScriptsConfig = {
23+
...getArtifactsOptions(),
24+
25+
commands: {
26+
'archive-build': {
27+
// archive-build исторически всегда удаляет dev-зависимости, независимо от
28+
// removeDevDependenciesDuringDockerBuild
29+
build: { removeDevDependencies: true },
30+
},
31+
},
32+
};
33+
34+
return mergeConfigFiles(aruiScriptsConfig, await resolveConfigFile(configs.cwd));
35+
});
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import path from 'path';
2+
3+
import { exec, shellQuote } from '@alfalab/arui-scripts-artifacts';
4+
5+
/**
6+
* Конфиг едет вместе с arui-scripts — см. `artifacts-config.ts`. `require.resolve` дает абсолютный
7+
* путь до собранного файла и не выполняет его: конфиг исполнит уже CLI, в процессе сборки.
8+
*/
9+
const ARTIFACTS_CONFIG_PATH = require.resolve('./artifacts-config');
10+
11+
/**
12+
* Абсолютный путь до бинарника CLI @alfalab/arui-scripts-artifacts.
13+
*
14+
* Резолвим через package.json пакета, а не полагаемся на `node_modules/.bin` в PATH: команды
15+
* arui-scripts запускают не только из yarn-скриптов.
16+
*/
17+
function getArtifactsCliPath(): string {
18+
const packageJsonPath = require.resolve('@alfalab/arui-scripts-artifacts/package.json');
19+
// eslint-disable-next-line global-require, import/no-dynamic-require, @typescript-eslint/no-var-requires
20+
const { bin } = require(packageJsonPath);
21+
22+
return path.join(
23+
path.dirname(packageJsonPath),
24+
typeof bin === 'string' ? bin : bin['arui-scripts-artifacts'],
25+
);
26+
}
27+
28+
/**
29+
* Запускает команду CLI @alfalab/arui-scripts-artifacts с конфигом arui-scripts.
30+
*
31+
* Позиционные аргументы (`name=...`, `version=...`, `registry=...`) прокидываются как есть — их
32+
* разбирает сам CLI.
33+
*/
34+
export async function runArtifactsCli(command: string): Promise<void> {
35+
const args = process.argv.slice(3);
36+
const cliCommand = [
37+
shellQuote(process.execPath),
38+
shellQuote(getArtifactsCliPath()),
39+
command,
40+
'-c',
41+
shellQuote(ARTIFACTS_CONFIG_PATH),
42+
...args,
43+
].join(' ');
44+
45+
try {
46+
await exec(cliCommand);
47+
} catch {
48+
// CLI уже напечатал ошибку (и стек, если включен debug)
49+
process.exit(1);
50+
}
51+
}

0 commit comments

Comments
 (0)