mirror of
https://github.com/balena-io/balena-cli.git
synced 2024-12-18 21:27:51 +00:00
Add --gitignore (-g) option to push/build/deploy commands for v11 compatibility
Change-type: minor
This commit is contained in:
parent
a3cab32b4e
commit
146de39b83
@ -1867,12 +1867,20 @@ this file will be used instead.
|
||||
DOCKERIGNORE AND GITIGNORE FILES
|
||||
The balena CLI will use a '.dockerignore' file (if any) at the source directory
|
||||
in order to decide which source files to exclude from the "build context" sent
|
||||
to balenaCloud, Docker or balenaEngine. Previous balena CLI releases (before
|
||||
v12.0.0) also took '.gitignore' files into account, but this is no longer the
|
||||
case. This allows files to be used for an image build even if they are listed
|
||||
in '.gitignore'.
|
||||
to balenaCloud, Docker or balenaEngine. In a microservices / multicontainer
|
||||
application, the source directory is usually where the 'docker-compose.yml'
|
||||
file is located, and therefore the '.dockerignore' file should be located
|
||||
alongside the 'docker-compose.yml' file. Matching patterns may be prefixed with
|
||||
the service's directory name (relative to the source directory) in order to
|
||||
apply to that service only (e.g. 'service1/node_modules').
|
||||
|
||||
A few "hardcoded" dockerignore patterns are also used and "merged" (in memory)
|
||||
Previous balena CLI releases (before v12.0.0) also took '.gitignore' files
|
||||
into account. This behavior is deprecated, but may still be enabled with the
|
||||
--gitignore (-g) option if compatibility is required. This option will be
|
||||
removed in the CLI's next major version release (v13).
|
||||
|
||||
When --gitignore (-g) is NOT provided (i.e. when not in v11 compatibility mode),
|
||||
a few "hardcoded" dockerignore patterns are also used and "merged" (in memory)
|
||||
with the patterns found in the '.dockerignore' file (if any), in the following
|
||||
order:
|
||||
|
||||
@ -1978,7 +1986,13 @@ Don't convert line endings from CRLF (Windows format) to LF (Unix format).
|
||||
|
||||
#### --nogitignore, -G
|
||||
|
||||
No-op and deprecated since balena CLI v12.0.0. See "balena help push".
|
||||
No-op (default behavior) since balena CLI v12.0.0. See "balena help push".
|
||||
|
||||
#### --gitignore, -g
|
||||
|
||||
Consider .gitignore files in addition to the .dockerignore file. This reverts
|
||||
to the CLI v11 behavior/implementation (deprecated) if compatibility is required
|
||||
until your project can be adapted.
|
||||
|
||||
# Settings
|
||||
|
||||
@ -2067,12 +2081,20 @@ this file will be used instead.
|
||||
DOCKERIGNORE AND GITIGNORE FILES
|
||||
The balena CLI will use a '.dockerignore' file (if any) at the source directory
|
||||
in order to decide which source files to exclude from the "build context" sent
|
||||
to balenaCloud, Docker or balenaEngine. Previous balena CLI releases (before
|
||||
v12.0.0) also took '.gitignore' files into account, but this is no longer the
|
||||
case. This allows files to be used for an image build even if they are listed
|
||||
in '.gitignore'.
|
||||
to balenaCloud, Docker or balenaEngine. In a microservices / multicontainer
|
||||
application, the source directory is usually where the 'docker-compose.yml'
|
||||
file is located, and therefore the '.dockerignore' file should be located
|
||||
alongside the 'docker-compose.yml' file. Matching patterns may be prefixed with
|
||||
the service's directory name (relative to the source directory) in order to
|
||||
apply to that service only (e.g. 'service1/node_modules').
|
||||
|
||||
A few "hardcoded" dockerignore patterns are also used and "merged" (in memory)
|
||||
Previous balena CLI releases (before v12.0.0) also took '.gitignore' files
|
||||
into account. This behavior is deprecated, but may still be enabled with the
|
||||
--gitignore (-g) option if compatibility is required. This option will be
|
||||
removed in the CLI's next major version release (v13).
|
||||
|
||||
When --gitignore (-g) is NOT provided (i.e. when not in v11 compatibility mode),
|
||||
a few "hardcoded" dockerignore patterns are also used and "merged" (in memory)
|
||||
with the patterns found in the '.dockerignore' file (if any), in the following
|
||||
order:
|
||||
|
||||
@ -2134,9 +2156,15 @@ No-op and deprecated since balena CLI v12.0.0. Build logs are now shown by defau
|
||||
|
||||
Hide the image build log output (produce less verbose output)
|
||||
|
||||
#### --gitignore, -g
|
||||
|
||||
Consider .gitignore files in addition to the .dockerignore file. This reverts
|
||||
to the CLI v11 behavior/implementation (deprecated) if compatibility is required
|
||||
until your project can be adapted.
|
||||
|
||||
#### --nogitignore, -G
|
||||
|
||||
No-op and deprecated since balena CLI v12.0.0. See "balena help undefined".
|
||||
No-op (default behavior) since balena CLI v12.0.0. See "balena help build".
|
||||
|
||||
#### --noparent-check
|
||||
|
||||
@ -2247,12 +2275,20 @@ this file will be used instead.
|
||||
DOCKERIGNORE AND GITIGNORE FILES
|
||||
The balena CLI will use a '.dockerignore' file (if any) at the source directory
|
||||
in order to decide which source files to exclude from the "build context" sent
|
||||
to balenaCloud, Docker or balenaEngine. Previous balena CLI releases (before
|
||||
v12.0.0) also took '.gitignore' files into account, but this is no longer the
|
||||
case. This allows files to be used for an image build even if they are listed
|
||||
in '.gitignore'.
|
||||
to balenaCloud, Docker or balenaEngine. In a microservices / multicontainer
|
||||
application, the source directory is usually where the 'docker-compose.yml'
|
||||
file is located, and therefore the '.dockerignore' file should be located
|
||||
alongside the 'docker-compose.yml' file. Matching patterns may be prefixed with
|
||||
the service's directory name (relative to the source directory) in order to
|
||||
apply to that service only (e.g. 'service1/node_modules').
|
||||
|
||||
A few "hardcoded" dockerignore patterns are also used and "merged" (in memory)
|
||||
Previous balena CLI releases (before v12.0.0) also took '.gitignore' files
|
||||
into account. This behavior is deprecated, but may still be enabled with the
|
||||
--gitignore (-g) option if compatibility is required. This option will be
|
||||
removed in the CLI's next major version release (v13).
|
||||
|
||||
When --gitignore (-g) is NOT provided (i.e. when not in v11 compatibility mode),
|
||||
a few "hardcoded" dockerignore patterns are also used and "merged" (in memory)
|
||||
with the patterns found in the '.dockerignore' file (if any), in the following
|
||||
order:
|
||||
|
||||
@ -2310,9 +2346,15 @@ No-op and deprecated since balena CLI v12.0.0. Build logs are now shown by defau
|
||||
|
||||
Hide the image build log output (produce less verbose output)
|
||||
|
||||
#### --gitignore, -g
|
||||
|
||||
Consider .gitignore files in addition to the .dockerignore file. This reverts
|
||||
to the CLI v11 behavior/implementation (deprecated) if compatibility is required
|
||||
until your project can be adapted.
|
||||
|
||||
#### --nogitignore, -G
|
||||
|
||||
No-op and deprecated since balena CLI v12.0.0. See "balena help undefined".
|
||||
No-op (default behavior) since balena CLI v12.0.0. See "balena help build".
|
||||
|
||||
#### --noparent-check
|
||||
|
||||
|
@ -110,6 +110,7 @@ export const push: CommandDefinition<
|
||||
nocache?: boolean;
|
||||
'noparent-check'?: boolean;
|
||||
'registry-secrets'?: string;
|
||||
gitignore?: boolean;
|
||||
nogitignore?: boolean;
|
||||
nolive?: boolean;
|
||||
detached?: boolean;
|
||||
@ -279,13 +280,17 @@ export const push: CommandDefinition<
|
||||
{
|
||||
signature: 'nogitignore',
|
||||
alias: 'G',
|
||||
description: isV12()
|
||||
? 'No-op and deprecated since balena CLI v12.0.0. See "balena help push".'
|
||||
: stripIndent`
|
||||
Disregard all .gitignore files, and consider only the .dockerignore file (if any)
|
||||
at the source directory. This will be the default behavior in an upcoming major
|
||||
version release. For more information, see 'balena help push'.
|
||||
`,
|
||||
description:
|
||||
'No-op (default behavior) since balena CLI v12.0.0. See "balena help push".',
|
||||
boolean: true,
|
||||
},
|
||||
{
|
||||
signature: 'gitignore',
|
||||
alias: 'g',
|
||||
description: stripIndent`
|
||||
Consider .gitignore files in addition to the .dockerignore file. This reverts
|
||||
to the CLI v11 behavior/implementation (deprecated) if compatibility is required
|
||||
until your project can be adapted.`,
|
||||
boolean: true,
|
||||
},
|
||||
],
|
||||
@ -319,7 +324,7 @@ export const push: CommandDefinition<
|
||||
},
|
||||
);
|
||||
|
||||
const nogitignore = !!options.nogitignore || isV12();
|
||||
const nogitignore = !options.gitignore;
|
||||
const convertEol = isV12()
|
||||
? !options['noconvert-eol']
|
||||
: !!options['convert-eol'];
|
||||
|
@ -33,7 +33,6 @@ export const appendProjectOptions = (opts) =>
|
||||
]);
|
||||
|
||||
export function appendOptions(opts) {
|
||||
const Logger = require('./logger');
|
||||
const { isV12 } = require('./version');
|
||||
return appendProjectOptions(opts).concat([
|
||||
{
|
||||
@ -65,15 +64,18 @@ export function appendOptions(opts) {
|
||||
},
|
||||
]
|
||||
: []),
|
||||
{
|
||||
signature: 'gitignore',
|
||||
alias: 'g',
|
||||
description: stripIndent`
|
||||
Consider .gitignore files in addition to the .dockerignore file. This reverts
|
||||
to the CLI v11 behavior/implementation (deprecated) if compatibility is required
|
||||
until your project can be adapted.`,
|
||||
boolean: true,
|
||||
},
|
||||
{
|
||||
signature: 'nogitignore',
|
||||
description: isV12()
|
||||
? `No-op and deprecated since balena CLI v12.0.0. See "balena help ${Logger.command}".`
|
||||
: stripIndent`
|
||||
Disregard all .gitignore files, and consider only the .dockerignore file (if any)
|
||||
at the source directory. This will be the default behavior in an upcoming major
|
||||
version release. For more information, see 'balena help ${Logger.command}'.
|
||||
`,
|
||||
description: `No-op (default behavior) since balena CLI v12.0.0. See "balena help build".`,
|
||||
boolean: true,
|
||||
alias: 'G',
|
||||
},
|
||||
@ -125,7 +127,7 @@ export function generateOpts(options) {
|
||||
inlineLogs: !options.nologs && (!!options.logs || isV12()),
|
||||
convertEol: isV12() ? !options['noconvert-eol'] : !!options['convert-eol'],
|
||||
dockerfilePath: options.dockerfile,
|
||||
nogitignore: !!options.nogitignore || isV12(),
|
||||
nogitignore: !options.gitignore,
|
||||
noParentCheck: options['noparent-check'],
|
||||
}));
|
||||
}
|
||||
@ -192,6 +194,9 @@ export function tarDirectory(dir, param) {
|
||||
}
|
||||
|
||||
/**
|
||||
* This is the CLI v10 / v11 "original" tarDirectory function. It is still
|
||||
* around for the benefit of the `--gitignore` option, but is expected to be
|
||||
* deleted in CLI v13.
|
||||
* @param {string} dir Source directory
|
||||
* @param {import('./compose-types').TarDirectoryOptions} param
|
||||
* @returns {Promise<import('stream').Readable>}
|
||||
|
@ -214,7 +214,7 @@ export async function tarDirectory(
|
||||
|
||||
/**
|
||||
* Print a deprecation warning if any '.gitignore' or '.dockerignore' file is
|
||||
* found and the --nogitignore (-G) option has not been provided.
|
||||
* found and the --gitignore (-g) option has been provided.
|
||||
* @param dockerignoreFile Absolute path to a .dockerignore file
|
||||
* @param gitignoreFiles Array of absolute paths to .gitginore files
|
||||
*/
|
||||
@ -232,21 +232,19 @@ export function printGitignoreWarn(
|
||||
msg.push(...ignoreFiles);
|
||||
if (gitignoreFiles.length) {
|
||||
msg.push(stripIndent`
|
||||
balena CLI currently uses gitgnore and dockerignore files, but an upcoming major
|
||||
version release will disregard gitignore files and use a dockerignore file only.
|
||||
Use the --nogitignore (-G) option to enable the new behavior already now and
|
||||
suppress this warning. For more information, see 'balena help ${Logger.command}'.
|
||||
Note: .gitignore files are being considered because the --gitignore option was
|
||||
used. This option is deprecated and will be removed in the next major version
|
||||
release. For more information, see 'balena help ${Logger.command}'.
|
||||
`);
|
||||
msg.push(hr);
|
||||
Logger.getLogger().logWarn(msg.join('\n'));
|
||||
} else if (dockerignoreFile && process.platform === 'win32') {
|
||||
msg.push(stripIndent`
|
||||
Use the --nogitignore (-G) option to suppress this warning and enable the use
|
||||
of a better dockerignore parser and filter library that fixes several issues
|
||||
on Windows and improves compatibility with "docker build", but which may also
|
||||
cause a different set of files to be filtered out (because of the bug fixes).
|
||||
The --nogitignore option will be the default behavior in an upcoming balena CLI
|
||||
major version release. For more information, see 'balena help ${Logger.command}'.
|
||||
The --gitignore option was used, but not .gitignore files were found.
|
||||
The --gitignore option is deprecated and will be removed in the next major
|
||||
version release. It prevents the use of a better dockerignore parser and
|
||||
filter library that fixes several issues on Windows and improves compatibility
|
||||
with "docker build". For more information, see 'balena help ${Logger.command}'.
|
||||
`);
|
||||
msg.push(hr);
|
||||
Logger.getLogger().logWarn(msg.join('\n'));
|
||||
|
@ -37,6 +37,11 @@ interface IgnoreEntry {
|
||||
filePath: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* This class is used by the CLI v10 / v11 "original" tarDirectory function
|
||||
* in `compose.js`. It is still around for the benefit of the `--gitignore`
|
||||
* option, but is expected to be deleted in CLI v13.
|
||||
*/
|
||||
export class FileIgnorer {
|
||||
private dockerIgnoreEntries: IgnoreEntry[];
|
||||
private gitIgnoreEntries: IgnoreEntry[];
|
||||
|
@ -15,8 +15,6 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { isV12 } from './version';
|
||||
|
||||
const DEBUG_MODE = !!process.env.DEBUG;
|
||||
|
||||
export const reachingOut = `\
|
||||
@ -69,27 +67,26 @@ If the --registry-secrets option is not specified, and a secrets.yml or
|
||||
secrets.json file exists in the balena directory (usually $HOME/.balena),
|
||||
this file will be used instead.`;
|
||||
|
||||
const dockerignoreHelpV11 = `\
|
||||
export const dockerignoreHelp = `\
|
||||
DOCKERIGNORE AND GITIGNORE FILES
|
||||
By default, both '.dockerignore' and '.gitignore' files are taken into account
|
||||
in order to prevent files from being sent to the balenaCloud builder or Docker
|
||||
or balenaEngine (balenaOS device).
|
||||
The balena CLI will use a '.dockerignore' file (if any) at the source directory
|
||||
in order to decide which source files to exclude from the "build context" sent
|
||||
to balenaCloud, Docker or balenaEngine. In a microservices / multicontainer
|
||||
application, the source directory is usually where the 'docker-compose.yml'
|
||||
file is located, and therefore the '.dockerignore' file should be located
|
||||
alongside the 'docker-compose.yml' file. Matching patterns may be prefixed with
|
||||
the service's directory name (relative to the source directory) in order to
|
||||
apply to that service only (e.g. 'service1/node_modules').
|
||||
|
||||
However, this behavior has been DEPRECATED and will change in an upcoming major
|
||||
version release. The --nogitignore (-G) option should be used to enable the new
|
||||
behavior already now. This option will cause the CLI to:
|
||||
Previous balena CLI releases (before v12.0.0) also took '.gitignore' files
|
||||
into account. This behavior is deprecated, but may still be enabled with the
|
||||
--gitignore (-g) option if compatibility is required. This option will be
|
||||
removed in the CLI's next major version release (v13).
|
||||
|
||||
* Disregard all '.gitignore' files at the source directory and subdirectories,
|
||||
and consider only the '.dockerignore' file (if any) at the source directory.
|
||||
* Consequently, allow files to be sent to balenaCloud / Docker / balenaEngine
|
||||
even if they are listed in '.gitignore' files (a longstanding feature request).
|
||||
* Use a new '.dockerignore' parser and filter library that improves compatibility
|
||||
with "docker build" and fixes several issues (mainly on Windows).
|
||||
* Prevent a warning message from being printed.
|
||||
|
||||
When --nogitignore (-G) is provided, a few "hardcoded" dockerignore patterns are
|
||||
also used and "merged" (in memory) with the patterns found in the '.dockerignore'
|
||||
file (if any), in the following order:
|
||||
When --gitignore (-g) is NOT provided (i.e. when not in v11 compatibility mode),
|
||||
a few "hardcoded" dockerignore patterns are also used and "merged" (in memory)
|
||||
with the patterns found in the '.dockerignore' file (if any), in the following
|
||||
order:
|
||||
|
||||
**/.git
|
||||
< user's patterns from the '.dockerignore' file, if any >
|
||||
@ -104,21 +101,3 @@ If necessary, the effect of the '**/.git' pattern may be modified by adding
|
||||
For documentation on pattern format, see:
|
||||
- https://docs.docker.com/engine/reference/builder/#dockerignore-file
|
||||
- https://www.npmjs.com/package/@balena/dockerignore`;
|
||||
|
||||
const dockerignoreHelpV12 =
|
||||
`DOCKERIGNORE AND GITIGNORE FILES
|
||||
The balena CLI will use a '.dockerignore' file (if any) at the source directory
|
||||
in order to decide which source files to exclude from the "build context" sent
|
||||
to balenaCloud, Docker or balenaEngine. Previous balena CLI releases (before
|
||||
v12.0.0) also took '.gitignore' files into account, but this is no longer the
|
||||
case. This allows files to be used for an image build even if they are listed
|
||||
in '.gitignore'.
|
||||
|
||||
A few "hardcoded" dockerignore patterns are also used and "merged" (in memory)
|
||||
with the patterns found in the '.dockerignore' file (if any), in the following
|
||||
order:
|
||||
` + dockerignoreHelpV11.substring(dockerignoreHelpV11.indexOf('\n **/.git'));
|
||||
|
||||
export const dockerignoreHelp = isV12()
|
||||
? dockerignoreHelpV12
|
||||
: dockerignoreHelpV11;
|
||||
|
6
npm-shrinkwrap.json
generated
6
npm-shrinkwrap.json
generated
@ -4448,6 +4448,12 @@
|
||||
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
|
||||
"dev": true
|
||||
},
|
||||
"deep-object-diff": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.0.tgz",
|
||||
"integrity": "sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw==",
|
||||
"dev": true
|
||||
},
|
||||
"default-compare": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
|
||||
|
@ -153,6 +153,7 @@
|
||||
"chai": "^4.2.0",
|
||||
"chai-as-promised": "^7.1.1",
|
||||
"cross-env": "^7.0.2",
|
||||
"deep-object-diff": "^1.1.0",
|
||||
"ent": "^2.2.0",
|
||||
"filehound": "^1.17.4",
|
||||
"fs-extra": "^8.0.1",
|
||||
|
@ -126,7 +126,7 @@ describe('balena build', function () {
|
||||
}
|
||||
docker.expectGetInfo({});
|
||||
await testDockerBuildStream({
|
||||
commandLine: `build ${projectPath} --deviceType nuc --arch amd64 -G`,
|
||||
commandLine: `build ${projectPath} --deviceType nuc --arch amd64 -g`,
|
||||
dockerMock: docker,
|
||||
expectedFilesByService: { main: expectedFiles },
|
||||
expectedQueryParamsByService: { main: commonQueryParams },
|
||||
@ -138,6 +138,8 @@ describe('balena build', function () {
|
||||
});
|
||||
});
|
||||
|
||||
// Skip Standalone because we patch the source code with `mock-require` to avoid
|
||||
// downloading and installing QEMU
|
||||
itSS('should create the expected tar stream (--emulated)', async () => {
|
||||
const projectPath = path.join(projectsPath, 'no-docker-compose', 'basic');
|
||||
const isV12W = isWindows && isV12();
|
||||
|
@ -78,8 +78,6 @@ const commonQueryParams = [
|
||||
['headless', 'false'],
|
||||
];
|
||||
|
||||
const itSkipWindows = process.platform === 'win32' ? it.skip : it;
|
||||
|
||||
describe('balena push', function () {
|
||||
let api: BalenaAPIMock;
|
||||
let builder: BuilderMock;
|
||||
@ -173,7 +171,7 @@ describe('balena push', function () {
|
||||
|
||||
await testPushBuildStream({
|
||||
builderMock: builder,
|
||||
commandLine: `push testApp -s ${projectPath} -R ${regSecretsPath} --dockerfile Dockerfile-alt --noconvert-eol --nogitignore`,
|
||||
commandLine: `push testApp -s ${projectPath} -R ${regSecretsPath} --dockerfile Dockerfile-alt --noconvert-eol`,
|
||||
expectedFiles,
|
||||
expectedQueryParams,
|
||||
expectedResponseLines: commonResponseLines[responseFilename],
|
||||
@ -231,72 +229,71 @@ describe('balena push', function () {
|
||||
});
|
||||
});
|
||||
|
||||
// Skip Windows because the old tarDirectory() implementation (still used when
|
||||
// '--nogitignore' is not provided) uses the old `zeit/dockerignore` npm package
|
||||
// that is broken on Windows (reason why we created `@balena/dockerignore`).
|
||||
itSkipWindows(
|
||||
'should create the expected tar stream (single container, with gitignore)',
|
||||
async () => {
|
||||
const projectPath = path.join(
|
||||
projectsPath,
|
||||
'no-docker-compose',
|
||||
'dockerignore1',
|
||||
);
|
||||
const expectedFiles: ExpectedTarStreamFiles = {
|
||||
'.balena/balena.yml': { fileSize: 12, type: 'file' },
|
||||
'.dockerignore': { fileSize: 438, type: 'file' },
|
||||
'.gitignore': { fileSize: 20, type: 'file' },
|
||||
'.git/foo.txt': { fileSize: 4, type: 'file' },
|
||||
'c.txt': { fileSize: 1, type: 'file' },
|
||||
Dockerfile: { fileSize: 13, type: 'file' },
|
||||
'src/.balena/balena.yml': { fileSize: 16, type: 'file' },
|
||||
'src/.gitignore': { fileSize: 10, type: 'file' },
|
||||
'vendor/.git/vendor-git-contents': { fileSize: 20, type: 'file' },
|
||||
...(isV12()
|
||||
? {
|
||||
'a.txt': { fileSize: 1, type: 'file' },
|
||||
'src/src-a.txt': { fileSize: 5, type: 'file' },
|
||||
'src/src-c.txt': { fileSize: 5, type: 'file' },
|
||||
}
|
||||
: {
|
||||
'.git/bar.txt': { fileSize: 4, type: 'file' },
|
||||
}),
|
||||
};
|
||||
it('should create the expected tar stream (single container, --gitignore)', async () => {
|
||||
const projectPath = path.join(
|
||||
projectsPath,
|
||||
'no-docker-compose',
|
||||
'dockerignore1',
|
||||
);
|
||||
const expectedFiles: ExpectedTarStreamFiles = {
|
||||
'.balena/balena.yml': { fileSize: 12, type: 'file' },
|
||||
'.dockerignore': { fileSize: 438, type: 'file' },
|
||||
'.gitignore': { fileSize: 20, type: 'file' },
|
||||
'.git/bar.txt': { fileSize: 4, type: 'file' },
|
||||
'.git/foo.txt': { fileSize: 4, type: 'file' },
|
||||
'c.txt': { fileSize: 1, type: 'file' },
|
||||
Dockerfile: { fileSize: 13, type: 'file' },
|
||||
'src/.balena/balena.yml': { fileSize: 16, type: 'file' },
|
||||
'src/.gitignore': { fileSize: 10, type: 'file' },
|
||||
'vendor/.git/vendor-git-contents': { fileSize: 20, type: 'file' },
|
||||
// When --gitignore (-g) is provided for v11 compatibility, the old
|
||||
// `zeit/dockerignore` npm package is still used but it is broken on
|
||||
// Windows (reason why we created `@balena/dockerignore`).
|
||||
...(isWindows
|
||||
? {
|
||||
'src/src-b.txt': { fileSize: 5, type: 'file' },
|
||||
'dot.git/bar.txt': { fileSize: 4, type: 'file' },
|
||||
'dot.git/foo.txt': { fileSize: 4, type: 'file' },
|
||||
'vendor/dot.git/vendor-git-contents': {
|
||||
fileSize: 20,
|
||||
type: 'file',
|
||||
},
|
||||
}
|
||||
: {}),
|
||||
};
|
||||
|
||||
const regSecretsPath = await addRegSecretsEntries(expectedFiles);
|
||||
const responseFilename = 'build-POST-v3.json';
|
||||
const responseBody = await fs.readFile(
|
||||
path.join(builderResponsePath, responseFilename),
|
||||
'utf8',
|
||||
);
|
||||
const expectedResponseLines = [
|
||||
...(!isV12()
|
||||
? [
|
||||
'[Warn] Using file ignore patterns from:',
|
||||
`[Warn] ${path.join(projectPath, '.dockerignore')}`,
|
||||
`[Warn] ${path.join(projectPath, '.gitignore')}`,
|
||||
`[Warn] ${path.join(projectPath, 'src', '.gitignore')}`,
|
||||
'[Warn] balena CLI currently uses gitgnore and dockerignore files, but an upcoming major',
|
||||
'[Warn] version release will disregard gitignore files and use a dockerignore file only.',
|
||||
'[Warn] Use the --nogitignore (-G) option to enable the new behavior already now and',
|
||||
"[Warn] suppress this warning. For more information, see 'balena help push'.",
|
||||
]
|
||||
: []),
|
||||
...commonResponseLines[responseFilename],
|
||||
];
|
||||
const regSecretsPath = await addRegSecretsEntries(expectedFiles);
|
||||
const responseFilename = 'build-POST-v3.json';
|
||||
const responseBody = await fs.readFile(
|
||||
path.join(builderResponsePath, responseFilename),
|
||||
'utf8',
|
||||
);
|
||||
const expectedResponseLines = [
|
||||
...(isV12()
|
||||
? [
|
||||
'[Warn] Using file ignore patterns from:',
|
||||
`[Warn] ${path.join(projectPath, '.dockerignore')}`,
|
||||
`[Warn] ${path.join(projectPath, '.gitignore')}`,
|
||||
`[Warn] ${path.join(projectPath, 'src', '.gitignore')}`,
|
||||
'[Warn] Note: .gitignore files are being considered because the --gitignore option was',
|
||||
'[Warn] used. This option is deprecated and will be removed in the next major version',
|
||||
"[Warn] release. For more information, see 'balena help push'.",
|
||||
]
|
||||
: []),
|
||||
...commonResponseLines[responseFilename],
|
||||
];
|
||||
|
||||
await testPushBuildStream({
|
||||
builderMock: builder,
|
||||
commandLine: `push testApp -s ${projectPath} -R ${regSecretsPath} -l`,
|
||||
expectedFiles,
|
||||
expectedQueryParams: commonQueryParams,
|
||||
expectedResponseLines,
|
||||
projectPath,
|
||||
responseBody,
|
||||
responseCode: 200,
|
||||
});
|
||||
},
|
||||
);
|
||||
await testPushBuildStream({
|
||||
builderMock: builder,
|
||||
commandLine: `push testApp -s ${projectPath} -R ${regSecretsPath} -l -g`,
|
||||
expectedFiles,
|
||||
expectedQueryParams: commonQueryParams,
|
||||
expectedResponseLines,
|
||||
projectPath,
|
||||
responseBody,
|
||||
responseCode: 200,
|
||||
});
|
||||
});
|
||||
|
||||
it('should create the expected tar stream (single container, --nogitignore)', async () => {
|
||||
const projectPath = path.join(
|
||||
@ -341,7 +338,7 @@ describe('balena push', function () {
|
||||
// (with a mismatched fileSize 13 vs 5 for 'symlink-a.txt'), ensure that the
|
||||
// `core.symlinks` property is set to `true` in the `.git/config` file. Ref:
|
||||
// https://git-scm.com/docs/git-config#Documentation/git-config.txt-coresymlinks
|
||||
it('should create the expected tar stream (single container, symbolic links, --nogitignore)', async () => {
|
||||
it('should create the expected tar stream (single container, symbolic links, --gitignore)', async () => {
|
||||
const projectPath = path.join(
|
||||
projectsPath,
|
||||
'no-docker-compose',
|
||||
@ -353,6 +350,7 @@ describe('balena push', function () {
|
||||
Dockerfile: { fileSize: 13, type: 'file' },
|
||||
'src/src-b.txt': { fileSize: 5, type: 'file' },
|
||||
'symlink-a.txt': { fileSize: 5, type: 'file' },
|
||||
...(isWindows ? { 'src/src-a.txt': { fileSize: 5, type: 'file' } } : {}),
|
||||
};
|
||||
const regSecretsPath = await addRegSecretsEntries(expectedFiles);
|
||||
const responseFilename = 'build-POST-v3.json';
|
||||
@ -363,7 +361,7 @@ describe('balena push', function () {
|
||||
|
||||
await testPushBuildStream({
|
||||
builderMock: builder,
|
||||
commandLine: `push testApp -s ${projectPath} -R ${regSecretsPath} -l -G`,
|
||||
commandLine: `push testApp -s ${projectPath} -R ${regSecretsPath} -l --gitignore`,
|
||||
expectedFiles,
|
||||
expectedQueryParams: commonQueryParams,
|
||||
expectedResponseLines: commonResponseLines[responseFilename],
|
||||
@ -385,36 +383,30 @@ describe('balena push', function () {
|
||||
Dockerfile: { fileSize: 13, type: 'file' },
|
||||
'src/src-b.txt': { fileSize: 5, type: 'file' },
|
||||
'symlink-a.txt': { fileSize: 5, type: 'file' },
|
||||
...(isWindows ? { 'src/src-a.txt': { fileSize: 5, type: 'file' } } : {}),
|
||||
};
|
||||
const noV12W = isWindows && !isV12();
|
||||
if (noV12W) {
|
||||
// this test uses the old tarDirectory implementation, which uses
|
||||
// the zeit/dockerignore library that has bugs on Windows
|
||||
expectedFiles['src/src-a.txt'] = { fileSize: 5, type: 'file' };
|
||||
}
|
||||
const regSecretsPath = await addRegSecretsEntries(expectedFiles);
|
||||
const responseFilename = 'build-POST-v3.json';
|
||||
const responseBody = await fs.readFile(
|
||||
path.join(builderResponsePath, responseFilename),
|
||||
'utf8',
|
||||
);
|
||||
const expectedResponseLines = noV12W
|
||||
const expectedResponseLines = isWindows
|
||||
? [
|
||||
'[Warn] Using file ignore patterns from:',
|
||||
`[Warn] ${path.join(projectPath, '.dockerignore')}`,
|
||||
'[Warn] Use the --nogitignore (-G) option to suppress this warning and enable the use',
|
||||
'[Warn] of a better dockerignore parser and filter library that fixes several issues',
|
||||
'[Warn] on Windows and improves compatibility with "docker build", but which may also',
|
||||
'[Warn] cause a different set of files to be filtered out (because of the bug fixes).',
|
||||
'[Warn] The --nogitignore option will be the default behavior in an upcoming balena CLI',
|
||||
"[Warn] major version release. For more information, see 'balena help push'.",
|
||||
'[Warn] The --gitignore option was used, but not .gitignore files were found.',
|
||||
'[Warn] The --gitignore option is deprecated and will be removed in the next major',
|
||||
'[Warn] version release. It prevents the use of a better dockerignore parser and',
|
||||
'[Warn] filter library that fixes several issues on Windows and improves compatibility',
|
||||
'[Warn] with "docker build". For more information, see \'balena help push\'.',
|
||||
...commonResponseLines[responseFilename],
|
||||
]
|
||||
: commonResponseLines[responseFilename];
|
||||
|
||||
await testPushBuildStream({
|
||||
builderMock: builder,
|
||||
commandLine: `push testApp -s ${projectPath} -R ${regSecretsPath} -l`,
|
||||
commandLine: `push testApp -s ${projectPath} -R ${regSecretsPath} -l -g`,
|
||||
expectedFiles,
|
||||
expectedQueryParams: commonQueryParams,
|
||||
expectedResponseLines,
|
||||
@ -460,7 +452,7 @@ describe('balena push', function () {
|
||||
|
||||
await testPushBuildStream({
|
||||
builderMock: builder,
|
||||
commandLine: `push testApp -s ${projectPath} -R ${regSecretsPath} -l -G`,
|
||||
commandLine: `push testApp -s ${projectPath} -R ${regSecretsPath} -l`,
|
||||
expectedFiles,
|
||||
expectedQueryParams: commonQueryParams,
|
||||
expectedResponseLines,
|
||||
@ -484,7 +476,7 @@ describe('balena push: project validation', function () {
|
||||
];
|
||||
|
||||
const { out, err } = await runCommand(
|
||||
`push testApp --source ${projectPath} --nogitignore`,
|
||||
`push testApp --source ${projectPath} --gitignore`,
|
||||
);
|
||||
expect(cleanOutput(err, true)).to.include.members(expectedErrorLines);
|
||||
expect(out).to.be.empty;
|
||||
|
@ -88,9 +88,17 @@ export async function inspectTarStream(
|
||||
sourceTarStream.pipe(extract);
|
||||
});
|
||||
|
||||
expect(found).to.deep.equal(
|
||||
_.mapValues(expectedFiles, (v) => _.omit(v, 'testStream', 'contents')),
|
||||
const $expected = _.mapValues(expectedFiles, (v) =>
|
||||
_.omit(v, 'testStream', 'contents'),
|
||||
);
|
||||
try {
|
||||
expect($expected).to.deep.equal(found);
|
||||
} catch (e) {
|
||||
const { diff } = require('deep-object-diff');
|
||||
const diffStr = JSON.stringify(diff($expected, found), null, 4);
|
||||
console.error(`\nexpected vs. found diff:\n${diffStr}\n`);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
/** Check that a tar stream entry matches the project contents in the filesystem */
|
||||
|
@ -113,7 +113,7 @@ describe('compare new and old tarDirectory implementations', function () {
|
||||
});
|
||||
|
||||
// Skip Windows because the old tarDirectory() implementation (still used when
|
||||
// '--nogitignore' is not provided) uses the old `zeit/dockerignore` npm package
|
||||
// '--gitignore' is provided) uses the old `zeit/dockerignore` npm package
|
||||
// that is broken on Windows (reason why we created `@balena/dockerignore`).
|
||||
itSkipWindows('should produce a compatible tar stream', async function () {
|
||||
const dockerignoreProjDir = path.join(
|
||||
|
Loading…
Reference in New Issue
Block a user