Skip to content

Commit 17b73c9

Browse files
committed
Add Image-Triggers support
1 parent 86ad917 commit 17b73c9

File tree

5 files changed

+122
-0
lines changed

5 files changed

+122
-0
lines changed

Dockerfile

+20
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,26 @@ RUN set -x \
125125
&& rm -rf /tmp/k8s-sidecar \
126126
;
127127

128+
# Install Image Triggers
129+
ENV IMAGE_TRIGGERS_VERSION=0.0.4 \
130+
IMAGE_TRIGGERS_CHECKSUM_X86_64=d48257a84ca50a9d955a5e41ba954e68724ad0a6baf5ecf4fab8120262925efc \
131+
IMAGE_TRIGGERS_CHECKSUM_AARCH64=b242e58d4502e11542d64e5d4905c7f480a0444a3081b03ba9f3d6d7256ef298
132+
RUN set -x \
133+
&& if [ "$(uname -m)" = "x86_64" ] ; then \
134+
IMAGE_TRIGGERS_CHECKSUM="${IMAGE_TRIGGERS_CHECKSUM_X86_64}"; \
135+
ARCH="linux_amd64"; \
136+
elif [ "$(uname -m)" = "aarch64" ]; then \
137+
IMAGE_TRIGGERS_CHECKSUM="${IMAGE_TRIGGERS_CHECKSUM_AARCH64}"; \
138+
ARCH="linux_arm64"; \
139+
fi \
140+
&& wget --no-verbose https://github.com/panubo/image-triggers/releases/download/v${IMAGE_TRIGGERS_VERSION}/image-triggers_${IMAGE_TRIGGERS_VERSION}_${ARCH}.tar.gz -O /tmp/image-triggers.tar.gz \
141+
&& echo "${IMAGE_TRIGGERS_CHECKSUM} image-triggers.tar.gz" > /tmp/SHA256SUM \
142+
&& ( cd /tmp; sha256sum -c SHA256SUM || ( echo "Expected $(sha256sum image-triggers.tar.gz)"; exit 1; )) \
143+
&& tar -C /usr/local/bin -zxf /tmp/image-triggers.tar.gz \
144+
&& chmod +x /usr/local/bin/image-triggers \
145+
&& rm -f /tmp/image-triggers.tar.gz /tmp/SHA256SUM \
146+
;
147+
128148
# Download plugins
129149
COPY install-plugins.sh /
130150
RUN /install-plugins.sh

ansible-bootstrap/main.yml

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
vars:
77
- rundeck_tokens: []
8+
- rundeck_triggers_registry_rules: []
89

910
tasks:
1011
- include_tasks: scripts.yml

ansible-bootstrap/scripts.yml

+16
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,19 @@
2727
mode: "0700"
2828
owner: root
2929
group: root
30+
31+
- name: Write trigger_rundeck_job.sh
32+
template:
33+
dest: "/scripts/trigger_rundeck_job.sh"
34+
src: "templates/trigger_rundeck_job.sh.j2"
35+
mode: "0700"
36+
owner: root
37+
group: root
38+
39+
- name: Write trigger_registry_rules.sh
40+
template:
41+
dest: "/scripts/trigger_registry_rules.sh"
42+
src: "templates/trigger_registry_rules.sh.j2"
43+
mode: "0700"
44+
owner: root
45+
group: root
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/usr/bin/env bash
2+
#
3+
# LICENSE: MIT License, Copyright (C) 2020-2025 Volt Grid Pty Ltd
4+
#
5+
# This triggers Rundeck jobs in response to registry events. Acts as a
6+
# filter on which images/tags trigger a corresponding action.
7+
# This is used by image-triggers.
8+
9+
set -euo pipefail
10+
IFS=$'\n\t'
11+
12+
image_name="${1}"
13+
image_tag="${2}"
14+
15+
rundeck() {
16+
echo ">> Running: trigger_rundeck_job.sh ${@}"
17+
/scripts/trigger_rundeck_job.sh "${@}"
18+
}
19+
20+
{% for rule in rundeck_triggers_registry_rules %}
21+
{% if loop.first %}if{% else %}elif{% endif %} [[ "${image_name}" =~ {{ rule.rule.name }} ]] && [[ "${image_tag}" =~ {{ rule.rule.tag }} ]]; then
22+
{% for action in rule.actions %}
23+
echo ">> Matched ${image_name}:${image_tag}"
24+
{{ action }}
25+
{% endfor %}
26+
{% endfor %}
27+
else
28+
echo ">> No matching rules for ${image_name}:${image_tag}"
29+
fi
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#!/usr/bin/env bash
2+
#
3+
# LICENSE: MIT License, Copyright (C) 2020-2025 Volt Grid Pty Ltd
4+
#
5+
# Triggers a Rundeck Job using the API
6+
# Used by image triggers to trigger a job in response to a registry event
7+
8+
set -euo pipefail
9+
IFS=$'\n\t'
10+
11+
echo ">> Running $(basename "$0")"
12+
13+
RD_TOKEN="{{ rundeck_token_configuresh }}"
14+
CONFIG_DIR="${CONFIG_DIR:-/config}"
15+
16+
project="${1}"
17+
job="${2}"
18+
shift 2
19+
20+
# wait_http URL [TIMEOUT] [HTTP TIMEOUT]
21+
wait_http() {
22+
# Wait for http service to be available
23+
command -v curl >/dev/null 2>&1 || { error "This function requires curl to be installed."; return 1; }
24+
local url="${1:-'http://localhost'}"
25+
local timeout="${2:-30}"
26+
local http_timeout="${3:-2}"
27+
echo -n "Connecting to HTTP at ${url}"
28+
for (( i=0;; i++ )); do
29+
if [[ "${i}" -eq "${timeout}" ]]; then
30+
echo " timeout!"
31+
return 99
32+
fi
33+
sleep 1
34+
(curl --max-time "${http_timeout}" "${url}") &>/dev/null && break
35+
echo -n "."
36+
done
37+
echo " connected."
38+
exec 3>&-
39+
exec 3<&-
40+
}
41+
42+
wait_http "${RD_URL}" 300
43+
44+
data=()
45+
46+
for item in "${@}"; do
47+
data+=("-d" "option.${item}")
48+
done
49+
50+
get_job_id() {
51+
curl "${RD_URL}/api/14/project/${project}/jobs?jobExactFilter=${job}" -H "Accept: application/json" -H "X-Rundeck-Auth-Token: ${RD_TOKEN}" -sSf | jq -r '.[0].id'
52+
}
53+
54+
curl -XPOST "${RD_URL}/api/18/job/$(get_job_id)/run" -H "Accept: application/json" -H "X-Rundeck-Auth-Token: ${RD_TOKEN}" -sSf "${data[@]}" | jq .
55+
56+
echo ">> Finished $(basename "$0")"

0 commit comments

Comments
 (0)