2024-09-12 05:29:23 -06:00
import { codeBlock } from 'common-tags' ;
2022-06-05 23:47:17 -06:00
import { Fixtures } from '../../../../test/fixtures' ;
2022-07-07 01:42:31 -06:00
import type { PackageDependency } from '../types' ;
2022-06-20 09:05:39 -06:00
import { extractVariables , getDep } from './extract' ;
import { extractPackageFile } from '.' ;
2017-11-06 03:36:06 -07:00
2022-06-05 23:47:17 -06:00
const d1 = Fixtures . get ( '1.Dockerfile' ) ;
const d2 = Fixtures . get ( '2.Dockerfile' ) ;
const d3 = Fixtures . get ( '3.Dockerfile' ) ;
const d4 = Fixtures . get ( '4.Dockerfile' ) ;
2021-01-19 01:37:23 -07:00
2022-03-03 02:35:26 -07:00
describe ( 'modules/manager/dockerfile/extract' , ( ) = > {
2018-11-04 10:51:23 -07:00
describe ( 'extractPackageFile()' , ( ) = > {
2018-05-09 00:03:59 -06:00
it ( 'handles no FROM' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( 'no from!' , '' , { } ) ;
2019-04-02 08:59:27 -06:00
expect ( res ) . toBeNull ( ) ;
2018-05-09 00:03:59 -06:00
} ) ;
2021-10-22 02:02:56 -06:00
2017-11-06 03:36:06 -07:00
it ( 'handles naked dep' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( 'FROM node\n' , '' , { } ) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'node' ,
depType : 'final' ,
replaceString : 'node' ,
} ,
] ) ;
2017-11-06 03:36:06 -07:00
} ) ;
2021-10-22 02:02:56 -06:00
2018-01-18 22:59:35 -07:00
it ( 'is case insensitive' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( 'From node\n' , '' , { } ) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'node' ,
depType : 'final' ,
replaceString : 'node' ,
} ,
] ) ;
2018-01-18 22:59:35 -07:00
} ) ;
2021-10-22 02:02:56 -06:00
2017-11-06 03:36:06 -07:00
it ( 'handles tag' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( 'FROM node:8.9.0-alpine\n' , '' , { } ) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '8.9.0-alpine' ,
datasource : 'docker' ,
depName : 'node' ,
depType : 'final' ,
replaceString : 'node:8.9.0-alpine' ,
} ,
] ) ;
2017-11-06 03:36:06 -07:00
} ) ;
2021-10-22 02:02:56 -06:00
2017-11-06 03:36:06 -07:00
it ( 'handles digest' , ( ) = > {
2018-11-04 10:51:23 -07:00
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'FROM node@sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest :
'sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063' ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'node' ,
depType : 'final' ,
replaceString :
'node@sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063' ,
} ,
] ) ;
2017-11-06 03:36:06 -07:00
} ) ;
2021-10-22 02:02:56 -06:00
2017-11-06 03:36:06 -07:00
it ( 'handles tag and digest' , ( ) = > {
2018-11-04 10:51:23 -07:00
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'FROM node:8.9.0@sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest :
'sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063' ,
currentValue : '8.9.0' ,
datasource : 'docker' ,
depName : 'node' ,
depType : 'final' ,
replaceString :
'node:8.9.0@sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063' ,
} ,
] ) ;
2017-11-06 03:36:06 -07:00
} ) ;
2021-10-22 02:02:56 -06:00
2017-11-06 03:36:06 -07:00
it ( 'handles from as' , ( ) = > {
2024-01-21 01:20:41 -07:00
const res = extractPackageFile (
'FROM node:8.9.0-alpine as base\n' ,
'' ,
{ } ,
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '8.9.0-alpine' ,
datasource : 'docker' ,
depName : 'node' ,
depType : 'final' ,
replaceString : 'node:8.9.0-alpine' ,
} ,
] ) ;
2017-11-06 03:36:06 -07:00
} ) ;
2021-10-22 02:02:56 -06:00
2017-11-06 03:36:06 -07:00
it ( 'handles comments' , ( ) = > {
2021-05-17 02:06:24 -06:00
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'# some comment\n# another\n\nFROM node\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'node' ,
depType : 'final' ,
replaceString : 'node' ,
} ,
] ) ;
2017-11-06 03:36:06 -07:00
} ) ;
2021-10-22 02:02:56 -06:00
2017-11-06 03:36:06 -07:00
it ( 'handles custom hosts' , ( ) = > {
2021-05-17 02:06:24 -06:00
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'FROM registry2.something.info/node:8\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '8' ,
datasource : 'docker' ,
depName : 'registry2.something.info/node' ,
depType : 'final' ,
replaceString : 'registry2.something.info/node:8' ,
} ,
] ) ;
2018-07-20 01:09:01 -06:00
} ) ;
2021-10-22 02:02:56 -06:00
2018-07-20 01:09:01 -06:00
it ( 'handles custom hosts and suffix' , ( ) = > {
2018-11-04 10:51:23 -07:00
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'FROM registry2.something.info/node:8-alpine\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '8-alpine' ,
datasource : 'docker' ,
depName : 'registry2.something.info/node' ,
depType : 'final' ,
replaceString : 'registry2.something.info/node:8-alpine' ,
} ,
] ) ;
2017-11-06 05:19:41 -07:00
} ) ;
2021-10-22 02:02:56 -06:00
2017-11-06 05:19:41 -07:00
it ( 'handles custom hosts with port' , ( ) = > {
2018-11-04 10:51:23 -07:00
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'FROM registry2.something.info:5005/node:8\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '8' ,
datasource : 'docker' ,
depName : 'registry2.something.info:5005/node' ,
depType : 'final' ,
replaceString : 'registry2.something.info:5005/node:8' ,
} ,
] ) ;
2019-05-15 03:40:58 -06:00
} ) ;
2021-10-22 02:02:56 -06:00
2019-05-15 03:40:58 -06:00
it ( 'handles custom hosts with port without tag' , ( ) = > {
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'FROM registry2.something.info:5005/node\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'registry2.something.info:5005/node' ,
depType : 'final' ,
replaceString : 'registry2.something.info:5005/node' ,
} ,
] ) ;
2017-11-06 05:19:41 -07:00
} ) ;
2021-10-22 02:02:56 -06:00
2021-08-12 04:55:14 -06:00
it ( 'handles quay hosts with port' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( 'FROM quay.io:1234/node\n' , '' , { } ) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'quay.io/node' ,
depType : 'final' ,
packageName : 'quay.io:1234/node' ,
replaceString : 'quay.io:1234/node' ,
} ,
] ) ;
2021-08-12 04:55:14 -06:00
} ) ;
2021-10-22 02:02:56 -06:00
2017-11-06 05:19:41 -07:00
it ( 'handles namespaced images' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( 'FROM mynamespace/node:8\n' , '' , { } ) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '8' ,
datasource : 'docker' ,
depName : 'mynamespace/node' ,
depType : 'final' ,
replaceString : 'mynamespace/node:8' ,
} ,
] ) ;
2017-11-06 05:19:41 -07:00
} ) ;
2021-10-22 02:02:56 -06:00
2017-11-06 05:19:41 -07:00
it ( 'handles custom hosts with namespace' , ( ) = > {
2018-11-04 10:51:23 -07:00
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'FROM registry2.something.info/someaccount/node:8\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '8' ,
datasource : 'docker' ,
depName : 'registry2.something.info/someaccount/node' ,
depType : 'final' ,
replaceString : 'registry2.something.info/someaccount/node:8' ,
} ,
] ) ;
2017-11-06 03:36:06 -07:00
} ) ;
2021-10-22 02:02:56 -06:00
2020-10-20 00:49:28 -06:00
it ( 'handles abnormal spacing' , ( ) = > {
2018-11-04 10:51:23 -07:00
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'FROM registry.allmine.info:5005/node:8.7.0\n\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '8.7.0' ,
datasource : 'docker' ,
depName : 'registry.allmine.info:5005/node' ,
depType : 'final' ,
replaceString : 'registry.allmine.info:5005/node:8.7.0' ,
} ,
] ) ;
2017-11-08 06:47:52 -07:00
} ) ;
2021-10-22 02:02:56 -06:00
2018-01-18 22:59:35 -07:00
it ( 'extracts multiple FROM tags' , ( ) = > {
2018-11-04 10:51:23 -07:00
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'FROM node:6.12.3 as frontend\n\n# comment\nENV foo=bar\nFROM python:3.6-slim\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '6.12.3' ,
datasource : 'docker' ,
depName : 'node' ,
depType : 'stage' ,
replaceString : 'node:6.12.3' ,
} ,
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '3.6-slim' ,
datasource : 'docker' ,
depName : 'python' ,
depType : 'final' ,
replaceString : 'python:3.6-slim' ,
} ,
] ) ;
2018-03-20 14:42:34 -06:00
} ) ;
2021-10-22 02:02:56 -06:00
2024-07-13 01:49:31 -06:00
it ( 'extracts tags from Dockerfile which begins with a BOM marker' , ( ) = > {
const res = extractPackageFile (
'\uFEFFFROM node:6.12.3 as frontend\n\n' ,
'' ,
{ } ,
) ? . deps ;
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '6.12.3' ,
datasource : 'docker' ,
depName : 'node' ,
depType : 'final' ,
replaceString : 'node:6.12.3' ,
} ,
] ) ;
} ) ;
2020-10-20 00:49:28 -06:00
it ( 'skips scratches' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( 'FROM scratch\nADD foo\n' , '' , { } ) ;
2019-04-02 08:59:27 -06:00
expect ( res ) . toBeNull ( ) ;
2018-03-20 22:16:03 -06:00
} ) ;
2021-10-22 02:02:56 -06:00
2018-03-20 14:42:34 -06:00
it ( 'skips named multistage FROM tags' , ( ) = > {
2018-11-04 10:51:23 -07:00
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'FROM node:6.12.3 as frontend\n\n# comment\nENV foo=bar\nFROM frontend\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '6.12.3' ,
datasource : 'docker' ,
depName : 'node' ,
depType : 'final' ,
replaceString : 'node:6.12.3' ,
} ,
] ) ;
2018-01-18 22:59:35 -07:00
} ) ;
2021-10-22 02:02:56 -06:00
2018-08-11 03:27:18 -06:00
it ( 'handles COPY --from' , ( ) = > {
2018-11-04 10:51:23 -07:00
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'FROM scratch\nCOPY --from=gcr.io/k8s-skaffold/skaffold:v0.11.0 /usr/bin/skaffold /usr/bin/skaffold\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : 'v0.11.0' ,
datasource : 'docker' ,
depName : 'gcr.io/k8s-skaffold/skaffold' ,
depType : 'final' ,
replaceString : 'gcr.io/k8s-skaffold/skaffold:v0.11.0' ,
} ,
] ) ;
2018-08-11 03:27:18 -06:00
} ) ;
2021-10-22 02:02:56 -06:00
2024-09-12 05:29:23 -06:00
it ( 'handles COPY --link --from' , ( ) = > {
const res = extractPackageFile (
codeBlock `
FROM scratch
COPY -- link -- from = gcr . io / k8s - skaffold / skaffold :v0.11.0 / usr / bin / skaffold / usr / bin / skaffold
` ,
'' ,
{ } ,
) ;
expect ( res ) . toEqual ( {
deps : [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : 'v0.11.0' ,
datasource : 'docker' ,
depName : 'gcr.io/k8s-skaffold/skaffold' ,
depType : 'final' ,
replaceString : 'gcr.io/k8s-skaffold/skaffold:v0.11.0' ,
} ,
] ,
} ) ;
} ) ;
2018-08-11 03:27:18 -06:00
it ( 'skips named multistage COPY --from tags' , ( ) = > {
2018-11-04 10:51:23 -07:00
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'FROM node:6.12.3 as frontend\n\n# comment\nENV foo=bar\nCOPY --from=frontend /usr/bin/node /usr/bin/node\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '6.12.3' ,
datasource : 'docker' ,
depName : 'node' ,
depType : 'final' ,
replaceString : 'node:6.12.3' ,
} ,
] ) ;
2018-08-11 03:27:18 -06:00
} ) ;
2021-10-22 02:02:56 -06:00
2018-10-28 01:30:28 -06:00
it ( 'skips index reference COPY --from tags' , ( ) = > {
2018-11-04 10:51:23 -07:00
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'FROM node:6.12.3 as frontend\n\n# comment\nENV foo=bar\nCOPY --from=0 /usr/bin/node /usr/bin/node\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '6.12.3' ,
datasource : 'docker' ,
depName : 'node' ,
depType : 'final' ,
replaceString : 'node:6.12.3' ,
} ,
] ) ;
2018-10-28 01:30:28 -06:00
} ) ;
2021-10-22 02:02:56 -06:00
2019-03-16 00:00:59 -06:00
it ( 'detects ["stage"] and ["final"] deps of docker multi-stage build.' , ( ) = > {
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'FROM node:8.15.1-alpine as skippedfrom\nFROM golang:1.7.3 as builder\n\n# comment\nWORKDIR /go/src/github.com/alexellis/href-counter/\nRUN go get -d -v golang.org/x/net/html \nCOPY app.go .\nRUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .\n\nFROM alpine:latest \nRUN apk --no-cache add ca-certificates\nWORKDIR /root/\nCOPY --from=builder /go/src/github.com/alexellis/href-counter/app .\nCMD ["./app"]\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '8.15.1-alpine' ,
datasource : 'docker' ,
depName : 'node' ,
depType : 'stage' ,
replaceString : 'node:8.15.1-alpine' ,
} ,
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '1.7.3' ,
datasource : 'docker' ,
depName : 'golang' ,
depType : 'stage' ,
replaceString : 'golang:1.7.3' ,
} ,
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : 'latest' ,
datasource : 'docker' ,
depName : 'alpine' ,
depType : 'final' ,
replaceString : 'alpine:latest' ,
} ,
] ) ;
2019-03-16 00:00:59 -06:00
const passed = [
2022-06-20 09:05:39 -06:00
res ? . [ 2 ] . depType === 'final' ,
res ? . [ 1 ] . depType === 'stage' ,
res ? . [ 0 ] . depType === 'stage' ,
2019-03-16 00:00:59 -06:00
] . every ( Boolean ) ;
2021-10-26 23:24:36 -06:00
expect ( passed ) . toBeTrue ( ) ;
2019-03-16 00:00:59 -06:00
} ) ;
2021-10-22 02:02:56 -06:00
2018-06-13 02:25:42 -06:00
it ( 'extracts images on adjacent lines' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( d1 , '' , { } ) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest :
'sha256:d743b4141b02fcfb8beb68f92b4cd164f60ee457bf2d053f36785bf86de16b0d' ,
currentValue : '8.11.3-alpine' ,
datasource : 'docker' ,
depName : 'node' ,
depType : 'stage' ,
replaceString :
'node:8.11.3-alpine@sha256:d743b4141b02fcfb8beb68f92b4cd164f60ee457bf2d053f36785bf86de16b0d' ,
} ,
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '1.1.1' ,
datasource : 'docker' ,
depName : 'buildkite/puppeteer' ,
depType : 'final' ,
replaceString : 'buildkite/puppeteer:1.1.1' ,
} ,
] ) ;
2018-06-13 02:25:42 -06:00
} ) ;
2021-10-22 02:02:56 -06:00
2021-01-19 01:37:23 -07:00
it ( 'extracts images from all sorts of (maybe multiline) FROM and COPY --from statements' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( d2 , '' , { } ) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'image1' ,
depType : 'stage' ,
replaceString : 'image1' ,
} ,
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : 'sha256:abcdef' ,
currentValue : '1.0.0' ,
datasource : 'docker' ,
depName : 'image2' ,
depType : 'stage' ,
replaceString : 'image2:1.0.0@sha256:abcdef' ,
} ,
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'image4' ,
depType : 'stage' ,
replaceString : 'image4' ,
} ,
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'image5' ,
depType : 'stage' ,
replaceString : 'image5' ,
} ,
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'image6' ,
depType : 'stage' ,
replaceString : 'image6' ,
} ,
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : 'sha256:abcdef' ,
currentValue : '1.0.0' ,
datasource : 'docker' ,
depName : 'image7' ,
depType : 'stage' ,
replaceString : 'image7:1.0.0@sha256:abcdef' ,
} ,
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'image11' ,
depType : 'stage' ,
replaceString : 'image11' ,
} ,
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'image12' ,
depType : 'stage' ,
replaceString : 'image12' ,
} ,
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'image13' ,
depType : 'final' ,
replaceString : 'image13' ,
} ,
] ) ;
2021-01-19 01:37:23 -07:00
} ) ;
2021-10-22 02:02:56 -06:00
2018-08-16 07:46:19 -06:00
it ( 'handles calico/node' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( 'FROM calico/node\n' , '' , { } ) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'calico/node' ,
depType : 'final' ,
replaceString : 'calico/node' ,
} ,
] ) ;
2018-08-16 07:46:19 -06:00
} ) ;
2021-10-22 02:02:56 -06:00
2020-12-07 02:31:17 -07:00
it ( 'handles ubuntu' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( 'FROM ubuntu:18.04\n' , '' , { } ) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '18.04' ,
datasource : 'docker' ,
depName : 'ubuntu' ,
depType : 'final' ,
replaceString : 'ubuntu:18.04' ,
versioning : 'ubuntu' ,
} ,
] ) ;
2020-12-07 02:31:17 -07:00
} ) ;
2021-08-30 10:37:46 -06:00
2022-05-18 09:32:59 -06:00
it ( 'handles debian with codename' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( 'FROM debian:buster\n' , '' , { } ) ? . deps ;
2022-05-18 09:32:59 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : 'buster' ,
datasource : 'docker' ,
depName : 'debian' ,
depType : 'final' ,
replaceString : 'debian:buster' ,
versioning : 'debian' ,
} ,
] ) ;
} ) ;
2022-09-03 23:08:51 -06:00
it ( 'handles debian with regular tag' , ( ) = > {
const res = extractPackageFile ( 'FROM debian:11.4-slim\n' , '' , { } ) ? . deps ;
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '11.4-slim' ,
datasource : 'docker' ,
depName : 'debian' ,
depType : 'final' ,
replaceString : 'debian:11.4-slim' ,
} ,
] ) ;
} ) ;
2022-05-18 09:32:59 -06:00
it ( 'handles debian with prefixes' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( 'FROM amd64/debian:10\n' , '' , { } ) ? . deps ;
2022-05-18 09:32:59 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '10' ,
datasource : 'docker' ,
depName : 'debian' ,
depType : 'final' ,
packageName : 'amd64/debian' ,
replaceString : 'amd64/debian:10' ,
versioning : 'debian' ,
} ,
] ) ;
} ) ;
2024-05-08 22:18:32 -06:00
it ( 'handles debian with prefixes and registries' , ( ) = > {
const res = extractPackageFile (
'FROM docker.io/library/debian:10\n' ,
'' ,
{ } ,
) ? . deps ;
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '10' ,
datasource : 'docker' ,
depName : 'docker.io/library/debian' ,
depType : 'final' ,
replaceString : 'docker.io/library/debian:10' ,
versioning : 'debian' ,
} ,
] ) ;
} ) ;
2021-08-30 10:37:46 -06:00
it ( 'handles prefixes' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( 'FROM amd64/ubuntu:18.04\n' , '' , { } ) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '18.04' ,
datasource : 'docker' ,
depName : 'ubuntu' ,
depType : 'final' ,
packageName : 'amd64/ubuntu' ,
replaceString : 'amd64/ubuntu:18.04' ,
versioning : 'ubuntu' ,
} ,
] ) ;
2021-08-30 10:37:46 -06:00
} ) ;
2022-06-05 23:47:17 -06:00
2024-05-08 22:18:32 -06:00
it ( 'handles prefixes with registries' , ( ) = > {
const res = extractPackageFile (
'FROM public.ecr.aws/ubuntu/ubuntu:18.04\n' ,
'' ,
{ } ,
) ? . deps ;
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '18.04' ,
datasource : 'docker' ,
depName : 'public.ecr.aws/ubuntu/ubuntu' ,
depType : 'final' ,
replaceString : 'public.ecr.aws/ubuntu/ubuntu:18.04' ,
versioning : 'ubuntu' ,
} ,
] ) ;
} ) ;
2022-06-05 23:47:17 -06:00
it ( 'handles implausible line continuation' , ( ) = > {
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'FROM alpine:3.5\n\nRUN something \\' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '3.5' ,
datasource : 'docker' ,
depName : 'alpine' ,
depType : 'final' ,
replaceString : 'alpine:3.5' ,
} ,
] ) ;
2022-06-05 23:47:17 -06:00
} ) ;
it ( 'handles multi-line FROM with space after escape character' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( 'FROM \\ \nnginx:1.20\n' , '' , { } ) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '1.20' ,
datasource : 'docker' ,
depName : 'nginx' ,
depType : 'final' ,
replaceString : 'nginx:1.20' ,
} ,
] ) ;
2022-06-05 23:47:17 -06:00
} ) ;
it ( 'handles FROM without ARG default value' , ( ) = > {
2024-01-21 01:20:41 -07:00
const res = extractPackageFile (
'ARG img_base\nFROM $img_base\n' ,
'' ,
{ } ,
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
datasource : 'docker' ,
depType : 'final' ,
replaceString : '$img_base' ,
skipReason : 'contains-variable' ,
} ,
] ) ;
2022-06-05 23:47:17 -06:00
} ) ;
it ( 'handles FROM with empty ARG default value' , ( ) = > {
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'ARG patch1=""\nARG patch2=\nFROM nginx:1.20${patch1}$patch2\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
2022-11-07 15:54:37 -07:00
'FROM nginx:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}${patch1}$patch2\n' ,
2022-09-06 00:57:20 -06:00
currentDigest : undefined ,
currentValue : '1.20' ,
datasource : 'docker' ,
depName : 'nginx' ,
depType : 'final' ,
2022-11-07 15:54:37 -07:00
replaceString : 'FROM nginx:1.20${patch1}$patch2\n' ,
2022-09-06 00:57:20 -06:00
} ,
] ) ;
2022-06-05 23:47:17 -06:00
} ) ;
it ( 'handles FROM with version in ARG value' , ( ) = > {
const res = extractPackageFile (
2022-10-26 22:06:41 -06:00
'ARG\tVARIANT="1.60.0-bullseye" \nFROM\trust:${VARIANT}\n' ,
2022-08-17 07:57:53 -06:00
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
2022-11-07 15:54:37 -07:00
'ARG\tVARIANT="{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}" \n' ,
2022-09-06 00:57:20 -06:00
currentDigest : undefined ,
currentValue : '1.60.0-bullseye' ,
datasource : 'docker' ,
depName : 'rust' ,
depType : 'final' ,
2022-11-07 15:54:37 -07:00
replaceString : 'ARG\tVARIANT="1.60.0-bullseye" \n' ,
2022-09-06 00:57:20 -06:00
} ,
] ) ;
2022-06-05 23:47:17 -06:00
} ) ;
it ( 'handles FROM with version in ARG default value' , ( ) = > {
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'ARG IMAGE_VERSION=${IMAGE_VERSION:-ubuntu:xenial}\nfrom ${IMAGE_VERSION} as base\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
2022-11-07 15:54:37 -07:00
'ARG IMAGE_VERSION=${IMAGE_VERSION:-ubuntu:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}}\n' ,
2022-09-06 00:57:20 -06:00
currentValue : 'xenial' ,
datasource : 'docker' ,
depName : 'ubuntu' ,
depType : 'final' ,
2022-11-07 15:54:37 -07:00
replaceString : 'ARG IMAGE_VERSION=${IMAGE_VERSION:-ubuntu:xenial}\n' ,
2022-09-06 00:57:20 -06:00
versioning : 'ubuntu' ,
} ,
] ) ;
2022-06-05 23:47:17 -06:00
} ) ;
it ( 'handles FROM with digest in ARG default value' , ( ) = > {
const res = extractPackageFile (
'ARG sha_digest=sha256:ab37242e81cbc031b2600eef4440fe87055a05c14b40686df85078cc5086c98f\n' +
2022-08-17 07:57:53 -06:00
' FROM gcr.io/distroless/java17@$sha_digest' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'ARG sha_digest={{#if newDigest}}{{newDigest}}{{/if}}' ,
currentDigest :
'sha256:ab37242e81cbc031b2600eef4440fe87055a05c14b40686df85078cc5086c98f' ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'gcr.io/distroless/java17' ,
depType : 'final' ,
replaceString :
'ARG sha_digest=sha256:ab37242e81cbc031b2600eef4440fe87055a05c14b40686df85078cc5086c98f' ,
} ,
] ) ;
2022-06-05 23:47:17 -06:00
} ) ;
it ( 'handles FROM with overwritten ARG value' , ( ) = > {
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'ARG base=nginx:1.19\nFROM $base as stage1\nARG base=nginx:1.20\nFROM --platform=amd64 $base as stage2\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
2022-11-07 15:54:37 -07:00
'ARG base=nginx:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}\n' ,
2022-09-06 00:57:20 -06:00
currentDigest : undefined ,
currentValue : '1.19' ,
datasource : 'docker' ,
depName : 'nginx' ,
depType : 'stage' ,
2022-11-07 15:54:37 -07:00
replaceString : 'ARG base=nginx:1.19\n' ,
2022-09-06 00:57:20 -06:00
} ,
{
autoReplaceStringTemplate :
2022-11-07 15:54:37 -07:00
'ARG base=nginx:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}\n' ,
2022-09-06 00:57:20 -06:00
currentDigest : undefined ,
currentValue : '1.20' ,
datasource : 'docker' ,
depName : 'nginx' ,
depType : 'final' ,
2022-11-07 15:54:37 -07:00
replaceString : 'ARG base=nginx:1.20\n' ,
2022-09-06 00:57:20 -06:00
} ,
] ) ;
2022-06-05 23:47:17 -06:00
} ) ;
it ( 'handles FROM with multiple ARG values' , ( ) = > {
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'ARG CUDA=9.2\nARG LINUX_VERSION ubuntu16.04\nFROM nvidia/cuda:${CUDA}-devel-${LINUX_VERSION}\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '9.2-devel-ubuntu16.04' ,
datasource : 'docker' ,
depName : 'nvidia/cuda' ,
depType : 'final' ,
replaceString : 'nvidia/cuda:9.2-devel-ubuntu16.04' ,
} ,
] ) ;
2022-06-05 23:47:17 -06:00
} ) ;
it ( 'skips scratch if provided in ARG value' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile (
'ARG img="scratch"\nFROM $img as base\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-08-17 07:57:53 -06:00
) ;
2022-06-05 23:47:17 -06:00
expect ( res ) . toBeNull ( ) ;
} ) ;
it ( 'extracts images from multi-line ARG statements' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( d3 , '' , { } ) ? . deps ;
2022-06-05 23:47:17 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
' ARG \\\n' +
'\t# multi-line arg\n' +
2022-11-07 15:54:37 -07:00
' ALPINE_VERSION=alpine:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}\n' ,
2022-06-05 23:47:17 -06:00
currentDigest : undefined ,
currentValue : '3.15.4' ,
datasource : 'docker' ,
depName : 'alpine' ,
depType : 'stage' ,
replaceString :
' ARG \\\n' +
'\t# multi-line arg\n' +
2022-11-07 15:54:37 -07:00
' ALPINE_VERSION=alpine:3.15.4\n' ,
2022-06-05 23:47:17 -06:00
} ,
{
autoReplaceStringTemplate :
'ARG \\\n' +
' \\\n' +
' # multi-line arg\n' +
' # and multi-line comment\n' +
' nginx_version="nginx:{{#if newValue}}{{newValue}}{{/if}}@{{#if newDigest}}{{newDigest}}{{/if}}"' ,
currentDigest :
'sha256:ca9fac83c6c89a09424279de522214e865e322187b22a1a29b12747a4287b7bd' ,
currentValue : '1.18.0-alpine' ,
datasource : 'docker' ,
depName : 'nginx' ,
depType : 'final' ,
replaceString :
'ARG \\\n' +
' \\\n' +
' # multi-line arg\n' +
' # and multi-line comment\n' +
' nginx_version="nginx:1.18.0-alpine@sha256:ca9fac83c6c89a09424279de522214e865e322187b22a1a29b12747a4287b7bd"' ,
} ,
] ) ;
} ) ;
it ( 'ignores parser directives in wrong order' , ( ) = > {
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'# dummy\n# escape = `\n\nFROM\\\nnginx:1.20' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '1.20' ,
datasource : 'docker' ,
depName : 'nginx' ,
depType : 'final' ,
replaceString : 'nginx:1.20' ,
} ,
] ) ;
2022-06-05 23:47:17 -06:00
} ) ;
it ( 'handles an alternative escape character' , ( ) = > {
2022-08-17 07:57:53 -06:00
const res = extractPackageFile ( d4 , '' , { } ) ? . deps ;
2022-06-05 23:47:17 -06:00
expect ( res ) . toEqual ( [
2023-11-10 09:27:15 -07:00
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '1' ,
datasource : 'docker' ,
depName : 'docker/dockerfile' ,
depType : 'syntax' ,
replaceString : 'docker/dockerfile:1' ,
} ,
2022-06-05 23:47:17 -06:00
{
autoReplaceStringTemplate :
' ARG `\n' +
'\t# multi-line arg\n' +
2022-11-07 15:54:37 -07:00
' ALPINE_VERSION=alpine:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}\n' ,
2022-06-05 23:47:17 -06:00
currentDigest : undefined ,
currentValue : '3.15.4' ,
datasource : 'docker' ,
depName : 'alpine' ,
depType : 'stage' ,
replaceString :
' ARG `\n' +
'\t# multi-line arg\n' +
2022-11-07 15:54:37 -07:00
' ALPINE_VERSION=alpine:3.15.4\n' ,
2022-06-05 23:47:17 -06:00
} ,
{
autoReplaceStringTemplate :
'ARG `\n' +
' `\n' +
' # multi-line arg\n' +
' # and multi-line comment\n' +
' nginx_version="nginx:{{#if newValue}}{{newValue}}{{/if}}@{{#if newDigest}}{{newDigest}}{{/if}}"' ,
currentDigest : 'sha256:abcdef' ,
currentValue : '18.04' ,
datasource : 'docker' ,
depName : 'nginx' ,
depType : 'stage' ,
replaceString :
'ARG `\n' +
' `\n' +
' # multi-line arg\n' +
' # and multi-line comment\n' +
' nginx_version="nginx:18.04@sha256:abcdef"' ,
} ,
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'image5' ,
depType : 'stage' ,
replaceString : 'image5' ,
} ,
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : undefined ,
datasource : 'docker' ,
depName : 'image12' ,
depType : 'final' ,
replaceString : 'image12' ,
} ,
] ) ;
} ) ;
it ( 'handles FROM with version in ARG default value and quotes' , ( ) = > {
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'ARG REF_NAME=${REF_NAME:-"gcr.io/distroless/static-debian11:nonroot@sha256:abc"}\nfrom ${REF_NAME}' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'ARG REF_NAME=${REF_NAME:-"gcr.io/distroless/static-debian11:{{#if newValue}}{{newValue}}{{/if}}@{{#if newDigest}}{{newDigest}}{{/if}}"}' ,
currentDigest : 'sha256:abc' ,
currentValue : 'nonroot' ,
datasource : 'docker' ,
depName : 'gcr.io/distroless/static-debian11' ,
depType : 'final' ,
replaceString :
'ARG REF_NAME=${REF_NAME:-"gcr.io/distroless/static-debian11:nonroot@sha256:abc"}' ,
} ,
] ) ;
2022-06-05 23:47:17 -06:00
} ) ;
it ( 'handles version in ARG and digest in FROM with CRLF linefeed' , ( ) = > {
const res = extractPackageFile (
2022-08-17 07:57:53 -06:00
'ARG IMAGE_TAG=14.04\r\n#something unrelated\r\nFROM ubuntu:$IMAGE_TAG@sha256:abc\r\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-06-05 23:47:17 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'ARG IMAGE_TAG={{#if newValue}}{{newValue}}{{/if}}\r\n#something unrelated\r\nFROM ubuntu:$IMAGE_TAG@{{#if newDigest}}{{newDigest}}{{/if}}' ,
currentDigest : 'sha256:abc' ,
currentValue : '14.04' ,
datasource : 'docker' ,
depName : 'ubuntu' ,
depType : 'final' ,
replaceString :
'ARG IMAGE_TAG=14.04\r\n#something unrelated\r\nFROM ubuntu:$IMAGE_TAG@sha256:abc' ,
versioning : 'ubuntu' ,
} ,
] ) ;
} ) ;
it ( 'handles updates of multiple ARG values' , ( ) = > {
const res = extractPackageFile (
'# random comment\n\n' +
'ARG NODE_IMAGE_HASH="@sha256:ba9c961513b853210ae0ca1524274eafa5fd94e20b856343887ca7274c8450e4"\n' +
'ARG NODE_IMAGE_HOST="docker.io/library/"\n' +
'ARG NODE_IMAGE_NAME=node\n' +
'ARG NODE_IMAGE_TAG="16.14.2-alpine3.14"\n' +
'ARG DUMMY_PREFIX=\n' +
2022-08-17 07:57:53 -06:00
'FROM ${DUMMY_PREFIX}${NODE_IMAGE_HOST}${NODE_IMAGE_NAME}:${NODE_IMAGE_TAG}${NODE_IMAGE_HASH} as yarn\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-06-20 09:05:39 -06:00
) ? . deps ;
2022-06-05 23:47:17 -06:00
expect ( res ) . toEqual ( [
{
autoReplaceStringTemplate :
'ARG NODE_IMAGE_HASH="@{{#if newDigest}}{{newDigest}}{{/if}}"\n' +
'ARG NODE_IMAGE_HOST="docker.io/library/"\n' +
'ARG NODE_IMAGE_NAME=node\n' +
'ARG NODE_IMAGE_TAG="{{#if newValue}}{{newValue}}{{/if}}"' ,
currentDigest :
'sha256:ba9c961513b853210ae0ca1524274eafa5fd94e20b856343887ca7274c8450e4' ,
currentValue : '16.14.2-alpine3.14' ,
datasource : 'docker' ,
depName : 'docker.io/library/node' ,
depType : 'final' ,
replaceString :
'ARG NODE_IMAGE_HASH="@sha256:ba9c961513b853210ae0ca1524274eafa5fd94e20b856343887ca7274c8450e4"\n' +
'ARG NODE_IMAGE_HOST="docker.io/library/"\n' +
'ARG NODE_IMAGE_NAME=node\n' +
'ARG NODE_IMAGE_TAG="16.14.2-alpine3.14"' ,
} ,
] ) ;
} ) ;
2017-11-06 03:36:06 -07:00
} ) ;
2022-04-12 08:49:49 -06:00
2022-08-17 07:57:53 -06:00
it ( 'handles empty optional parameters' , ( ) = > {
const res = extractPackageFile (
'FROM quay.io/myName/myPackage:0.6.2\n' ,
'' ,
2023-11-07 08:50:29 -07:00
{ } ,
2022-08-17 07:57:53 -06:00
) ;
expect ( res ) . toEqual ( {
deps : [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '0.6.2' ,
datasource : 'docker' ,
depName : 'quay.io/myName/myPackage' ,
depType : 'final' ,
replaceString : 'quay.io/myName/myPackage:0.6.2' ,
} ,
] ,
} ) ;
} ) ;
it ( 'handles registry alias' , ( ) = > {
const res = extractPackageFile (
'FROM quay.io/myName/myPackage:0.6.2\n' ,
'Dockerfile' ,
{
registryAliases : {
'quay.io' : 'my-quay-mirror.registry.com' ,
'index.docker.io' : 'my-docker-mirror.registry.com' ,
} ,
2023-11-07 08:50:29 -07:00
} ,
2022-08-17 07:57:53 -06:00
) ;
expect ( res ) . toEqual ( {
deps : [
{
autoReplaceStringTemplate :
'quay.io/myName/myPackage:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '0.6.2' ,
datasource : 'docker' ,
depName : 'my-quay-mirror.registry.com/myName/myPackage' ,
depType : 'final' ,
replaceString : 'quay.io/myName/myPackage:0.6.2' ,
} ,
] ,
} ) ;
} ) ;
it ( 'handles empty registry' , ( ) = > {
const res = extractPackageFile (
'FROM myName/myPackage:0.6.2\n' ,
'Dockerfile' ,
{
registryAliases : {
'quay.io' : 'my-quay-mirror.registry.com' ,
'index.docker.io' : 'my-docker-mirror.registry.com' ,
} ,
2023-11-07 08:50:29 -07:00
} ,
2022-08-17 07:57:53 -06:00
) ;
expect ( res ) . toEqual ( {
deps : [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '0.6.2' ,
datasource : 'docker' ,
depName : 'myName/myPackage' ,
depType : 'final' ,
replaceString : 'myName/myPackage:0.6.2' ,
} ,
] ,
} ) ;
} ) ;
2023-11-10 09:27:15 -07:00
it ( 'handles # syntax statements' , ( ) = > {
const res = extractPackageFile (
'# syntax=docker/dockerfile:1.1.7\n' + 'FROM alpine:3.13.5\n' ,
'' ,
{ } ,
) ;
expect ( res ) . toEqual ( {
deps : [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '1.1.7' ,
datasource : 'docker' ,
depName : 'docker/dockerfile' ,
depType : 'syntax' ,
replaceString : 'docker/dockerfile:1.1.7' ,
} ,
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '3.13.5' ,
datasource : 'docker' ,
depName : 'alpine' ,
depType : 'final' ,
replaceString : 'alpine:3.13.5' ,
} ,
] ,
} ) ;
} ) ;
it ( 'ignores # syntax statements after first line' , ( ) = > {
const res = extractPackageFile (
'FROM alpine:3.13.5\n' + '# syntax=docker/dockerfile:1.1.7\n' ,
'' ,
{ } ,
) ;
expect ( res ) . toEqual ( {
deps : [
{
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : undefined ,
currentValue : '3.13.5' ,
datasource : 'docker' ,
depName : 'alpine' ,
depType : 'final' ,
replaceString : 'alpine:3.13.5' ,
} ,
] ,
} ) ;
} ) ;
2020-12-13 04:11:43 -07:00
describe ( 'getDep()' , ( ) = > {
it ( 'rejects null' , ( ) = > {
2021-08-18 00:49:27 -06:00
expect ( getDep ( null ) ) . toEqual ( { skipReason : 'invalid-value' } ) ;
2020-12-13 04:11:43 -07:00
} ) ;
2021-10-31 01:22:52 -06:00
2022-09-06 00:57:20 -06:00
it ( 'rejects empty or whitespace' , ( ) = > {
expect ( getDep ( '' ) ) . toEqual ( { skipReason : 'invalid-value' } ) ;
} ) ;
2021-10-31 01:22:52 -06:00
it ( 'handles default environment variable values' , ( ) = > {
const res = getDep ( '${REDIS_IMAGE:-redis:5.0.0@sha256:abcd}' ) ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( {
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : 'sha256:abcd' ,
currentValue : '5.0.0' ,
datasource : 'docker' ,
depName : 'redis' ,
replaceString : 'redis:5.0.0@sha256:abcd' ,
} ) ;
2021-10-31 01:22:52 -06:00
const res2 = getDep ( '${REDIS_IMAGE:-redis:5.0.0}' ) ;
2022-09-06 00:57:20 -06:00
expect ( res2 ) . toEqual ( {
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentValue : '5.0.0' ,
datasource : 'docker' ,
depName : 'redis' ,
replaceString : 'redis:5.0.0' ,
} ) ;
2021-10-31 01:22:52 -06:00
const res3 = getDep ( '${REDIS_IMAGE:-redis@sha256:abcd}' ) ;
2022-09-06 00:57:20 -06:00
expect ( res3 ) . toEqual ( {
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : 'sha256:abcd' ,
datasource : 'docker' ,
depName : 'redis' ,
replaceString : 'redis@sha256:abcd' ,
} ) ;
2022-06-05 23:47:17 -06:00
const res4 = getDep (
2023-11-07 08:50:29 -07:00
'${REF_NAME:-"gcr.io/distroless/static-debian11:nonroot@sha256:abc"}' ,
2022-06-05 23:47:17 -06:00
) ;
2022-09-06 00:57:20 -06:00
expect ( res4 ) . toEqual ( {
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
currentDigest : 'sha256:abc' ,
currentValue : 'nonroot' ,
datasource : 'docker' ,
depName : 'gcr.io/distroless/static-debian11' ,
replaceString : 'gcr.io/distroless/static-debian11:nonroot@sha256:abc' ,
} ) ;
2022-06-05 23:47:17 -06:00
const res5 = getDep (
2023-11-07 08:50:29 -07:00
'${REF_NAME:+-gcr.io/distroless/static-debian11:nonroot@sha256:abc}' ,
2022-06-05 23:47:17 -06:00
) ;
2022-09-06 00:57:20 -06:00
expect ( res5 ) . toEqual ( {
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
datasource : 'docker' ,
replaceString :
'${REF_NAME:+-gcr.io/distroless/static-debian11:nonroot@sha256:abc}' ,
skipReason : 'contains-variable' ,
} ) ;
2021-10-31 01:22:52 -06:00
} ) ;
2021-11-02 03:28:52 -06:00
it ( 'skips tag containing a variable' , ( ) = > {
const res = getDep ( 'mcr.microsoft.com/dotnet/sdk:5.0${IMAGESUFFIX}' ) ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( {
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
datasource : 'docker' ,
replaceString : 'mcr.microsoft.com/dotnet/sdk:5.0${IMAGESUFFIX}' ,
skipReason : 'contains-variable' ,
} ) ;
2021-11-02 03:28:52 -06:00
} ) ;
2022-02-02 01:09:39 -07:00
it ( 'skips depName containing a non default variable at start' , ( ) = > {
const res = getDep ( '$CI_REGISTRY/alpine:3.15' ) ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( {
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
datasource : 'docker' ,
replaceString : '$CI_REGISTRY/alpine:3.15' ,
skipReason : 'contains-variable' ,
} ) ;
2022-02-02 01:09:39 -07:00
} ) ;
it ( 'skips depName containing a non default variable with brackets at start' , ( ) = > {
const res = getDep ( '${CI_REGISTRY}/alpine:3.15' ) ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( {
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
datasource : 'docker' ,
replaceString : '${CI_REGISTRY}/alpine:3.15' ,
skipReason : 'contains-variable' ,
} ) ;
2022-02-02 01:09:39 -07:00
} ) ;
it ( 'skips depName containing a non default variable' , ( ) = > {
const res = getDep ( 'docker.io/$PREFIX/alpine:3.15' ) ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( {
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
datasource : 'docker' ,
replaceString : 'docker.io/$PREFIX/alpine:3.15' ,
skipReason : 'contains-variable' ,
} ) ;
2022-02-02 01:09:39 -07:00
} ) ;
it ( 'skips depName containing a non default variable with brackets' , ( ) = > {
const res = getDep ( 'docker.io/${PREFIX}/alpine:3.15' ) ;
2022-09-06 00:57:20 -06:00
expect ( res ) . toEqual ( {
autoReplaceStringTemplate :
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ,
datasource : 'docker' ,
replaceString : 'docker.io/${PREFIX}/alpine:3.15' ,
skipReason : 'contains-variable' ,
} ) ;
2022-02-02 01:09:39 -07:00
} ) ;
2022-07-07 01:42:31 -06:00
2022-07-13 00:22:52 -06:00
const versionAndDigestTemplate =
':{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ;
2022-07-07 01:42:31 -06:00
const defaultAutoReplaceStringTemplate =
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}' ;
it . each `
name | registryAliases | imageName | dep
2022-07-13 00:22:52 -06:00
$ { 'multiple aliases' } | $ { { foo : 'foo.registry.com' , bar : 'bar.registry.com' } } | $ { 'foo/image:1.0' } | $ { { depName : 'foo.registry.com/image' , currentValue : '1.0' , autoReplaceStringTemplate : ` foo/image ${ versionAndDigestTemplate } ` } }
$ { 'aliased variable' } | $ { { $CI_REGISTRY : 'registry.com' } } | $ { '$CI_REGISTRY/image:1.0' } | $ { { depName : 'registry.com/image' , currentValue : '1.0' , autoReplaceStringTemplate : ` $ CI_REGISTRY/image ${ versionAndDigestTemplate } ` } }
$ { 'variables with brackets' } | $ { { '${CI_REGISTRY}' : 'registry.com' } } | $ { '${CI_REGISTRY}/image:1.0' } | $ { { depName : 'registry.com/image' , currentValue : '1.0' , autoReplaceStringTemplate : ` $ \ {CI_REGISTRY}/image ${ versionAndDigestTemplate } ` } }
$ { 'not aliased variable' } | $ { { } } | $ { '$CI_REGISTRY/image:1.0' } | $ { { autoReplaceStringTemplate : defaultAutoReplaceStringTemplate } }
$ { 'plain image' } | $ { { } } | $ { 'registry.com/image:1.0' } | $ { { depName : 'registry.com/image' , currentValue : '1.0' , autoReplaceStringTemplate : defaultAutoReplaceStringTemplate } }
2022-07-07 01:42:31 -06:00
` (
'supports registry aliases - $name' ,
( {
registryAliases ,
imageName ,
dep ,
} : {
registryAliases : Record < string , string > ;
imageName : string ;
dep : PackageDependency ;
} ) = > {
expect ( getDep ( imageName , true , registryAliases ) ) . toMatchObject ( {
. . . dep ,
replaceString : imageName ,
} ) ;
2023-11-07 08:50:29 -07:00
} ,
2022-07-07 01:42:31 -06:00
) ;
2020-12-13 04:11:43 -07:00
} ) ;
2022-06-05 23:47:17 -06:00
describe ( 'extractVariables()' , ( ) = > {
it ( 'handles no variable' , ( ) = > {
expect ( extractVariables ( 'nginx:latest' ) ) . toBeEmpty ( ) ;
} ) ;
it ( 'handles simple variable' , ( ) = > {
expect ( extractVariables ( 'nginx:$version' ) ) . toMatchObject ( {
$version : 'version' ,
} ) ;
} ) ;
it ( 'handles escaped variable' , ( ) = > {
expect ( extractVariables ( 'nginx:\\$version' ) ) . toMatchObject ( {
'\\$version' : 'version' ,
} ) ;
} ) ;
it ( 'handles complex variable' , ( ) = > {
expect ( extractVariables ( 'ubuntu:${ubuntu_version}' ) ) . toMatchObject ( {
'${ubuntu_version}' : 'ubuntu_version' ,
} ) ;
} ) ;
it ( 'handles complex variable with static default value' , ( ) = > {
expect ( extractVariables ( '${var1:-nginx}:latest' ) ) . toMatchObject ( {
'${var1:-nginx}' : 'var1' ,
} ) ;
} ) ;
it ( 'handles complex variable with other variable as default value' , ( ) = > {
expect ( extractVariables ( '${VAR1:-$var2}:latest' ) ) . toMatchObject ( {
'${VAR1:-$var2}' : 'VAR1' ,
} ) ;
} ) ;
it ( 'handles multiple variables' , ( ) = > {
expect ( extractVariables ( '${var1:-$var2}:$version' ) ) . toMatchObject ( {
'${var1:-$var2}' : 'var1' ,
$version : 'version' ,
} ) ;
} ) ;
} ) ;
2017-11-06 03:36:06 -07:00
} ) ;