Skip to content

Commit 88c69f3

Browse files
feat: add local Docker image build and testing tasks
1 parent d3ea3d7 commit 88c69f3

File tree

4 files changed

+118
-9
lines changed

4 files changed

+118
-9
lines changed

Taskfile.docker.yml

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,90 @@ tasks:
5151
- docker buildx create --use
5252
- '{{.DOCKER_BUILD_START}} {{.DOCKER_BUILD_FINISH}}'
5353

54+
docker:build:local:
55+
desc: Build local runnable Docker image for current architecture
56+
cmds:
57+
- |
58+
set -eu
59+
arch="$(uname -m)"
60+
case "${arch}" in
61+
x86_64|amd64) target_arch="amd64" ;;
62+
aarch64|arm64) target_arch="arm64" ;;
63+
*)
64+
echo "❌ Unsupported local architecture: ${arch}"
65+
exit 1
66+
;;
67+
esac
68+
69+
docker build \
70+
--build-arg TARGETARCH="${target_arch}" \
71+
--tag "{{.DOCKER_NAME}}:{{.VERSION_FULL}}{{.VERSION_SUFFIX}}" \
72+
--file Dockerfile \
73+
.
74+
75+
docker:test:local:
76+
desc: Run container-structure-test action locally (requires local build)
77+
deps:
78+
- task: docker:build:local
79+
requires:
80+
vars: [CONFIG]
81+
cmds:
82+
- |
83+
set -eu
84+
image='{{default "" .IMAGE}}'
85+
image_from_oci_layout='{{default "" .IMAGE_FROM_OCI_LAYOUT}}'
86+
config='{{.CONFIG}}'
87+
88+
if [ -z "${image}" ] && [ -z "${image_from_oci_layout}" ]; then
89+
echo "❌ Provide IMAGE=<image-ref> or IMAGE_FROM_OCI_LAYOUT=<path>"
90+
exit 1
91+
fi
92+
if [ -n "${image}" ] && [ -n "${image_from_oci_layout}" ]; then
93+
echo "❌ IMAGE and IMAGE_FROM_OCI_LAYOUT are mutually exclusive"
94+
exit 1
95+
fi
96+
if [ ! -S /var/run/docker.sock ] && [ '{{default "docker" .DRIVER}}' = 'docker' ]; then
97+
echo "❌ Docker socket not available at /var/run/docker.sock (required for DRIVER=docker)"
98+
exit 1
99+
fi
100+
101+
docker run --rm \
102+
-v "$PWD:/github/workspace" \
103+
-w /github/workspace \
104+
-v /var/run/docker.sock:/var/run/docker.sock \
105+
-e INPUT_IMAGE="${image}" \
106+
-e INPUT_IMAGE_FROM_OCI_LAYOUT="${image_from_oci_layout}" \
107+
-e INPUT_CONFIG="${config}" \
108+
-e INPUT_DRIVER='{{default "docker" .DRIVER}}' \
109+
-e INPUT_PLATFORM='{{default "" .PLATFORM}}' \
110+
-e INPUT_PULL='{{default "false" .PULL}}' \
111+
-e INPUT_SAVE='{{default "false" .SAVE}}' \
112+
-e INPUT_QUIET='{{default "false" .QUIET}}' \
113+
-e INPUT_NO_COLOR='{{default "false" .NO_COLOR}}' \
114+
-e INPUT_OUTPUT='{{default "text" .OUTPUT}}' \
115+
-e INPUT_TEST_REPORT='{{default "" .TEST_REPORT}}' \
116+
-e INPUT_JUNIT_SUITE_NAME='{{default "" .JUNIT_SUITE_NAME}}' \
117+
-e INPUT_METADATA='{{default "" .METADATA}}' \
118+
-e INPUT_RUNTIME='{{default "" .RUNTIME}}' \
119+
-e INPUT_FORCE='{{default "false" .FORCE}}' \
120+
-e INPUT_DEFAULT_IMAGE_TAG='{{default "" .DEFAULT_IMAGE_TAG}}' \
121+
-e INPUT_IGNORE_REF_ANNOTATION='{{default "false" .IGNORE_REF_ANNOTATION}}' \
122+
-e INPUT_DEBUG='{{default "false" .DEBUG}}' \
123+
devopsinfra/action-container-structure-test:v1
124+
125+
docker:test:smoke:
126+
desc: Smoke test local action image with container-structure-test
127+
deps:
128+
- task: docker:build:local
129+
cmds:
130+
- |
131+
set -eu
132+
task docker:test:local \
133+
IMAGE="{{.DOCKER_NAME}}:{{.VERSION_FULL}}{{.VERSION_SUFFIX}}" \
134+
CONFIG="tests/docker/local-image.yml" \
135+
DRIVER=docker \
136+
OUTPUT=text
137+
54138
docker:build:inspect:
55139
desc: Inspect built Docker image
56140
cmds:

