diff --git a/Dockerfile b/Dockerfile index 7a3cc1c..a1549df 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,7 @@ RUN wget -O /kaniko/jq \ wget -O /kaniko/reg \ https://github.com/genuinetools/reg/releases/download/v0.16.1/reg-linux-386 && \ chmod +x /kaniko/reg && \ - wget -O /crane.tar.gz \ + wget -O /crane.tar.gz \ https://github.com/google/go-containerregistry/releases/download/v0.8.0/go-containerregistry_Linux_x86_64.tar.gz && \ tar -xvzf /crane.tar.gz crane -C /kaniko && \ rm /crane.tar.gz diff --git a/action.yml b/action.yml index cb313e3..e58b724 100644 --- a/action.yml +++ b/action.yml @@ -21,8 +21,8 @@ inputs: image: description: "Image name" required: true - tag: - description: "Image tag" + tags: + description: "List of Image tags" required: false cache: description: "Enables build cache" diff --git a/entrypoint.sh b/entrypoint.sh index d12889d..63a4d92 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -7,13 +7,12 @@ fi export REGISTRY=${INPUT_REGISTRY:-"docker.io"} export IMAGE=${INPUT_IMAGE} export BRANCH=$(echo ${GITHUB_REF} | sed -E "s/refs\/(heads|tags)\///g" | sed -e "s/\//-/g") -export TAG=${INPUT_TAG:-$([ "$BRANCH" == "master" ] && echo latest || echo $BRANCH)} -export TAG=${TAG:-"latest"} -export TAG=${TAG#$INPUT_STRIP_TAG_PREFIX} +export TAGS=${INPUT_TAGS:-$([ "$BRANCH" == "master" ] && echo latest || echo $BRANCH)} +export TAGS=${TAGS:-"latest"} +export TAGS=${TAGS#$INPUT_STRIP_TAG_PREFIX} export USERNAME=${INPUT_USERNAME:-$GITHUB_ACTOR} export PASSWORD=${INPUT_PASSWORD:-$GITHUB_TOKEN} export REPOSITORY=$IMAGE -export IMAGE=$IMAGE:$TAG export CONTEXT_PATH=${INPUT_PATH} if [[ "$INPUT_TAG_WITH_LATEST" == "true" ]]; then @@ -31,52 +30,10 @@ ensure "${REGISTRY}" "registry" ensure "${USERNAME}" "username" ensure "${PASSWORD}" "password" ensure "${IMAGE}" "image" -ensure "${TAG}" "tag" +ensure "${TAGS}" "tags" ensure "${CONTEXT_PATH}" "path" -if [ "$REGISTRY" == "ghcr.io" ]; then - IMAGE_NAMESPACE="$(echo $GITHUB_REPOSITORY | tr '[:upper:]' '[:lower:]')" - export IMAGE="$IMAGE_NAMESPACE/$IMAGE" - export REPOSITORY="$IMAGE_NAMESPACE/$REPOSITORY" - - if [ ! -z $IMAGE_LATEST ]; then - export IMAGE_LATEST="$IMAGE_NAMESPACE/$IMAGE_LATEST" - fi - - if [ ! -z $INPUT_CACHE_REGISTRY ]; then - export INPUT_CACHE_REGISTRY="$REGISTRY/$IMAGE_NAMESPACE/$INPUT_CACHE_REGISTRY" - fi -fi - -if [ "$REGISTRY" == "docker.io" ]; then - export REGISTRY="index.${REGISTRY}/v1/" -else - export IMAGE="$REGISTRY/$IMAGE" - - if [ ! -z $IMAGE_LATEST ]; then - export IMAGE_LATEST="$REGISTRY/$IMAGE_LATEST" - fi -fi - -export CACHE=${INPUT_CACHE:+"--cache=true"} -export CACHE=$CACHE${INPUT_CACHE_TTL:+" --cache-ttl=$INPUT_CACHE_TTL"} -export CACHE=$CACHE${INPUT_CACHE_REGISTRY:+" --cache-repo=$INPUT_CACHE_REGISTRY"} -export CACHE=$CACHE${INPUT_CACHE_DIRECTORY:+" --cache-dir=$INPUT_CACHE_DIRECTORY"} -export CONTEXT="--context $GITHUB_WORKSPACE/$CONTEXT_PATH" -export DOCKERFILE="--dockerfile $CONTEXT_PATH/${INPUT_BUILD_FILE:-Dockerfile}" -export TARGET=${INPUT_TARGET:+"--target=$INPUT_TARGET"} - -if [ ! -z $INPUT_SKIP_UNCHANGED_DIGEST ]; then - export DESTINATION="--digest-file digest --no-push --tarPath image.tar --destination $IMAGE" -else - export DESTINATION="--destination $IMAGE" - if [ ! -z $IMAGE_LATEST ]; then - export DESTINATION="$DESTINATION --destination $IMAGE_LATEST" - fi -fi - -export ARGS="$CACHE $CONTEXT $DOCKERFILE $TARGET $DESTINATION $INPUT_EXTRA_ARGS" - +# Set credentials here cat </kaniko/.docker/config.json { "auths": { @@ -88,6 +45,59 @@ cat </kaniko/.docker/config.json } EOF +tags=$(echo $TAGS | tr "," "\n") + +for tag in $tags; do + + export TAGGED_IMAGE=$IMAGE:$tag + + if [ "$REGISTRY" == "ghcr.io" ]; then + IMAGE_NAMESPACE="$(echo $GITHUB_REPOSITORY | tr '[:upper:]' '[:lower:]')" + export TAGGED_IMAGE="$IMAGE_NAMESPACE/$IMAGE" + export REPOSITORY="$IMAGE_NAMESPACE/$REPOSITORY" + + if [ ! -z $IMAGE_LATEST ]; then + export IMAGE_LATEST="$IMAGE_NAMESPACE/$IMAGE_LATEST" + fi + + if [ ! -z $INPUT_CACHE_REGISTRY ]; then + export INPUT_CACHE_REGISTRY="$REGISTRY/$IMAGE_NAMESPACE/$INPUT_CACHE_REGISTRY" + fi + fi + + if [ "$REGISTRY" == "docker.io" ]; then + export REGISTRY="index.${REGISTRY}/v1/" + else + export TAGGED_IMAGE="$REGISTRY/$TAGGED_IMAGE" + + if [ ! -z $IMAGE_LATEST ]; then + export IMAGE_LATEST="$REGISTRY/$IMAGE_LATEST" + fi + fi + + export DESTINATIONS="$DESTINATIONS --destination $TAGGED_IMAGE" + +done + +export CACHE=${INPUT_CACHE:+"--cache=true"} +export CACHE=$CACHE${INPUT_CACHE_TTL:+" --cache-ttl=$INPUT_CACHE_TTL"} +export CACHE=$CACHE${INPUT_CACHE_REGISTRY:+" --cache-repo=$INPUT_CACHE_REGISTRY"} +export CACHE=$CACHE${INPUT_CACHE_DIRECTORY:+" --cache-dir=$INPUT_CACHE_DIRECTORY"} +export CONTEXT="--context $GITHUB_WORKSPACE/$CONTEXT_PATH" +export DOCKERFILE="--dockerfile $CONTEXT_PATH/${INPUT_BUILD_FILE:-Dockerfile}" +export TARGET=${INPUT_TARGET:+"--target=$INPUT_TARGET"} + +if [ ! -z $INPUT_SKIP_UNCHANGED_DIGEST ]; then + export DESTINATION="--digest-file digest --no-push --tarPath image.tar $DESTINATIONS" +else + export DESTINATION=$DESTINATIONS + if [ ! -z $IMAGE_LATEST ]; then + export DESTINATION="$DESTINATIONS --destination $IMAGE_LATEST" + fi +fi + +export ARGS="$CACHE $CONTEXT $DOCKERFILE $TARGET $DESTINATION $INPUT_EXTRA_ARGS" + # https://github.com/GoogleContainerTools/kaniko/issues/1349 /kaniko/executor --reproducible --force $ARGS @@ -105,13 +115,13 @@ if [ ! -z $INPUT_SKIP_UNCHANGED_DIGEST ]; then fi echo "Pushing image..." - - /kaniko/crane push image.tar $IMAGE + + /kaniko/crane push image.tar $TAGGED_IMAGE if [ ! -z $IMAGE_LATEST ]; then echo "Tagging latest..." - /kaniko/crane tag $IMAGE latest + /kaniko/crane tag $IMAGE latest fi - + echo "Done 🎉️" fi