From 600701364a8eb1b2fd2a60b81d971d0c390ca83d Mon Sep 17 00:00:00 2001
From: Sheogorath <sheogorath@shivering-isles.com>
Date: Sat, 28 Oct 2023 15:05:01 +0200
Subject: [PATCH] feat(cowsay): Add distroless cowsay image

---
 images/.utils/gitlab-ci.yaml |  1 +
 images/cowsay/.release       |  1 +
 images/cowsay/Earthfile      | 65 ++++++++++++++++++++++++++++++++++++
 images/cowsay/static.patch   | 19 +++++++++++
 images/mirror/Earthfile      |  3 ++
 5 files changed, 89 insertions(+)
 create mode 100644 images/cowsay/.release
 create mode 100644 images/cowsay/Earthfile
 create mode 100644 images/cowsay/static.patch

diff --git a/images/.utils/gitlab-ci.yaml b/images/.utils/gitlab-ci.yaml
index a0d2cfd48..31f039ea4 100644
--- a/images/.utils/gitlab-ci.yaml
+++ b/images/.utils/gitlab-ci.yaml
@@ -14,6 +14,7 @@ container-build:
           - query-exposer
           - findmydevice-server
           - opentf
+          - cowsay
   script:
     - cd images/${IMAGE}
     - |
diff --git a/images/cowsay/.release b/images/cowsay/.release
new file mode 100644
index 000000000..fb32648f8
--- /dev/null
+++ b/images/cowsay/.release
@@ -0,0 +1 @@
+release=3.7.0
\ No newline at end of file
diff --git a/images/cowsay/Earthfile b/images/cowsay/Earthfile
new file mode 100644
index 000000000..c6035ecc6
--- /dev/null
+++ b/images/cowsay/Earthfile
@@ -0,0 +1,65 @@
+VERSION 0.7
+
+build-base:
+    FROM docker.io/library/debian:12.2
+
+    RUN apt-get update
+    RUN apt-get install -y \
+            build-essential \
+            perl-base \
+            perl-tk \
+            libperl-dev \
+            libpar-perl
+    RUN cpan PAR::Packer
+    SAVE ARTIFACT /lib/x86_64-linux-gnu/libcrypt.so.1 ./lib/libcrypt.so.1
+    SAVE ARTIFACT /lib/x86_64-linux-gnu/libz.so.1 ./lib/libz.so.1
+
+distroless-perl:
+    FROM ../mirror+distroless-base
+    WORKDIR /lib/x86_64-linux-gnu
+    COPY +build-base/lib/libcrypt.so.1 ./libcrypt.so.1
+    COPY +build-base/lib/libz.so.1 ./libz.so.1
+    WORKDIR /
+
+
+src:
+    FROM +build-base
+    # renovate: datasource=github-releases depName=cowsay-org/cowsay
+    ARG COWSAY_VERSION=v3.7.0
+    GIT CLONE --branch ${COWSAY_VERSION} https://github.com/cowsay-org/cowsay.git ./cowsay
+    #RUN git apply static.patch
+    COPY ./static.patch static.patch
+    RUN patch -u ./cowsay/cowsay -i static.patch
+    SAVE ARTIFACT ./cowsay ./cowsay
+
+build:
+    FROM +build-base
+    COPY +src/cowsay /src
+    WORKDIR /src
+    RUN make install
+    WORKDIR /
+    RUN pp -x --xargs="Building!" -a "/usr/local/share/cowsay/cows;script/share/cows" --output=cowsay.bin "/usr/local/bin/cowsay"
+    RUN ./cowsay.bin "Great Success!"
+    SAVE ARTIFACT /cowsay.bin ./cowsay
+
+container-internal:
+    FROM +distroless-perl
+    COPY +build/cowsay /cowsay
+
+    WORKDIR /workdir
+    ENTRYPOINT [ "/cowsay" ]
+
+container:
+    FROM ../mirror+golang
+    ARG registry=quay.io/shivering-isles/cowsay
+    COPY .release ./
+    ARG tag=$(awk -F'=' '$1 == "release" {print $2}' .release)
+    ARG latest=false
+    IF [ $latest = "true" ]
+        FROM +container-internal --branch=v$(awk -F'=' '$1 == "release" {print $2}' .release)
+        SAVE IMAGE --push ${registry}:latest
+    ELSE
+        FROM +container-internal --branch=v$(awk -F'=' '$1 == "release" {print $2}' .release)
+        LABEL "quay.expires-after"="12w"
+    END
+    SAVE IMAGE --push ${registry}:${tag}
\ No newline at end of file
diff --git a/images/cowsay/static.patch b/images/cowsay/static.patch
new file mode 100644
index 000000000..6ba98382f
--- /dev/null
+++ b/images/cowsay/static.patch
@@ -0,0 +1,19 @@
+diff --git a/cowsay b/cowsay
+index 3f75c5c..2c7aeaa 100755
+--- a/cowsay
++++ b/cowsay
+@@ -87,6 +87,13 @@ sub pick_cowpath {
+         $prefix_dir = dirname($parent_dir);
+         $share_cowsay = "$prefix_dir/share/cowsay";
+         $real_prefix_dir = $prefix_dir;
++    } elsif (defined $ENV{PAR_TEMP}) {
++        # We're running as static compiled cowsay using pp
++        $prefix_dir = "$ENV{PAR_TEMP}/inc/$parent_dir";
++        $share_cowsay = "$prefix_dir/share";
++        # Default to default installation location, so in-repo cowsay can still see the
++        # system cowpath.d directory.
++        $real_prefix_dir = "/usr/local";
+     } else {
+         # We're running from the source repo
+         $prefix_dir = $parent_dir;
+
diff --git a/images/mirror/Earthfile b/images/mirror/Earthfile
index b6e2eb162..b126b7870 100644
--- a/images/mirror/Earthfile
+++ b/images/mirror/Earthfile
@@ -7,6 +7,9 @@ MIRROR:
     DO ../.utils/+LABEL --image=mirror --version=main
     SAVE IMAGE --cache-hint
 
+distroless-base:
+    DO +MIRROR --image=gcr.io/distroless/base-debian12:nonroot@sha256:5a779e9c2635dbea68ae7988f398f95686ccde186cd2abf51207e41ed2ec51f4
+
 distroless-static-debug:
     DO +MIRROR --image=gcr.io/distroless/static:debug-nonroot@sha256:cdb2034c38b2f2bd0a99f08191a44831a04220c81aab97b2397d2ecf1082db5f
 
-- 
GitLab