Taskfile.variables.yml

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ env:
77
TERM: xterm-256color
88

99
vars:
10-
# System context
1110
SED:
1211
sh: |
1312
if [ "$(uname -s)" = "Darwin" ]; then
@@ -30,8 +29,6 @@ vars:
3029
fi
3130
PROJECT_DIR_NAME:
3231
sh: basename "$PWD"
33-
34-
# Container metadata
3532
DOCKER_IMAGE: '{{.DOCKER_IMAGE | default .PROJECT_DIR_NAME}}'
3633
GITHUB_REPO: '{{.GITHUB_REPO | default .PROJECT_DIR_NAME}}'
3734
DOCKER_ORG_NAME: '{{.DOCKER_ORG_NAME | default "devopsinfra"}}'
@@ -63,8 +60,6 @@ vars:
6360
LABEL_HOMEPAGE: '{{.LABEL_HOMEPAGE | default "https://shyper.pro"}}'
6461
LABEL_VENDOR: '{{.LABEL_VENDOR | default "DevOps-Infra"}}'
6562
LABEL_LICENSE: '{{.LABEL_LICENSE | default "MIT"}}'
66-
67-
# Build context
6863
CONTEXT: '{{.CONTEXT | default "."}}'
6964
DOCKERFILE: '{{.DOCKERFILE | default "Dockerfile"}}'
7065
PLATFORMS: '{{.PLATFORMS | default "linux/amd64,linux/arm64"}}'
@@ -120,8 +115,6 @@ vars:
120115
sh: echo "{{.VERSION_FROM_ACTION_YML}}" | awk -F\. '{print $1}'
121116
MINOR_FROM_ACTION_YML:
122117
sh: echo "{{.VERSION_FROM_ACTION_YML}}" | awk -F\. '{print $1"."$2}'
123-
124-
# Git metadata
125118
GIT_SHA:
126119
sh: git rev-parse HEAD 2>/dev/null || echo 0000000000000000000000000000000000000000
127120
GIT_SHORT_SHA:
@@ -133,7 +126,6 @@ vars:
133126
else
134127
git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown"
135128
fi
136-
137129
# Labels for http://label-schema.org/rc1/#build-time-labels
138130
# And for https://github.com/opencontainers/image-spec/blob/master/annotations.md
139131
ANNOTATIONS: >-

Taskfile.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ includes:
1414
taskfile: ./Taskfile.docker.yml
1515
flatten: true
1616

17-
1817
tasks:
1918
default:
2019
desc: List tasks

tests/docker/local-image.yml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
schemaVersion: 2.0.0
2+
3+
commandTests:
4+
- name: OS version check
5+
command: cat
6+
args: [/etc/os-release]
7+
expectedOutput: [VERSION_ID="25\.10"]
8+
9+
- name: Required tools installed
10+
command: bash
11+
args:
12+
- -lc
13+
- command -v bash >/dev/null 2>&1 && command -v git >/dev/null 2>&1 && command -v git-lfs >/dev/null 2>&1
14+
15+
- name: Apt cache cleaned
16+
command: bash
17+
args:
18+
- -lc
19+
- test ! -d /var/lib/apt/lists || test -z "$(find /var/lib/apt/lists -mindepth 1 -maxdepth 1 2>/dev/null)"
20+
21+
- name: Temporary apt artifacts removed
22+
command: bash
23+
args:
24+
- -lc
25+
- test ! -e /git-lfs*.deb
26+
fileExistenceTests:
27+
- name: entrypoint exists
28+
path: /entrypoint.sh
29+
shouldExist: true
30+
permissions: -rwxr-xr-x
31+
32+
metadataTest:
33+
workdir: /github/workspace
34+
entrypoint: [/entrypoint.sh]

0 commit comments

Comments
 (0)