56 Commits
v1 ... v1.1

Author SHA1 Message Date
8e833a04b5 fix: conflict
All checks were successful
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/tag/build-dev Pipeline was successful
ci/woodpecker/tag/build Pipeline was successful
ci/woodpecker/cron/build Pipeline was successful
2023-03-23 22:38:44 +01:00
10e171369c fix: confict
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
2023-03-23 22:31:10 +01:00
1ba91a85c7 Update 'README.md'
All checks were successful
ci/woodpecker/pr/build Pipeline was successful
2023-03-23 22:17:43 +01:00
f00364177f Update 'check.sh'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-23 22:04:04 +01:00
79ef9a5d2d Update 'Dockerfile'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-23 20:46:27 +01:00
a7ee8446cb Update 'check.sh'
[skip ci]
2023-03-23 20:44:41 +01:00
bbb9cb8d3d Update 'check.sh'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-23 20:21:03 +01:00
3b21bb2447 Update 'check.sh'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-23 20:13:19 +01:00
fe4be4dd25 Update 'check.sh'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-23 20:04:39 +01:00
d63050c1c5 Update 'check.sh'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
fixed errors using shellcheck
https://www.shellcheck.net
2023-03-23 19:57:24 +01:00
33c30e47d7 Update 'check.sh'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-23 19:36:35 +01:00
8345924a36 wip
[skip ci]
2023-03-21 12:51:05 +01:00
2fa59436a2 Update 'check.sh'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-21 10:50:25 +01:00
4daf73bcb8 Update '.woodpecker/build-dev.yml'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-20 20:58:41 +01:00
bd48217553 Update '.woodpecker/build-dev.yml'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-20 20:58:01 +01:00
4f68eb9cd8 Update '.woodpecker/build-dev.yml'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-20 20:56:21 +01:00
e0159d3c55 Update '.woodpecker/build-dev.yml'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-20 20:43:01 +01:00
1494376085 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 20:42:27 +01:00
94a301bdb2 Update '.woodpecker/build-dev.yml'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-20 20:36:32 +01:00
5b04672447 Update '.woodpecker/build-dev.yml'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-20 20:13:21 +01:00
dd3e15f046 Update '.woodpecker/build-dev.yml'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-20 20:02:24 +01:00
6dd9032f10 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 19:55:11 +01:00
d6da5c8df6 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 19:53:42 +01:00
8ea218fb69 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 19:52:25 +01:00
257808f9f6 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 19:50:23 +01:00
a8d18c5ea7 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 19:46:53 +01:00
de33b00708 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 19:45:52 +01:00
629627c932 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 19:43:52 +01:00
38c5ff32db Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 19:43:14 +01:00
312fa12d04 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 19:21:52 +01:00
88132ab9a5 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 19:20:51 +01:00
d722c1f28f Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 19:18:57 +01:00
8c565255d8 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 19:15:02 +01:00
25da569881 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 19:14:01 +01:00
b1acc80b72 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 19:12:14 +01:00
711c8c3215 Update '.woodpecker/build-dev.yml'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-20 19:11:11 +01:00
468560068c Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 19:09:03 +01:00
5cd265f7b9 Update '.woodpecker/build-dev.yml'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-20 19:04:26 +01:00
17bad16719 Update '.woodpecker/build-dev.yml'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-20 15:40:46 +01:00
0daa6da70f Update '.woodpecker/build-dev.yml'
All checks were successful
ci/woodpecker/push/build-dev Pipeline was successful
2023-03-20 15:32:56 +01:00
2417ee8687 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 15:28:41 +01:00
bdf803c1f6 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 15:20:38 +01:00
f77e33e8b0 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 15:18:17 +01:00
a65d010e73 Update '.woodpecker/build-dev.yml' 2023-03-20 15:17:24 +01:00
ca677224c2 Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 15:15:07 +01:00
a9e328e00c Update '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 15:12:33 +01:00
42dacd7a2a Add '.woodpecker/build-dev.yml'
Some checks failed
ci/woodpecker/push/build-dev Pipeline failed
2023-03-20 15:10:52 +01:00
859ea03824 Update '.woodpecker/build.yml' 2023-03-20 15:04:12 +01:00
e1590f94d4 wip
[skip ci]
2023-03-20 14:15:14 +01:00
9d2e763cbe Update 'README.md'
Some checks failed
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/cron/build Pipeline failed
ci/woodpecker/pr/build Pipeline was successful
2023-03-12 12:41:11 +01:00
884ebcd21e Update 'README.md'
All checks were successful
ci/woodpecker/push/build Pipeline was successful
2023-03-12 12:38:15 +01:00
3823ddf8a6 Update '.woodpecker/build.yml'
Some checks failed
ci/woodpecker/push/build Pipeline failed
ci/woodpecker/pr/build Pipeline was successful
2023-03-12 11:48:37 +01:00
7c01b16e88 Update 'check.sh'
[CI SKIP]
2023-03-12 11:32:18 +01:00
07925fd895 Update 'check.sh'
All checks were successful
ci/woodpecker/push/build Pipeline was successful
2023-03-12 11:28:49 +01:00
9dde049945 Update '.woodpecker/build.yml'
All checks were successful
ci/woodpecker/push/build Pipeline was successful
2023-03-12 11:16:15 +01:00
74800fee55 add default tag
Some checks failed
ci/woodpecker/push/build Pipeline failed
2023-03-12 11:11:48 +01:00
5 changed files with 162 additions and 22 deletions

