Skip to content

Commit 03cbf76

Browse files
authored
Merge pull request #300 from u-kai/support-digest
Add support for container image with digest
2 parents b70ba03 + 18deb22 commit 03cbf76

File tree

2 files changed

+91
-8
lines changed

2 files changed

+91
-8
lines changed

ecs-deploy

+26-8
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ Required arguments:
4646
-p | --profile AWS Profile to use - If you set this, then aws-access-key, aws-secret-key and region are not needed
4747
-c | --cluster Name of ECS cluster
4848
-i | --image Name of Docker image to run, ex: repo/image:latest
49-
Format: [domain][:port][/repo][/][image][:tag]
49+
Format: [domain][:port][/repo][/][image][:tag|@digest]
5050
Examples: mariadb, mariadb:latest, private.registry.com:8000/repo/image:tag
5151
--aws-instance-profile Use the IAM role associated with this instance
5252
@@ -210,12 +210,13 @@ function parseImageName() {
210210
# - port
211211
# - repo
212212
# - image
213-
# - tag
213+
# - tagOrDigest
214+
# - emptyOrSha
214215
# If a group is missing it will be an empty string
215216
if [[ "x$TAGONLY" == "x" ]]; then
216-
imageRegex="^([a-zA-Z0-9\.\-]+):?([0-9]+)?/([a-zA-Z0-9\._\-]+)(/[\/a-zA-Z0-9\._\-]+)?:?([a-zA-Z0-9\._\-]+)?$"
217+
imageRegex="^([a-zA-Z0-9\.\-]+):?([0-9]+)?/([a-zA-Z0-9\._\-]+)(/[\/a-zA-Z0-9\._\-]+)?:?((@sha256:)?[a-zA-Z0-9\._\-]+)?$"
217218
else
218-
imageRegex="^:?([a-zA-Z0-9\._-]+)?$"
219+
imageRegex="^:?([a-zA-Z0-9\._-]+)?$"
219220
fi
220221

221222
if [[ $IMAGE =~ $imageRegex ]]; then
@@ -225,7 +226,13 @@ function parseImageName() {
225226
port=${BASH_REMATCH[2]}
226227
repo=${BASH_REMATCH[3]}
227228
img=${BASH_REMATCH[4]/#\//}
228-
tag=${BASH_REMATCH[5]}
229+
tagOrDigest=${BASH_REMATCH[5]}
230+
emptyOrSha=${BASH_REMATCH[6]}
231+
if [[ "x$emptyOrSha" == "x" ]]; then
232+
tag=${tagOrDigest}
233+
else
234+
digest=${tagOrDigest}
235+
fi
229236

230237
# Validate what we received to make sure we have the pieces needed
231238
if [[ "x$domain" == "x" ]]; then
@@ -251,14 +258,20 @@ function parseImageName() {
251258
fi
252259
else
253260
# check if using root level repo with format like mariadb or mariadb:latest
254-
rootRepoRegex="^([a-zA-Z0-9\-]+):?([a-zA-Z0-9\.\-_]+)?$"
261+
rootRepoRegex="^([a-zA-Z0-9\-]+):?((@sha256:)?[a-zA-Z0-9\.\-_]+)?$"
255262
if [[ $IMAGE =~ $rootRepoRegex ]]; then
256263
img=${BASH_REMATCH[1]}
257264
if [[ "x$img" == "x" ]]; then
258265
echo "Invalid image name. See usage for supported formats."
259266
exit 12
260267
fi
261-
tag=${BASH_REMATCH[2]}
268+
tagOrDigest=${BASH_REMATCH[2]}
269+
emptyOrSha=${BASH_REMATCH[3]}
270+
if [[ "x$emptyOrSha" == "x" ]]; then
271+
tag=${tagOrDigest}
272+
else
273+
digest=${tagOrDigest}
274+
fi
262275

263276
# for root level repo, initialize unused variables for checks when rebuilding image below
264277
domain=""
@@ -279,6 +292,9 @@ function parseImageName() {
279292
tag=${!TAGVAR}
280293
if [[ "x$tag" == "x" ]]; then
281294
tag="latest"
295+
else
296+
# If !TAGVAR isn't empty, we should use the value of the env var as the tag whether IMAGE contains a digest or not.
297+
emptyOrSha=""
282298
fi
283299
fi
284300
fi
@@ -304,7 +320,9 @@ function parseImageName() {
304320
fi
305321
fi
306322
imageWithoutTag="$useImage"
307-
if [[ ! -z "$tag" ]]; then
323+
if [[ ! -z "$emptyOrSha" ]]; then
324+
useImage="$useImage$digest"
325+
else
308326
useImage="$useImage:$tag"
309327
fi
310328

test.bats

+65
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,14 @@ setup() {
9494
[ "$output" == "mariadb:1.2.3" ]
9595
}
9696

97+
@test "test parseImageName root image with digest" {
98+
IMAGE="mariadb@sha256:1234567890abcdef"
99+
TAGVAR=false
100+
run parseImageName
101+
[ ! -z $status ]
102+
[ "$output" == "mariadb@sha256:1234567890abcdef" ]
103+
}
104+
97105
@test "test parseImageName repo image no tag" {
98106
IMAGE="repo/image"
99107
TAGVAR=false
@@ -110,6 +118,14 @@ setup() {
110118
[ "$output" == "repo/image:v1.2.3" ]
111119
}
112120

121+
@test "test parseImageName repo image with digest" {
122+
IMAGE="repo/image@sha256:1234567890abcdef"
123+
TAGVAR=false
124+
run parseImageName
125+
[ ! -z $status ]
126+
[ "$output" == "repo/image@sha256:1234567890abcdef" ]
127+
}
128+
113129
@test "test parseImageName repo multilevel image no tag" {
114130
IMAGE="repo/multi/level/image"
115131
TAGVAR=false
@@ -126,6 +142,14 @@ setup() {
126142
[ "$output" == "repo/multi/level/image:v1.2.3" ]
127143
}
128144

145+
@test "test parseImageName repo multilevel image with digest" {
146+
IMAGE="repo/multi/level/image@sha256:1234567890abcdef"
147+
TAGVAR=false
148+
run parseImageName
149+
[ ! -z $status ]
150+
[ "$output" == "repo/multi/level/image@sha256:1234567890abcdef" ]
151+
}
152+
129153
@test "test parseImageName domain plus repo image no tag" {
130154
IMAGE="docker.domain.com/repo/image"
131155
TAGVAR=false
@@ -142,6 +166,14 @@ setup() {
142166
[ "$output" == "docker.domain.com/repo/image:1.2.3" ]
143167
}
144168

169+
@test "test parseImageName domain plus repo image with digest" {
170+
IMAGE="docker.domain.com/repo/image@sha256:1234567890abcdef"
171+
TAGVAR=false
172+
run parseImageName
173+
[ ! -z $status ]
174+
[ "$output" == "docker.domain.com/repo/image@sha256:1234567890abcdef" ]
175+
}
176+
145177
@test "test parseImageName domain plus repo multilevel image no tag" {
146178
IMAGE="docker.domain.com/repo/multi/level/image"
147179
TAGVAR=false
@@ -158,6 +190,14 @@ setup() {
158190
[ "$output" == "docker.domain.com/repo/multi/level/image:1.2.3" ]
159191
}
160192

193+
@test "test parseImageName domain plus repo multilevel image with digest" {
194+
IMAGE="docker.domain.com/repo/multi/level/image@sha256:1234567890abcdef"
195+
TAGVAR=false
196+
run parseImageName
197+
[ ! -z $status ]
198+
[ "$output" == "docker.domain.com/repo/multi/level/image@sha256:1234567890abcdef" ]
199+
}
200+
161201
@test "test parseImageName domain plus port plus repo image no tag" {
162202
IMAGE="docker.domain.com:8080/repo/image"
163203
TAGVAR=false
@@ -174,6 +214,14 @@ setup() {
174214
[ "$output" == "docker.domain.com:8080/repo/image:1.2.3" ]
175215
}
176216

217+
@test "test parseImageName domain plus port plus repo image with digest" {
218+
IMAGE="docker.domain.com:8080/repo/image@sha256:1234567890abcdef"
219+
TAGVAR=false
220+
run parseImageName
221+
[ ! -z $status ]
222+
[ "$output" == "docker.domain.com:8080/repo/image@sha256:1234567890abcdef" ]
223+
}
224+
177225
@test "test parseImageName domain plus port plus repo multilevel image no tag" {
178226
IMAGE="docker.domain.com:8080/repo/multi/level/image"
179227
TAGVAR=false
@@ -190,6 +238,14 @@ setup() {
190238
[ "$output" == "docker.domain.com:8080/repo/multi/level/image:1.2.3" ]
191239
}
192240

241+
@test "test parseImageName domain plus port plus repo multilevel image with digest" {
242+
IMAGE="docker.domain.com:8080/repo/multi/level/image@sha256:1234567890abcdef"
243+
TAGVAR=false
244+
run parseImageName
245+
[ ! -z $status ]
246+
[ "$output" == "docker.domain.com:8080/repo/multi/level/image@sha256:1234567890abcdef" ]
247+
}
248+
193249
@test "test parseImageName domain plus port plus repo image with tag from var" {
194250
IMAGE="docker.domain.com:8080/repo/image"
195251
TAGVAR="CI_TIMESTAMP"
@@ -225,6 +281,15 @@ setup() {
225281
[ "$output" == "121212345678.dkr.ecr.us-east-1.amazonaws.com/acct/repo:1487623908" ]
226282
}
227283

284+
@test "test parseImageName using ecr style image name and tag from var with digest" {
285+
IMAGE="docker.domain.com:8080/repo/image@sha256:1234567890abcdef"
286+
TAGVAR="CI_TIMESTAMP"
287+
CI_TIMESTAMP="1487623908"
288+
run parseImageName
289+
[ ! -z $status ]
290+
[ "$output" == "docker.domain.com:8080/repo/image:1487623908" ]
291+
}
292+
228293
@test "test createNewTaskDefJson with single container in definition" {
229294
imageWithoutTag="121212345678.dkr.ecr.us-east-1.amazonaws.com/acct/repo"
230295
useImage="121212345678.dkr.ecr.us-east-1.amazonaws.com/acct/repo:1111111111"

0 commit comments

Comments
 (0)