24
.woodpecker/build-dev.yml Normal file
View File

@@ -0,0 +1,24 @@
when:
branch: dev
path:
include: [ '.woodpecker/build-dev.yml', 'Dockerfile', 'check.sh' ]
pipeline:
build_and_publish_gitea:
image: woodpeckerci/plugin-docker-buildx
registry: git.narvas.tech
settings:
repo: vistanarvas/container-update-checker,git.narvas.tech/vista/container-update-checker
tag: dev
auto_tag: false
logins:
# Default DockerHub login
- registry: https://index.docker.io/v1/
username: vistanarvas
password:
from_secret: DOCKERHUB_TOKEN
# Additional Gitea login
- registry: https://git.narvas.tech
username: vista
password:
from_secret: GITEA_TOKEN

View File

@@ -1,3 +1,6 @@
when:
branch: master
pipeline:
check_self:
# failure: ignore # this doesnt work

View File

@@ -1,6 +1,6 @@
FROM alpine:latest
RUN apk add curl jq
RUN apk add --no-cache curl jq dateutils
COPY check.sh /usr/local/bin/check
RUN chmod +x /usr/local/bin/check

View File

@@ -1,4 +1,31 @@
# container-update-checker
[![status-badge](https://woodpecker.narvas.tech/api/badges/vista/container-update-checker/status.svg)](https://woodpecker.narvas.tech/vista/container-update-checker)
check if a container needs rebuilding
[![status-badge](https://woodpecker.narvas.tech/api/badges/vista/container-update-checker/status.svg)](https://woodpecker.narvas.tech/vista/container-update-checker)
## Environment variables
| Name | Comment
|-------------------|-----------
| BASE | the image the Dockerfile is based on
| TARGET | the image thats based of `BASE`
| REGISTRY_USERNAME | the username for logging in into the registry<br>this is only requered of private repos
| REGISTRY_PASSWORD | the password for logging in into the registry<br>(*you probaly want to use a token here*)
| REGISTRY_API | the type of registry valid options are `docker` and `gitea`<br>Default: `docker`
| REGISTRY_URL | the url to the registry<br>Default: `https://hub.docker.com`
| BASE_REGISTRY_USERNAME | if left empty `REGISTRY_USERNAME` is used
| BASE_REGISTRY_PASSWORD | if left empty `REGISTRY_PASSWORD` is used
| BASE_REGISTRY_API | if left empty `REGISTRY_API` is used
| BASE_REGISTRY_URL | if left empty `REGISTRY_URL` is used
| TARGET_REGISTRY_USERNAME | if left empty `REGISTRY_USERNAME` is used
| TARGET_REGISTRY_PASSWORD | if left empty `REGISTRY_PASSWORD` is used
| TARGET_REGISTRY_API | if left empty `REGISTRY_API` is used
| TARGET_REGISTRY_URL | if left empty `REGISTRY_URL` is used
## Exit codes
| State | Exit code | Comment
|-------------------------------------|-----------|--------
| `BASE` is more recent than `TARGET` | 0 | An update is needed
| `TARGET` is more recent than `BASE` | 1 | No update is needed<br>(*the pipeline wil "fail" but that is wat we want* )
| An error occured | 0 | So the pipeline can continue

126
check.sh
View File

@@ -23,42 +23,128 @@ if [ -z "${TARGET}" ]; then
exit 1
fi
if [ -z "${REGISTRY_USERNAME}" ] && [ -n "${DOCKER_USERNAME}" ]; then
REGISTRY_USERNAME="${DOCKER_USERNAME}"
echo "WARNING: DOCKER_USERNAME is deprecated and will be removed in the next version"
echo "you should switch to using REGISTRY_USERNAME"
echo "see the documentation for more info https://git.narvas.tech/vista/container-update-checker"
fi
# add "library/" if its a "official" docker image (it has no username)
if [ -z "${REGISTRY_PASSWORD}" ] && [ -n "${DOCKER_PASSWORD}" ]; then
REGISTRY_PASSWORD="${DOCKER_PASSWORD}"
echo "WARNING: DOCKER_PASSWORD is deprecated and will be removed in the next version"
echo "you should switch to using REGISTRY_PASSWORD"
echo "see the documentation for more info https://git.narvas.tech/vista/container-update-checker"
fi
if [ -z "${BASE_REGISTRY_USERNAME}" ] && [ -n "${REGISTRY_USERNAME}" ]; then
BASE_REGISTRY_USERNAME="${REPO_USERNAME}"
fi
if [ -z "${BASE_REGISTRY_PASSWORD}" ] && [ -n "${REGISTRY_PASSWORD}" ]; then
BASE_REGISTRY_PASSWORD="${REPO_PASSWORD}"
fi
if [ -z "${TARGET_REGISTRY_USERNAME}" ] && [ -n "${REGISTRY_USERNAME}" ]; then
TARGET_REGISTRY_USERNAME="${REPO_USERNAME}"
fi
if [ -z "${TARGET_REGISTRY_PASSWORD}" ] && [ -n "${REGISTRY_PASSWORD}" ]; then
TARGET_REGISTRY_PASSWORD="${REPO_PASSWORD}"
fi
if [ -z "${REGISTRY_API}" ]; then
REGISTRY_API='docker'
fi
if [ -z "${BASE_REGISTRY_API}" ]; then
BASE_REGISTRY_API="${REGISTRY_API}"
fi
if [ -z "${TARGET_REGISTRY_API}" ]; then
TARGET_REGISTRY_API="${REGISTRY_API}"
fi
if [ -z "${REGISTRY_URL}" ]; then
REGISTRY_URL="https://hub.docker.com"
fi
if [ -z "${BASE_REGISTRY_URL}" ]; then
BASE_REGISTRY_URL="${REGISTRY_URL}"
fi
if [ -z "${TARGET_REGISTRY_URL}" ]; then
TARGET_REGISTRY_URL="${REGISTRY_URL}"
fi
# remove trailing /
BASE_REGISTRY_URL="${BASE_REGISTRY_URL%/}"
TARGET_REGISTRY_URL="${TARGET_REGISTRY_URL%/}"
# add "library/" if its a "official" docker image (no username is provided)
echo "${BASE}" | grep -q "/" || BASE="library/${BASE}"
echo "${TARGET}" | grep -q "/" || TARGET="library/${TARGET}"
# if no tag is give default to latest
# if no tag is given default to latest
echo "${BASE}" | grep -q ":" || BASE="${BASE}:latest"
echo "${TARGET}" | grep -q ":" || TARGET="${TARGET}:latest"
# split repo into user reponame and tag
BASE_REPO_USER=$(echo "$BASE" | cut -d'/' -f1)
BASE_REPO_NAME=$(echo "$BASE" | cut -d'/' -f2 | cut -d':' -f1)
BASE_REPO_TAG=$(echo "$BASE" | cut -d':' -f2)
# move the tag to its own var and remove it from the repo name
BASE_TAG=$(echo "${BASE}" | sed 's/[^:]*://')
TARGET_TAG=$(echo "${TARGET}" | sed 's/[^:]*://')
TARGET_REPO_USER=$(echo "$TARGET" | cut -d'/' -f1)
TARGET_REPO_NAME=$(echo "$TARGET" | cut -d'/' -f2 | cut -d':' -f1)
TARGET_REPO_TAG=$(echo "$TARGET" | cut -d':' -f2)
BASE_REPO=$(echo "${BASE}" | sed 's/:.*//')
TARGET_REPO=$(echo "${TARGET}" | sed 's/:.*//')
BASE_HEADER=""
if [ "${BASE_REGISTRY_API}" = 'docker' ];then
if [ -n "${BASE_REGISTRY_USERNAME}" ] && [ -n "${BASE_REGISTRY_PASSWORD}" ]; then
TOKEN=$(curl -s -H "Content-Type: application/json" -X POST -d "{\"username\": \"${BASE_REGISTRY_USERNAME}\", \"password\": \"${BASE_REGISTRY_PASSWORD}\"}" "${BASE_REGISTRY_URL}/users/login/" | jq -r .token)
BASE_HEADER="Authorization: JWT ${TOKEN}"
fi
BASE_URL="${BASE_REGISTRY_URL}/v2/repositories/${BASE_REPO_USER}/${BASE_REPO_NAME}/tags/${BASE_REPO_TAG}"
elif [ "${BASE_REGISTRY_API}" = 'gitea' ];then
if [ -n "${BASE_REGISTRY_PASSWORD}" ]; then
BASE_HEADER="Authorization: token ${BASE_REGISTRY_PASSWORD}"
fi
BASE_URL="${BASE_REGISTRY_URL}/api/v1/packages/${BASE_REPO_USER}/container/${BASE_REPO_NAME}/${BASE_REPO_TAG}"
fi
# build the url to the repo
BASE_URL="https://hub.docker.com/v2/repositories/${BASE_REPO}/tags/${BASE_TAG}"
TARGET_URL="https://hub.docker.com/v2/repositories/${TARGET_REPO}/tags/${TARGET_TAG}"
TARGET_HEADER=""
if [ "${TARGET_REGISTRY_API}" = 'docker' ];then
if [ -n "${TARGET_REGISTRY_USERNAME}" ] && [ -n "${TARGET_REGISTRY_PASSWORD}" ]; then
TOKEN=$(curl -s -H "Content-Type: application/json" -X POST -d "{\"username\": \"${TARGET_REGISTRY_USERNAME}\", \"password\": \"${TARGET_REGISTRY_PASSWORD}\"}" "${TARGET_REGISTRY_URL}/users/login/" | jq -r .token)
TARGET_HEADER="Authorization: JWT ${TOKEN}"
fi
TARGET_URL="${TARGET_REGISTRY_URL}/v2/repositories/${TARGET_REPO_USER}/${TARGET_REPO_NAME}/tags/${TARGET_REPO_TAG}"
# login if credentias are passed
HEADER=""
if [ -n "${DOCKER_USERNAME}" ] && [ -n "${DOCKER_PASSWORD}" ]; then
TOKEN=$(curl -s -H "Content-Type: application/json" -X POST -d '{"username": "'"${DOCKER_USERNAME}"'", "password": "'"${DOCKER_PASSWORD}"'"}' https://hub.docker.com/v2/users/login/ | jq -r .token)
HEADER="Authorization: JWT ${TOKEN}"
elif [ "${TARGET_REGISTRY_API}" = 'gitea' ];then
if [ -n "${TARGET_REGISTRY_PASSWORD}" ]; then
TARGET_HEADER="Authorization: token ${TARGET_REGISTRY_PASSWORD}"
fi
TARGET_URL="${TARGET_REGISTRY_URL}/api/v1/packages/${TARGET_REPO_USER}/container/${TARGET_REPO_NAME}/${TARGET_REPO_TAG}"
fi
# compare the update time of the BASE and TARGET images
BASE_DATE=$(curl -s -H "${HEADER}" "${BASE_URL}" | jq -r .last_updated | sed 's/T/ /' | sed 's/\..*//' )
TARGET_DATE=$(curl -s -H "${HEADER}" "${TARGET_URL}" | jq -r .last_updated | sed 's/T/ /' | sed 's/\..*//' )
if [ "${BASE_REGISTRY_API}" = 'docker' ];then
BASE_DATE=$(curl -s -H "${BASE_HEADER}" "${BASE_URL}" | jq -r .last_updated)
elif [ "${BASE_REGISTRY_API}" = 'gitea' ];then
BASE_DATE=$(curl -s -H "${BASE_HEADER}" "${BASE_URL}" | jq -r .created_at)
fi
BASE_TIMESTAMP=$(date -d "${BASE_DATE}" +%s)
TARGET_TIMESTAMP=$(date -d "${TARGET_DATE}" +%s)
if [ "${TARGET_REGISTRY_API}" = 'docker' ];then
TARGET_DATE=$(curl -s -H "${TARGET_HEADER}" "${TARGET_URL}" | jq -r .last_updated)
elif [ "${TARGET_REGISTRY_API}" = 'gitea' ];then
TARGET_DATE=$(curl -s -H "${TARGET_HEADER}" "${TARGET_URL}" | jq -r .created_at)
fi
BASE_TIMESTAMP=$(dateconv --format="%s" "${BASE_DATE}")
TARGET_TIMESTAMP=$(dateconv --format="%s" "${TARGET_DATE}")
CLEAN_EXIT=true
@@ -68,4 +154,4 @@ if [ "$BASE_TIMESTAMP" -le "$TARGET_TIMESTAMP" ]; then
fi
echo "$TARGET needs updating"
exit 0
exit 0