diff --git a/Makefile b/Makefile index fd22bd002..0c3590f8f 100644 --- a/Makefile +++ b/Makefile @@ -418,6 +418,9 @@ ecosystem-debian-bookworm-images: cd `pwd`/linux/ecosystem/epicmorg/debian/12-bookworm/slim && pwd && make build && make deploy cd `pwd`/linux/ecosystem/epicmorg/debian/12-bookworm/main && pwd && make build && make deploy cd `pwd`/linux/ecosystem/epicmorg/debian/12-bookworm/develop && pwd && make build && make deploy + make ecosystem-debian-bookworm-jdk-images + +ecosystem-debian-bookworm-jdk-images: cd `pwd`/linux/ecosystem/epicmorg/debian/12-bookworm/jdk6 && pwd && make build && make deploy cd `pwd`/linux/ecosystem/epicmorg/debian/12-bookworm/jdk7 && pwd && make build && make deploy cd `pwd`/linux/ecosystem/epicmorg/debian/12-bookworm/jdk8 && pwd && make build && make deploy diff --git a/linux/ecosystem/atlassian/bitbucket/8/8.19.6/Dockerfile b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/Dockerfile new file mode 100644 index 000000000..69335bafa --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/Dockerfile @@ -0,0 +1,46 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG BITBUCKET_VERSION=8.19.6 +ARG DOWNLOAD_URL=https://product-downloads.atlassian.com/software/stash/downloads/atlassian-bitbucket-${BITBUCKET_VERSION}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/BitbucketServer/Bitbucket+Server+home+directory +ENV BITBUCKET_HOME /var/atlassian/application-data/bitbucket +ENV BITBUCKET_INSTALL_DIR /opt/atlassian/bitbucket + +VOLUME ["${BITBUCKET_HOME}"] +WORKDIR $BITBUCKET_HOME + +# Expose HTTP and SSH ports +EXPOSE 7990 +EXPOSE 7999 + +################################################################## +# Installing +################################################################## +RUN apt-get update && \ + apt-get install -y --allow-downgrades git/bookworm + +RUN mkdir -p ${BITBUCKET_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "${BITBUCKET_INSTALL_DIR}" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${BITBUCKET_INSTALL_DIR}/ \ + && sed -i -e 's/^# umask/umask/' ${BITBUCKET_INSTALL_DIR}/bin/_start-webapp.sh && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] +COPY entrypoint.sh /entrypoint.sh diff --git a/linux/ecosystem/atlassian/bitbucket/8/8.19.6/Dockerfile.jdk11 b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/Dockerfile.jdk11 new file mode 100644 index 000000000..f322f3ce4 --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/Dockerfile.jdk11 @@ -0,0 +1,47 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG BITBUCKET_VERSION=8.19.6 +ARG DOWNLOAD_URL=https://product-downloads.atlassian.com/software/stash/downloads/atlassian-bitbucket-${BITBUCKET_VERSION}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/BitbucketServer/Bitbucket+Server+home+directory +ENV BITBUCKET_HOME /var/atlassian/application-data/bitbucket +ENV BITBUCKET_INSTALL_DIR /opt/atlassian/bitbucket + +VOLUME ["${BITBUCKET_HOME}"] +WORKDIR $BITBUCKET_HOME + +# Expose HTTP and SSH ports +EXPOSE 7990 +EXPOSE 7999 + +################################################################## +# Installing +################################################################## +RUN apt-get update && \ + apt-get install -y --allow-downgrades git/bookworm + +RUN mkdir -p ${BITBUCKET_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "${BITBUCKET_INSTALL_DIR}" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${BITBUCKET_INSTALL_DIR}/ \ + && sed -i -e 's/^# umask/umask/' ${BITBUCKET_INSTALL_DIR}/bin/_start-webapp.sh && \ + + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] +COPY entrypoint.sh /entrypoint.sh diff --git a/linux/ecosystem/atlassian/bitbucket/8/8.19.6/Dockerfile.jdk17 b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/Dockerfile.jdk17 new file mode 100644 index 000000000..76c9c0d45 --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/Dockerfile.jdk17 @@ -0,0 +1,46 @@ +FROM epicmorg/debian:bookworm-jdk17 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG BITBUCKET_VERSION=8.19.6 +ARG DOWNLOAD_URL=https://product-downloads.atlassian.com/software/stash/downloads/atlassian-bitbucket-${BITBUCKET_VERSION}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/BitbucketServer/Bitbucket+Server+home+directory +ENV BITBUCKET_HOME /var/atlassian/application-data/bitbucket +ENV BITBUCKET_INSTALL_DIR /opt/atlassian/bitbucket + +VOLUME ["${BITBUCKET_HOME}"] +WORKDIR $BITBUCKET_HOME + +# Expose HTTP and SSH ports +EXPOSE 7990 +EXPOSE 7999 + +################################################################## +# Installing +################################################################## +RUN apt-get update && \ + apt-get install -y --allow-downgrades git/bookworm + +RUN mkdir -p ${BITBUCKET_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "${BITBUCKET_INSTALL_DIR}" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${BITBUCKET_INSTALL_DIR}/ \ + && sed -i -e 's/^# umask/umask/' ${BITBUCKET_INSTALL_DIR}/bin/_start-webapp.sh && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] +COPY entrypoint.sh /entrypoint.sh diff --git a/linux/ecosystem/atlassian/bitbucket/8/8.19.6/Makefile b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/Makefile new file mode 100644 index 000000000..3383c9699 --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/Makefile @@ -0,0 +1,50 @@ +PIP_BREAK_SYSTEM_PACKAGES=1 + +all: app + +app: + make build + make deploy + make clean + +build: + make pip + python3 kaniko-build.py --version + +dry: + make dry-run + +test: + make dry-run + +dry-run: + python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run + +pip: + rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED + pip3 install -r requirements.txt + pip install -r requirements.txt + +build-compose: + docker-compose build --compress --parallel --progress plain + +deploy: + make pip + python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug + +deploy-compose: + docker-compose push + +clean: + docker container prune -f + docker image prune -f + docker network prune -f + docker volume prune -f + docker system prune -af diff --git a/linux/ecosystem/atlassian/bitbucket/8/8.19.6/README.md b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/README.md new file mode 100644 index 000000000..b60c42068 --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/README.md @@ -0,0 +1,216 @@ +![Atlassian Bitbucket Server](https://www.atlassian.com/dam/wac/legacy/bitbucket_logo_landing.png) + +Bitbucket Server is an on-premises source code management solution for Git that's secure, fast, and enterprise grade. Create and manage repositories, set up fine-grained permissions, and collaborate on code - all with the flexibility of your servers. + +Learn more about Bitbucket Server: + +# Overview + +This Docker container makes it easy to get an instance of Bitbucket up and running. + +** We strongly recommend you run this image using a specific version tag instead of latest. This is because the image referenced by the latest tag changes often and we cannot guarantee that it will be backwards compatible. ** + +# Quick Start + +For the `BITBUCKET_HOME` directory that is used to store the repository data +(amongst other things) we recommend mounting a host directory as a [data volume](https://docs.docker.com/engine/tutorials/dockervolumes/#/data-volumes), or via a named volume if using a docker version >= 1.9. + +Volume permission is managed by entry scripts. To get started you can use a data volume, or named volumes. In this example we'll use named volumes. + + $> docker volume create --name bitbucketVolume + $> docker run -v bitbucketVolume:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 atlassian/bitbucket-server + +Note that this command can substitute folder paths with named volumes. + +Start Atlassian Bitbucket Server: + + $> docker run -v /data/bitbucket:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 atlassian/bitbucket-server + +**Success**. Bitbucket is now available on [http://localhost:7990](http://localhost:7990)* + +Please ensure your container has the necessary resources allocated to it. +We recommend 2GiB of memory allocated to accommodate both the application server +and the git processes. +See [Supported Platforms](https://confluence.atlassian.com/display/BitbucketServer/Supported+platforms) for further information. + + +_* Note: If you are using `docker-machine` on Mac OS X, please use `open http://$(docker-machine ip default):7990` instead._ + +## Reverse Proxy Settings + +If Bitbucket is run behind a reverse proxy server as [described here](https://confluence.atlassian.com/bitbucketserver/proxying-and-securing-bitbucket-server-776640099.html), +then you need to specify extra options to make bitbucket aware of the setup. They can be controlled via the below +environment variables. + +### Bitbucket Server 5.0 + + +Due to the migration to Spring Boot in 5.0, there are changes to how you set up Bitbucket to run behind a reverse proxy. + +In this example, we'll use an environment file. You can also do this via [specifying each environment variable](https://docs.docker.com/engine/reference/run/#env-environment-variables) via the `-e` argument in `docker run`. + +#### secure-bitbucket.env +``` +SERVER_SECURE=true +SERVER_SCHEME=https +SERVER_PROXY_PORT=443 +SERVER_PROXY_NAME= +``` + +Then you run Bitbucket as usual + +`docker run -v bitbucketVolume:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 --env-file=/path/to/env/file/secure-bitbucket.env atlassian/bitbucket-server:5.0` + +### Bitbucket Server < 5.0 + +To set the reverse proxy arguments, you specify the following as environment variables in the `docker run` command + +* `CATALINA_CONNECTOR_PROXYNAME` (default: NONE) + + The reverse proxy's fully qualified hostname. + +* `CATALINA_CONNECTOR_PROXYPORT` (default: NONE) + + The reverse proxy's port number via which bitbucket is accessed. + +* `CATALINA_CONNECTOR_SCHEME` (default: http) + + The protocol via which bitbucket is accessed. + +* `CATALINA_CONNECTOR_SECURE` (default: false) + + Set 'true' if CATALINA\_CONNECTOR\_SCHEME is 'https'. + +## JVM Configuration (Bitbucket Server 5.0 + only) + +If you need to override Bitbucket Server's default memory configuration or pass additional JVM arguments, use the environment variables below + +* `JVM_MINIMUM_MEMORY` (default: 512m) + + The minimum heap size of the JVM + +* `JVM_MAXIMUM_MEMORY` (default: 1024m) + + The maximum heap size of the JVM + +* `JVM_SUPPORT_RECOMMENDED_ARGS` (default: NONE) + + Additional JVM arguments for Bitbucket Server, such as a custom Java Trust Store + +## Application Mode Settings (Bitbucket Server 5.0 + only) + +This docker image can be run as a [Smart Mirror](https://confluence.atlassian.com/bitbucketserver/smart-mirroring-776640046.html) or as part of a [Data Center](https://confluence.atlassian.com/enterprise/bitbucket-data-center-668468332.html) cluster. +You can specify the following properties to start Bitbucket as a mirror or as a Data Center node: + +* `ELASTICSEARCH_ENABLED` (default: true) + + Set 'false' to prevent Elasticsearch from starting in the container. This should be used if Elasticsearch is running remotely, e.g. for if Bitbucket is running in a Data Center cluster + +* `APPLICATION_MODE` (default: default) + + The mode Bitbucket will run in. This can be set to 'mirror' to start Bitbucket as a Smart Mirror. This will also disable Elasticsearch even if `ELASTICSEARCH_ENABLED` has not been set to 'false'. + +* `HAZELCAST_NETWORK_MULTICAST` (default: false) + + Data Center: Set 'true' to enable Bitbucket to find new Data Center cluster members via multicast. `HAZELCAST_NETWORK_TCPIP` should not be specified when using this setting. + +* `HAZELCAST_NETWORK_TCPIP` (default: false) + + Data Center: Set 'true' to enable Bitbucket to find new Data Center cluster members via TCPIP. This setting requires `HAZELCAST_NETWORK_TCPIP_MEMBERS` to be specified. `HAZELCAST_NETWORK_MULTICAST` should not be specified when using this setting. + +* `HAZELCAST_NETWORK_TCPIP_MEMBERS` + + Data Center: List of members that Hazelcast nodes should connect to when HAZELCAST_NETWORK_TCPIP is 'true' + +* `HAZELCAST_GROUP_NAME` + + Data Center: Specifies the cluster group the instance should join. + +* `HAZELCAST_GROUP_PASSWORD` + + Data Center: The password required to join the specified cluster group. + +To run Bitbucket as part of a Data Center cluster, create a Docker network and assign the Bitbucket container a static IP. + +Note: Docker networks may support multicast, however the below example shows configuration using TCPIP. + + $> docker network create --driver bridge --subnet=172.18.0.0/16 myBitbucketNetwork + $> docker run --network=myBitbucketNetwork --ip=172.18.1.1 -e ELASTICSEARCH_ENABLED=false \ + -e HAZELCAST_NETWORK_TCPIP=true -e HAZELCAST_NETWORK_TCPIP_MEMBERS=172.18.1.1:5701,172.18.1.2:5701,172.18.1.3:5701 \ + -e HAZELCAST_GROUP_NAME=bitbucket -e HAZELCAST_GROUP_PASSWORD=mysecretpassword \ + -v /data/bitbucket-shared:/var/atlassian/application-data/bitbucket/shared --name="bitbucket" -d -p 7990:7990 -p 7999:7999 atlassian/bitbucket-server + +## JMX Monitoring (Bitbucket Server 5.0 + only) + +Bitbucket Server supports detailed JMX monitoring. To enable and configure JMX, use the environment variables below. For further information on JMX configuration, see [Enabling JMX counters for performance monitoring](https://confluence.atlassian.com/bitbucketserver/enabling-jmx-counters-for-performance-monitoring-776640189.html) + +* `JMX_ENABLED` (default: false) + + Enable Bitbucket to publish JMX data + +* `JMX_REMOTE_AUTH` (default: NONE) + + Set the authentication to use for remote JMX access. This value is required: anything other than "password" or "ssl" will cause remote JMX access to be disabled + +* `JMX_REMOTE_PORT` (default: 3333) + + The port used to negotiate a JMX connection. Note: this port is only used during the initial authorization, after which a different RMI port used for data transfer + +* `JMX_REMOTE_RMI_PORT` (default: ) + + The port used for all subsequent JMX-RMI data transfer. If desired, the RMI data port can be set to the same value as `JMX_REMOTE_PORT` to allow a single port to be used for both JMX authorization and data transfer + +* `RMI_SERVER_HOSTNAME` (default: NONE) + + The hostname or IP address that clients will use to connect to the application for JMX monitoring. This must be resolvable by both clients and from the JVM host machine. + +* `JMX_PASSWORD_FILE` (default: NONE) + + The full path to the JMX username/password file used to authenticate remote JMX clients. This is required when `JMX_REMOTE_AUTH` is set to "password" + + $> docker run -e JMX_ENABLED=true -e JMX_REMOTE_AUTH=password -e JMX_REMOTE_RMI_PORT=3333 -e RMI_SERVER_HOSTNAME=bitbucket \ + -e JMX_PASSWORD_FILE=/data/bitbucket:/var/atlassian/application-data/bitbucket/jmx.access \ + -v /data/bitbucket:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 -p 3333:3333 atlassian/bitbucket-server + +# Upgrade + +To upgrade to a more recent version of Bitbucket Server you can simply stop the `bitbucket` +container and start a new one based on a more recent image: + + $> docker stop bitbucket + $> docker rm bitbucket + $> docker pull atlassian/bitbucket-server: + $> docker run ... (See above) + +As your data is stored in the data volume directory on the host it will still +be available after the upgrade. + +_Note: Please make sure that you **don't** accidentally remove the `bitbucket` +container and its volumes using the `-v` option._ + +# Backup + +For evaluations you can use the built-in database that will store its files in the Bitbucket Server home directory. In that case it is sufficient to create a backup archive of the directory on the host that is used as a volume (`/data/bitbucket` in the example above). + +The [Bitbucket Server Backup Client](https://confluence.atlassian.com/display/BitbucketServer/Data+recovery+and+backups) is currently not supported in the Docker setup. You can however use the [Bitbucket Server DIY Backup](https://confluence.atlassian.com/display/BitbucketServer/Using+Bitbucket+Server+DIY+Backup) approach in case you decided to use an external database. + +Read more about data recovery and backups: [https://confluence.atlassian.com/display/BitbucketServer/Data+recovery+and+backups](https://confluence.atlassian.com/display/BitbucketServer/Data+recovery+and+backups) + +# Versioning + +The `latest` tag matches the most recent version of this repository. Thus using `atlassian/bitbucket:latest` or `atlassian/bitbucket` will ensure you are running the most up to date version of this image. + +However, we ** strongly recommend ** that for non-eval workloads you select a specific version in order to prevent breaking changes from impacting your setup. +You can use a specific minor version of Bitbucket Server by using a version number +tag: `atlassian/bitbucket-server:4.14`. This will install the latest `4.14.x` version that +is available. + + +# Issue tracker + +Please raise an [issue](https://bitbucket.org/atlassian/docker-atlassian-bitbucket-server/issues) if you encounter any problems with this Dockerfile. + +# Support + +For product support, go to [support.atlassian.com](https://support.atlassian.com/) +Octotree is enabled on this page. Click this button or press cmd shift s (or ctrl shift s) to show it. +Support us • Feedback? diff --git a/linux/ecosystem/atlassian/bitbucket/8/8.19.6/docker-compose.yml b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/docker-compose.yml new file mode 100644 index 000000000..ce8e2b411 --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/docker-compose.yml @@ -0,0 +1,16 @@ +#version: '3' +services: + app: + image: "epicmorg/bitbucket:8.19.6" + build: + context: . + app-jdk11: + image: "epicmorg/bitbucket:8.19.6-jdk11" + build: + context: . + dockerfile: ./Dockerfile.jdk11 + app-jdk17: + image: "epicmorg/bitbucket:8.19.6-jdk17" + build: + context: . + dockerfile: ./Dockerfile.jdk17 diff --git a/linux/ecosystem/atlassian/bitbucket/8/8.19.6/entrypoint.sh b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/entrypoint.sh new file mode 100755 index 000000000..842224a8c --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/entrypoint.sh @@ -0,0 +1,57 @@ +#!/bin/bash +set -euo pipefail + +# Set recommended umask of "u=,g=w,o=rwx" (0027) +umask 0027 + +export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") +export JRE_HOME="$JAVA_HOME/jre" +export JAVA_BINARY="$JRE_HOME/bin/java" +export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}') + +#export PATH=$JAVA_HOME/bin:$PATH + + +# Setup Catalina Opts +: ${CATALINA_CONNECTOR_PROXYNAME:=} +: ${CATALINA_CONNECTOR_PROXYPORT:=} +: ${CATALINA_CONNECTOR_SCHEME:=http} +: ${CATALINA_CONNECTOR_SECURE:=false} + +: ${CATALINA_OPTS:=} + +: ${JAVA_OPTS:=} + +: ${ELASTICSEARCH_ENABLED:=true} +: ${APPLICATION_MODE:=} + +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}" + +JAVA_OPTS="${JAVA_OPTS} ${CATALINA_OPTS}" + +ARGS="$@" + +# Start Bitbucket without Elasticsearch +if [ "${ELASTICSEARCH_ENABLED}" == "false" ] || [ "${APPLICATION_MODE}" == "mirror" ]; then + ARGS="--no-search ${ARGS}" +fi + +# Start Bitbucket as the correct user. +if [ "${UID}" -eq 0 ]; then + echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}" + PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${BITBUCKET_HOME}") + EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700 + if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then + echo "Updating permissions for BITBUCKET_HOME" + mkdir -p "${BITBUCKET_HOME}/lib" && + chmod -R 700 "${BITBUCKET_HOME}" && + chown -R "${RUN_USER}:${RUN_GROUP}" "${BITBUCKET_HOME}" + fi + # Now drop privileges + exec su -s /bin/bash "${RUN_USER}" -c "${BITBUCKET_INSTALL_DIR}/bin/start-bitbucket.sh ${ARGS}" +else + exec "${BITBUCKET_INSTALL_DIR}/bin/start-bitbucket.sh" ${ARGS} +fi diff --git a/linux/ecosystem/atlassian/bitbucket/8/8.19.6/kaniko-build.py b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/kaniko-build.py new file mode 100644 index 000000000..e693b5c17 --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/kaniko-build.py @@ -0,0 +1,196 @@ +import os +import shutil +import argparse +import yaml +import subprocess +from collections import defaultdict +from concurrent.futures import ThreadPoolExecutor, as_completed +from dotenv import load_dotenv +import logging +import sys + +# Script version +SCRIPT_VERSION = "1.0.1.0" + +# ASCII art for EpicMorg +ASCII_ART = r""" ++=================================================+ +| ____| _) \ | | +| __| __ \ | __| |\/ | _ \ __| _` | | +| | | | | ( | | ( | | ( | | +|_____| .__/ _| \___| _| _| \___/ _| \__, | | +| | / _| _) | |___/ | +| ' / _` | __ \ | | / _ \ | +| . \ ( | | | | < ( | | +|_|\_\ \__,_| _| _| _| _|\_\ \___/ | +|\ \ / | +| \ \ \ / __| _` | __ \ __ \ _ \ __|| +| \ \ \ / | ( | | | | | __/ | | +| \_/\_/ _| \__,_| .__/ .__/ \___| _| | +| _| _| | ++=================================================+ +""" + +# Load environment variables from .env file +load_dotenv() + +def setup_logging(): + logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + +def parse_args(): + parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False) + parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file') + parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image') + parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry') + parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup') + parser.add_argument('--version', '-v', action='store_true', help='Show script version') + parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit') + return parser.parse_args() + +def load_compose_file(file_path): + with open(file_path, 'r') as file: + return yaml.safe_load(file) + +def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry): + kaniko_command = [ + 'docker', 'run', + '--rm', + '-t', + '-v', f'{os.path.abspath(build_context)}:/workspace', + ] + + # Add Docker config mounts for both read-only access + kaniko_command.extend([ + '-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon + '-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode + ]) + + kaniko_command.extend([ + kaniko_image, + '--context', '/workspace', + '--dockerfile', f'/workspace/{dockerfile}', + '--compressed-caching', + '--single-snapshot', + '--cleanup' + ]) + + if deploy: + kaniko_command.extend([ + '--destination', image_name + ]) + elif dry: + kaniko_command.extend([ + '--no-push' + ]) + else: + kaniko_command.extend([ + '--no-push' + ]) + + # Add build arguments if they exist + for arg_name, arg_value in build_args.items(): + kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}']) + + logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}") + + process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + + # Stream output in real-time + for line in process.stdout: + logging.info(line.strip()) + + process.wait() + + if process.returncode == 0: + logging.info(f"Successfully built {service_name}") + else: + for line in process.stderr: + logging.error(line.strip()) + logging.error(f"Error building {service_name}") + raise Exception(f"Failed to build {service_name}") + +def show_help(): + print(ASCII_ART) + print("EpicMorg: Kaniko-Compose Wrapper\n") + print("Arguments:") + print("--compose-file Path to docker-compose.yml file") + print("--kaniko-image Kaniko executor image") + print("--push, --deploy, -d, -p Deploy the built images to the registry") + print("--dry-run, --dry Dry run: build images without pushing and with cleanup") + print("--version, -v Show script version") + print("--help, -h Show this help message and exit") + +def show_version(): + print(ASCII_ART) + print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}") + +def main(): + setup_logging() + + args = parse_args() + + # Show help and exit if --help is provided + if args.help: + show_help() + return + + # Show version and exit if --version or no relevant arguments are provided + if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'): + show_version() + return + + compose_file = args.compose_file + kaniko_image = args.kaniko_image + deploy = args.push + dry = args.dry_run + + if not os.path.exists(compose_file): + logging.error(f"{compose_file} not found") + return + + compose_data = load_compose_file(compose_file) + + services = compose_data.get('services', {}) + image_names = defaultdict(int) + + for service_name, service_data in services.items(): + image_name = service_data.get('image') + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + image_names[image_name] += 1 + + for image_name, count in image_names.items(): + if count > 1: + logging.error(f"Error: Image name {image_name} is used {count} times.") + return + + try: + with ThreadPoolExecutor() as executor: + futures = [] + for service_name, service_data in services.items(): + build_data = service_data.get('build', {}) + build_context = build_data.get('context', '.') + dockerfile = build_data.get('dockerfile', 'Dockerfile') + image_name = service_data.get('image') + build_args = build_data.get('args', {}) + + # Substitute environment variables with their values if they exist + build_args = {key: os.getenv(key, value) for key, value in build_args.items()} + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry)) + + for future in as_completed(futures): + future.result() + except Exception as exc: + logging.error(f"Build failed: {exc}") + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/linux/ecosystem/atlassian/bitbucket/8/8.19.6/requirements.txt b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/requirements.txt new file mode 100644 index 000000000..9ed771861 --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/8/8.19.6/requirements.txt @@ -0,0 +1,2 @@ +PyYAML +python-dotenv diff --git a/linux/ecosystem/atlassian/bitbucket/9/9.0.0/Dockerfile b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/Dockerfile new file mode 100644 index 000000000..96896ed42 --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/Dockerfile @@ -0,0 +1,46 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG BITBUCKET_VERSION=9.0.0 +ARG DOWNLOAD_URL=https://product-downloads.atlassian.com/software/stash/downloads/atlassian-bitbucket-${BITBUCKET_VERSION}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/BitbucketServer/Bitbucket+Server+home+directory +ENV BITBUCKET_HOME /var/atlassian/application-data/bitbucket +ENV BITBUCKET_INSTALL_DIR /opt/atlassian/bitbucket + +VOLUME ["${BITBUCKET_HOME}"] +WORKDIR $BITBUCKET_HOME + +# Expose HTTP and SSH ports +EXPOSE 7990 +EXPOSE 7999 + +################################################################## +# Installing +################################################################## +RUN apt-get update && \ + apt-get install -y --allow-downgrades git/bookworm + +RUN mkdir -p ${BITBUCKET_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "${BITBUCKET_INSTALL_DIR}" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${BITBUCKET_INSTALL_DIR}/ \ + && sed -i -e 's/^# umask/umask/' ${BITBUCKET_INSTALL_DIR}/bin/_start-webapp.sh && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] +COPY entrypoint.sh /entrypoint.sh diff --git a/linux/ecosystem/atlassian/bitbucket/9/9.0.0/Dockerfile.jdk11 b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/Dockerfile.jdk11 new file mode 100644 index 000000000..96896ed42 --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/Dockerfile.jdk11 @@ -0,0 +1,46 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG BITBUCKET_VERSION=9.0.0 +ARG DOWNLOAD_URL=https://product-downloads.atlassian.com/software/stash/downloads/atlassian-bitbucket-${BITBUCKET_VERSION}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/BitbucketServer/Bitbucket+Server+home+directory +ENV BITBUCKET_HOME /var/atlassian/application-data/bitbucket +ENV BITBUCKET_INSTALL_DIR /opt/atlassian/bitbucket + +VOLUME ["${BITBUCKET_HOME}"] +WORKDIR $BITBUCKET_HOME + +# Expose HTTP and SSH ports +EXPOSE 7990 +EXPOSE 7999 + +################################################################## +# Installing +################################################################## +RUN apt-get update && \ + apt-get install -y --allow-downgrades git/bookworm + +RUN mkdir -p ${BITBUCKET_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "${BITBUCKET_INSTALL_DIR}" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${BITBUCKET_INSTALL_DIR}/ \ + && sed -i -e 's/^# umask/umask/' ${BITBUCKET_INSTALL_DIR}/bin/_start-webapp.sh && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] +COPY entrypoint.sh /entrypoint.sh diff --git a/linux/ecosystem/atlassian/bitbucket/9/9.0.0/Dockerfile.jdk17 b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/Dockerfile.jdk17 new file mode 100644 index 000000000..c75304fae --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/Dockerfile.jdk17 @@ -0,0 +1,46 @@ +FROM epicmorg/debian:bookworm-jdk17 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG BITBUCKET_VERSION=9.0.0 +ARG DOWNLOAD_URL=https://product-downloads.atlassian.com/software/stash/downloads/atlassian-bitbucket-${BITBUCKET_VERSION}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/BitbucketServer/Bitbucket+Server+home+directory +ENV BITBUCKET_HOME /var/atlassian/application-data/bitbucket +ENV BITBUCKET_INSTALL_DIR /opt/atlassian/bitbucket + +VOLUME ["${BITBUCKET_HOME}"] +WORKDIR $BITBUCKET_HOME + +# Expose HTTP and SSH ports +EXPOSE 7990 +EXPOSE 7999 + +################################################################## +# Installing +################################################################## +RUN apt-get update && \ + apt-get install -y --allow-downgrades git/bookworm + +RUN mkdir -p ${BITBUCKET_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "${BITBUCKET_INSTALL_DIR}" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${BITBUCKET_INSTALL_DIR}/ \ + && sed -i -e 's/^# umask/umask/' ${BITBUCKET_INSTALL_DIR}/bin/_start-webapp.sh && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] +COPY entrypoint.sh /entrypoint.sh diff --git a/linux/ecosystem/atlassian/bitbucket/9/9.0.0/Makefile b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/Makefile new file mode 100644 index 000000000..3383c9699 --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/Makefile @@ -0,0 +1,50 @@ +PIP_BREAK_SYSTEM_PACKAGES=1 + +all: app + +app: + make build + make deploy + make clean + +build: + make pip + python3 kaniko-build.py --version + +dry: + make dry-run + +test: + make dry-run + +dry-run: + python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run + +pip: + rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED + pip3 install -r requirements.txt + pip install -r requirements.txt + +build-compose: + docker-compose build --compress --parallel --progress plain + +deploy: + make pip + python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug + +deploy-compose: + docker-compose push + +clean: + docker container prune -f + docker image prune -f + docker network prune -f + docker volume prune -f + docker system prune -af diff --git a/linux/ecosystem/atlassian/bitbucket/9/9.0.0/README.md b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/README.md new file mode 100644 index 000000000..b60c42068 --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/README.md @@ -0,0 +1,216 @@ +![Atlassian Bitbucket Server](https://www.atlassian.com/dam/wac/legacy/bitbucket_logo_landing.png) + +Bitbucket Server is an on-premises source code management solution for Git that's secure, fast, and enterprise grade. Create and manage repositories, set up fine-grained permissions, and collaborate on code - all with the flexibility of your servers. + +Learn more about Bitbucket Server: + +# Overview + +This Docker container makes it easy to get an instance of Bitbucket up and running. + +** We strongly recommend you run this image using a specific version tag instead of latest. This is because the image referenced by the latest tag changes often and we cannot guarantee that it will be backwards compatible. ** + +# Quick Start + +For the `BITBUCKET_HOME` directory that is used to store the repository data +(amongst other things) we recommend mounting a host directory as a [data volume](https://docs.docker.com/engine/tutorials/dockervolumes/#/data-volumes), or via a named volume if using a docker version >= 1.9. + +Volume permission is managed by entry scripts. To get started you can use a data volume, or named volumes. In this example we'll use named volumes. + + $> docker volume create --name bitbucketVolume + $> docker run -v bitbucketVolume:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 atlassian/bitbucket-server + +Note that this command can substitute folder paths with named volumes. + +Start Atlassian Bitbucket Server: + + $> docker run -v /data/bitbucket:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 atlassian/bitbucket-server + +**Success**. Bitbucket is now available on [http://localhost:7990](http://localhost:7990)* + +Please ensure your container has the necessary resources allocated to it. +We recommend 2GiB of memory allocated to accommodate both the application server +and the git processes. +See [Supported Platforms](https://confluence.atlassian.com/display/BitbucketServer/Supported+platforms) for further information. + + +_* Note: If you are using `docker-machine` on Mac OS X, please use `open http://$(docker-machine ip default):7990` instead._ + +## Reverse Proxy Settings + +If Bitbucket is run behind a reverse proxy server as [described here](https://confluence.atlassian.com/bitbucketserver/proxying-and-securing-bitbucket-server-776640099.html), +then you need to specify extra options to make bitbucket aware of the setup. They can be controlled via the below +environment variables. + +### Bitbucket Server 5.0 + + +Due to the migration to Spring Boot in 5.0, there are changes to how you set up Bitbucket to run behind a reverse proxy. + +In this example, we'll use an environment file. You can also do this via [specifying each environment variable](https://docs.docker.com/engine/reference/run/#env-environment-variables) via the `-e` argument in `docker run`. + +#### secure-bitbucket.env +``` +SERVER_SECURE=true +SERVER_SCHEME=https +SERVER_PROXY_PORT=443 +SERVER_PROXY_NAME= +``` + +Then you run Bitbucket as usual + +`docker run -v bitbucketVolume:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 --env-file=/path/to/env/file/secure-bitbucket.env atlassian/bitbucket-server:5.0` + +### Bitbucket Server < 5.0 + +To set the reverse proxy arguments, you specify the following as environment variables in the `docker run` command + +* `CATALINA_CONNECTOR_PROXYNAME` (default: NONE) + + The reverse proxy's fully qualified hostname. + +* `CATALINA_CONNECTOR_PROXYPORT` (default: NONE) + + The reverse proxy's port number via which bitbucket is accessed. + +* `CATALINA_CONNECTOR_SCHEME` (default: http) + + The protocol via which bitbucket is accessed. + +* `CATALINA_CONNECTOR_SECURE` (default: false) + + Set 'true' if CATALINA\_CONNECTOR\_SCHEME is 'https'. + +## JVM Configuration (Bitbucket Server 5.0 + only) + +If you need to override Bitbucket Server's default memory configuration or pass additional JVM arguments, use the environment variables below + +* `JVM_MINIMUM_MEMORY` (default: 512m) + + The minimum heap size of the JVM + +* `JVM_MAXIMUM_MEMORY` (default: 1024m) + + The maximum heap size of the JVM + +* `JVM_SUPPORT_RECOMMENDED_ARGS` (default: NONE) + + Additional JVM arguments for Bitbucket Server, such as a custom Java Trust Store + +## Application Mode Settings (Bitbucket Server 5.0 + only) + +This docker image can be run as a [Smart Mirror](https://confluence.atlassian.com/bitbucketserver/smart-mirroring-776640046.html) or as part of a [Data Center](https://confluence.atlassian.com/enterprise/bitbucket-data-center-668468332.html) cluster. +You can specify the following properties to start Bitbucket as a mirror or as a Data Center node: + +* `ELASTICSEARCH_ENABLED` (default: true) + + Set 'false' to prevent Elasticsearch from starting in the container. This should be used if Elasticsearch is running remotely, e.g. for if Bitbucket is running in a Data Center cluster + +* `APPLICATION_MODE` (default: default) + + The mode Bitbucket will run in. This can be set to 'mirror' to start Bitbucket as a Smart Mirror. This will also disable Elasticsearch even if `ELASTICSEARCH_ENABLED` has not been set to 'false'. + +* `HAZELCAST_NETWORK_MULTICAST` (default: false) + + Data Center: Set 'true' to enable Bitbucket to find new Data Center cluster members via multicast. `HAZELCAST_NETWORK_TCPIP` should not be specified when using this setting. + +* `HAZELCAST_NETWORK_TCPIP` (default: false) + + Data Center: Set 'true' to enable Bitbucket to find new Data Center cluster members via TCPIP. This setting requires `HAZELCAST_NETWORK_TCPIP_MEMBERS` to be specified. `HAZELCAST_NETWORK_MULTICAST` should not be specified when using this setting. + +* `HAZELCAST_NETWORK_TCPIP_MEMBERS` + + Data Center: List of members that Hazelcast nodes should connect to when HAZELCAST_NETWORK_TCPIP is 'true' + +* `HAZELCAST_GROUP_NAME` + + Data Center: Specifies the cluster group the instance should join. + +* `HAZELCAST_GROUP_PASSWORD` + + Data Center: The password required to join the specified cluster group. + +To run Bitbucket as part of a Data Center cluster, create a Docker network and assign the Bitbucket container a static IP. + +Note: Docker networks may support multicast, however the below example shows configuration using TCPIP. + + $> docker network create --driver bridge --subnet=172.18.0.0/16 myBitbucketNetwork + $> docker run --network=myBitbucketNetwork --ip=172.18.1.1 -e ELASTICSEARCH_ENABLED=false \ + -e HAZELCAST_NETWORK_TCPIP=true -e HAZELCAST_NETWORK_TCPIP_MEMBERS=172.18.1.1:5701,172.18.1.2:5701,172.18.1.3:5701 \ + -e HAZELCAST_GROUP_NAME=bitbucket -e HAZELCAST_GROUP_PASSWORD=mysecretpassword \ + -v /data/bitbucket-shared:/var/atlassian/application-data/bitbucket/shared --name="bitbucket" -d -p 7990:7990 -p 7999:7999 atlassian/bitbucket-server + +## JMX Monitoring (Bitbucket Server 5.0 + only) + +Bitbucket Server supports detailed JMX monitoring. To enable and configure JMX, use the environment variables below. For further information on JMX configuration, see [Enabling JMX counters for performance monitoring](https://confluence.atlassian.com/bitbucketserver/enabling-jmx-counters-for-performance-monitoring-776640189.html) + +* `JMX_ENABLED` (default: false) + + Enable Bitbucket to publish JMX data + +* `JMX_REMOTE_AUTH` (default: NONE) + + Set the authentication to use for remote JMX access. This value is required: anything other than "password" or "ssl" will cause remote JMX access to be disabled + +* `JMX_REMOTE_PORT` (default: 3333) + + The port used to negotiate a JMX connection. Note: this port is only used during the initial authorization, after which a different RMI port used for data transfer + +* `JMX_REMOTE_RMI_PORT` (default: ) + + The port used for all subsequent JMX-RMI data transfer. If desired, the RMI data port can be set to the same value as `JMX_REMOTE_PORT` to allow a single port to be used for both JMX authorization and data transfer + +* `RMI_SERVER_HOSTNAME` (default: NONE) + + The hostname or IP address that clients will use to connect to the application for JMX monitoring. This must be resolvable by both clients and from the JVM host machine. + +* `JMX_PASSWORD_FILE` (default: NONE) + + The full path to the JMX username/password file used to authenticate remote JMX clients. This is required when `JMX_REMOTE_AUTH` is set to "password" + + $> docker run -e JMX_ENABLED=true -e JMX_REMOTE_AUTH=password -e JMX_REMOTE_RMI_PORT=3333 -e RMI_SERVER_HOSTNAME=bitbucket \ + -e JMX_PASSWORD_FILE=/data/bitbucket:/var/atlassian/application-data/bitbucket/jmx.access \ + -v /data/bitbucket:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 -p 3333:3333 atlassian/bitbucket-server + +# Upgrade + +To upgrade to a more recent version of Bitbucket Server you can simply stop the `bitbucket` +container and start a new one based on a more recent image: + + $> docker stop bitbucket + $> docker rm bitbucket + $> docker pull atlassian/bitbucket-server: + $> docker run ... (See above) + +As your data is stored in the data volume directory on the host it will still +be available after the upgrade. + +_Note: Please make sure that you **don't** accidentally remove the `bitbucket` +container and its volumes using the `-v` option._ + +# Backup + +For evaluations you can use the built-in database that will store its files in the Bitbucket Server home directory. In that case it is sufficient to create a backup archive of the directory on the host that is used as a volume (`/data/bitbucket` in the example above). + +The [Bitbucket Server Backup Client](https://confluence.atlassian.com/display/BitbucketServer/Data+recovery+and+backups) is currently not supported in the Docker setup. You can however use the [Bitbucket Server DIY Backup](https://confluence.atlassian.com/display/BitbucketServer/Using+Bitbucket+Server+DIY+Backup) approach in case you decided to use an external database. + +Read more about data recovery and backups: [https://confluence.atlassian.com/display/BitbucketServer/Data+recovery+and+backups](https://confluence.atlassian.com/display/BitbucketServer/Data+recovery+and+backups) + +# Versioning + +The `latest` tag matches the most recent version of this repository. Thus using `atlassian/bitbucket:latest` or `atlassian/bitbucket` will ensure you are running the most up to date version of this image. + +However, we ** strongly recommend ** that for non-eval workloads you select a specific version in order to prevent breaking changes from impacting your setup. +You can use a specific minor version of Bitbucket Server by using a version number +tag: `atlassian/bitbucket-server:4.14`. This will install the latest `4.14.x` version that +is available. + + +# Issue tracker + +Please raise an [issue](https://bitbucket.org/atlassian/docker-atlassian-bitbucket-server/issues) if you encounter any problems with this Dockerfile. + +# Support + +For product support, go to [support.atlassian.com](https://support.atlassian.com/) +Octotree is enabled on this page. Click this button or press cmd shift s (or ctrl shift s) to show it. +Support us • Feedback? diff --git a/linux/ecosystem/atlassian/bitbucket/9/9.0.0/docker-compose.yml b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/docker-compose.yml new file mode 100644 index 000000000..8f9542bab --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/docker-compose.yml @@ -0,0 +1,16 @@ +#version: '3' +services: + app: + image: "epicmorg/bitbucket:9.0.0" + build: + context: . + app-jdk11: + image: "epicmorg/bitbucket:9.0.0-jdk11" + build: + context: . + dockerfile: ./Dockerfile.jdk11 + app-jdk17: + image: "epicmorg/bitbucket:9.0.0-jdk17" + build: + context: . + dockerfile: ./Dockerfile.jdk17 diff --git a/linux/ecosystem/atlassian/bitbucket/9/9.0.0/entrypoint.sh b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/entrypoint.sh new file mode 100755 index 000000000..842224a8c --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/entrypoint.sh @@ -0,0 +1,57 @@ +#!/bin/bash +set -euo pipefail + +# Set recommended umask of "u=,g=w,o=rwx" (0027) +umask 0027 + +export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") +export JRE_HOME="$JAVA_HOME/jre" +export JAVA_BINARY="$JRE_HOME/bin/java" +export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}') + +#export PATH=$JAVA_HOME/bin:$PATH + + +# Setup Catalina Opts +: ${CATALINA_CONNECTOR_PROXYNAME:=} +: ${CATALINA_CONNECTOR_PROXYPORT:=} +: ${CATALINA_CONNECTOR_SCHEME:=http} +: ${CATALINA_CONNECTOR_SECURE:=false} + +: ${CATALINA_OPTS:=} + +: ${JAVA_OPTS:=} + +: ${ELASTICSEARCH_ENABLED:=true} +: ${APPLICATION_MODE:=} + +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}" + +JAVA_OPTS="${JAVA_OPTS} ${CATALINA_OPTS}" + +ARGS="$@" + +# Start Bitbucket without Elasticsearch +if [ "${ELASTICSEARCH_ENABLED}" == "false" ] || [ "${APPLICATION_MODE}" == "mirror" ]; then + ARGS="--no-search ${ARGS}" +fi + +# Start Bitbucket as the correct user. +if [ "${UID}" -eq 0 ]; then + echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}" + PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${BITBUCKET_HOME}") + EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700 + if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then + echo "Updating permissions for BITBUCKET_HOME" + mkdir -p "${BITBUCKET_HOME}/lib" && + chmod -R 700 "${BITBUCKET_HOME}" && + chown -R "${RUN_USER}:${RUN_GROUP}" "${BITBUCKET_HOME}" + fi + # Now drop privileges + exec su -s /bin/bash "${RUN_USER}" -c "${BITBUCKET_INSTALL_DIR}/bin/start-bitbucket.sh ${ARGS}" +else + exec "${BITBUCKET_INSTALL_DIR}/bin/start-bitbucket.sh" ${ARGS} +fi diff --git a/linux/ecosystem/atlassian/bitbucket/9/9.0.0/kaniko-build.py b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/kaniko-build.py new file mode 100644 index 000000000..e693b5c17 --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/kaniko-build.py @@ -0,0 +1,196 @@ +import os +import shutil +import argparse +import yaml +import subprocess +from collections import defaultdict +from concurrent.futures import ThreadPoolExecutor, as_completed +from dotenv import load_dotenv +import logging +import sys + +# Script version +SCRIPT_VERSION = "1.0.1.0" + +# ASCII art for EpicMorg +ASCII_ART = r""" ++=================================================+ +| ____| _) \ | | +| __| __ \ | __| |\/ | _ \ __| _` | | +| | | | | ( | | ( | | ( | | +|_____| .__/ _| \___| _| _| \___/ _| \__, | | +| | / _| _) | |___/ | +| ' / _` | __ \ | | / _ \ | +| . \ ( | | | | < ( | | +|_|\_\ \__,_| _| _| _| _|\_\ \___/ | +|\ \ / | +| \ \ \ / __| _` | __ \ __ \ _ \ __|| +| \ \ \ / | ( | | | | | __/ | | +| \_/\_/ _| \__,_| .__/ .__/ \___| _| | +| _| _| | ++=================================================+ +""" + +# Load environment variables from .env file +load_dotenv() + +def setup_logging(): + logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + +def parse_args(): + parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False) + parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file') + parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image') + parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry') + parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup') + parser.add_argument('--version', '-v', action='store_true', help='Show script version') + parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit') + return parser.parse_args() + +def load_compose_file(file_path): + with open(file_path, 'r') as file: + return yaml.safe_load(file) + +def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry): + kaniko_command = [ + 'docker', 'run', + '--rm', + '-t', + '-v', f'{os.path.abspath(build_context)}:/workspace', + ] + + # Add Docker config mounts for both read-only access + kaniko_command.extend([ + '-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon + '-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode + ]) + + kaniko_command.extend([ + kaniko_image, + '--context', '/workspace', + '--dockerfile', f'/workspace/{dockerfile}', + '--compressed-caching', + '--single-snapshot', + '--cleanup' + ]) + + if deploy: + kaniko_command.extend([ + '--destination', image_name + ]) + elif dry: + kaniko_command.extend([ + '--no-push' + ]) + else: + kaniko_command.extend([ + '--no-push' + ]) + + # Add build arguments if they exist + for arg_name, arg_value in build_args.items(): + kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}']) + + logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}") + + process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + + # Stream output in real-time + for line in process.stdout: + logging.info(line.strip()) + + process.wait() + + if process.returncode == 0: + logging.info(f"Successfully built {service_name}") + else: + for line in process.stderr: + logging.error(line.strip()) + logging.error(f"Error building {service_name}") + raise Exception(f"Failed to build {service_name}") + +def show_help(): + print(ASCII_ART) + print("EpicMorg: Kaniko-Compose Wrapper\n") + print("Arguments:") + print("--compose-file Path to docker-compose.yml file") + print("--kaniko-image Kaniko executor image") + print("--push, --deploy, -d, -p Deploy the built images to the registry") + print("--dry-run, --dry Dry run: build images without pushing and with cleanup") + print("--version, -v Show script version") + print("--help, -h Show this help message and exit") + +def show_version(): + print(ASCII_ART) + print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}") + +def main(): + setup_logging() + + args = parse_args() + + # Show help and exit if --help is provided + if args.help: + show_help() + return + + # Show version and exit if --version or no relevant arguments are provided + if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'): + show_version() + return + + compose_file = args.compose_file + kaniko_image = args.kaniko_image + deploy = args.push + dry = args.dry_run + + if not os.path.exists(compose_file): + logging.error(f"{compose_file} not found") + return + + compose_data = load_compose_file(compose_file) + + services = compose_data.get('services', {}) + image_names = defaultdict(int) + + for service_name, service_data in services.items(): + image_name = service_data.get('image') + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + image_names[image_name] += 1 + + for image_name, count in image_names.items(): + if count > 1: + logging.error(f"Error: Image name {image_name} is used {count} times.") + return + + try: + with ThreadPoolExecutor() as executor: + futures = [] + for service_name, service_data in services.items(): + build_data = service_data.get('build', {}) + build_context = build_data.get('context', '.') + dockerfile = build_data.get('dockerfile', 'Dockerfile') + image_name = service_data.get('image') + build_args = build_data.get('args', {}) + + # Substitute environment variables with their values if they exist + build_args = {key: os.getenv(key, value) for key, value in build_args.items()} + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry)) + + for future in as_completed(futures): + future.result() + except Exception as exc: + logging.error(f"Build failed: {exc}") + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/linux/ecosystem/atlassian/bitbucket/9/9.0.0/requirements.txt b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/requirements.txt new file mode 100644 index 000000000..9ed771861 --- /dev/null +++ b/linux/ecosystem/atlassian/bitbucket/9/9.0.0/requirements.txt @@ -0,0 +1,2 @@ +PyYAML +python-dotenv diff --git a/linux/ecosystem/atlassian/confluence/8/8.8.1/Dockerfile b/linux/ecosystem/atlassian/confluence/8/8.8.1/Dockerfile new file mode 100644 index 000000000..303dc4aa7 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.8.1/Dockerfile @@ -0,0 +1,48 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG RELEASE=8.8.1 +ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html +ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence +ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence + +VOLUME ["${CONFLUENCE_HOME}"] +WORKDIR $CONFLUENCE_HOME + +# Expose HTTP and Synchrony ports +EXPOSE 8090 +EXPOSE 8091 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \ + && sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/confluence/8/8.8.1/Dockerfile.jdk11 b/linux/ecosystem/atlassian/confluence/8/8.8.1/Dockerfile.jdk11 new file mode 100644 index 000000000..dfa61a420 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.8.1/Dockerfile.jdk11 @@ -0,0 +1,49 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG RELEASE=8.8.1 +ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html +ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence +ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence + +VOLUME ["${CONFLUENCE_HOME}"] +WORKDIR $CONFLUENCE_HOME + +# Expose HTTP and Synchrony ports +EXPOSE 8090 +EXPOSE 8091 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \ + && sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \ + + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/confluence/8/8.8.1/Dockerfile.jdk17 b/linux/ecosystem/atlassian/confluence/8/8.8.1/Dockerfile.jdk17 new file mode 100644 index 000000000..b8bb52274 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.8.1/Dockerfile.jdk17 @@ -0,0 +1,49 @@ +FROM epicmorg/debian:bookworm-jdk17 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG RELEASE=8.8.1 +ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html +ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence +ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence + +VOLUME ["${CONFLUENCE_HOME}"] +WORKDIR $CONFLUENCE_HOME + +# Expose HTTP and Synchrony ports +EXPOSE 8090 +EXPOSE 8091 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \ + && sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \ + + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/confluence/8/8.8.1/Makefile b/linux/ecosystem/atlassian/confluence/8/8.8.1/Makefile new file mode 100644 index 000000000..3383c9699 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.8.1/Makefile @@ -0,0 +1,50 @@ +PIP_BREAK_SYSTEM_PACKAGES=1 + +all: app + +app: + make build + make deploy + make clean + +build: + make pip + python3 kaniko-build.py --version + +dry: + make dry-run + +test: + make dry-run + +dry-run: + python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run + +pip: + rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED + pip3 install -r requirements.txt + pip install -r requirements.txt + +build-compose: + docker-compose build --compress --parallel --progress plain + +deploy: + make pip + python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug + +deploy-compose: + docker-compose push + +clean: + docker container prune -f + docker image prune -f + docker network prune -f + docker volume prune -f + docker system prune -af diff --git a/linux/ecosystem/atlassian/confluence/8/8.8.1/docker-compose.yml b/linux/ecosystem/atlassian/confluence/8/8.8.1/docker-compose.yml new file mode 100644 index 000000000..8a68e3a0c --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.8.1/docker-compose.yml @@ -0,0 +1,17 @@ +#version: '3' +services: + app: + image: "epicmorg/confluence:8.8.1" + build: + context: . + app-jdk11: + image: "epicmorg/confluence:8.8.1-jdk11" + build: + context: . + dockerfile: Dockerfile.jdk11 + app-jdk17: + image: "epicmorg/confluence:8.8.1-jdk17" + build: + context: . + dockerfile: Dockerfile.jdk17 + diff --git a/linux/ecosystem/atlassian/confluence/8/8.8.1/entrypoint.sh b/linux/ecosystem/atlassian/confluence/8/8.8.1/entrypoint.sh new file mode 100755 index 000000000..250fc031a --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.8.1/entrypoint.sh @@ -0,0 +1,39 @@ +#!/bin/bash +set -euo pipefail + +export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") +export JRE_HOME="$JAVA_HOME/jre" +export JAVA_BINARY="$JRE_HOME/bin/java" +export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}') + + +# Setup Catalina Opts +: ${CATALINA_CONNECTOR_PROXYNAME:=} +: ${CATALINA_CONNECTOR_PROXYPORT:=} +: ${CATALINA_CONNECTOR_SCHEME:=http} +: ${CATALINA_CONNECTOR_SECURE:=false} + +: ${CATALINA_OPTS:=} + +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}" + +export CATALINA_OPTS + + +# Start Confluence as the correct user +if [ "${UID}" -eq 0 ]; then + echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}" + PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${CONFLUENCE_HOME}") + EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700 + if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then + chmod -R 700 "${CONFLUENCE_HOME}" && + chown -R "${RUN_USER}:${RUN_GROUP}" "${CONFLUENCE_HOME}" + fi + # Now drop privileges + exec su -s /bin/bash "${RUN_USER}" -c "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh $@" +else + exec "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh" "$@" +fi diff --git a/linux/ecosystem/atlassian/confluence/8/8.8.1/kaniko-build.py b/linux/ecosystem/atlassian/confluence/8/8.8.1/kaniko-build.py new file mode 100644 index 000000000..e693b5c17 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.8.1/kaniko-build.py @@ -0,0 +1,196 @@ +import os +import shutil +import argparse +import yaml +import subprocess +from collections import defaultdict +from concurrent.futures import ThreadPoolExecutor, as_completed +from dotenv import load_dotenv +import logging +import sys + +# Script version +SCRIPT_VERSION = "1.0.1.0" + +# ASCII art for EpicMorg +ASCII_ART = r""" ++=================================================+ +| ____| _) \ | | +| __| __ \ | __| |\/ | _ \ __| _` | | +| | | | | ( | | ( | | ( | | +|_____| .__/ _| \___| _| _| \___/ _| \__, | | +| | / _| _) | |___/ | +| ' / _` | __ \ | | / _ \ | +| . \ ( | | | | < ( | | +|_|\_\ \__,_| _| _| _| _|\_\ \___/ | +|\ \ / | +| \ \ \ / __| _` | __ \ __ \ _ \ __|| +| \ \ \ / | ( | | | | | __/ | | +| \_/\_/ _| \__,_| .__/ .__/ \___| _| | +| _| _| | ++=================================================+ +""" + +# Load environment variables from .env file +load_dotenv() + +def setup_logging(): + logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + +def parse_args(): + parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False) + parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file') + parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image') + parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry') + parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup') + parser.add_argument('--version', '-v', action='store_true', help='Show script version') + parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit') + return parser.parse_args() + +def load_compose_file(file_path): + with open(file_path, 'r') as file: + return yaml.safe_load(file) + +def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry): + kaniko_command = [ + 'docker', 'run', + '--rm', + '-t', + '-v', f'{os.path.abspath(build_context)}:/workspace', + ] + + # Add Docker config mounts for both read-only access + kaniko_command.extend([ + '-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon + '-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode + ]) + + kaniko_command.extend([ + kaniko_image, + '--context', '/workspace', + '--dockerfile', f'/workspace/{dockerfile}', + '--compressed-caching', + '--single-snapshot', + '--cleanup' + ]) + + if deploy: + kaniko_command.extend([ + '--destination', image_name + ]) + elif dry: + kaniko_command.extend([ + '--no-push' + ]) + else: + kaniko_command.extend([ + '--no-push' + ]) + + # Add build arguments if they exist + for arg_name, arg_value in build_args.items(): + kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}']) + + logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}") + + process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + + # Stream output in real-time + for line in process.stdout: + logging.info(line.strip()) + + process.wait() + + if process.returncode == 0: + logging.info(f"Successfully built {service_name}") + else: + for line in process.stderr: + logging.error(line.strip()) + logging.error(f"Error building {service_name}") + raise Exception(f"Failed to build {service_name}") + +def show_help(): + print(ASCII_ART) + print("EpicMorg: Kaniko-Compose Wrapper\n") + print("Arguments:") + print("--compose-file Path to docker-compose.yml file") + print("--kaniko-image Kaniko executor image") + print("--push, --deploy, -d, -p Deploy the built images to the registry") + print("--dry-run, --dry Dry run: build images without pushing and with cleanup") + print("--version, -v Show script version") + print("--help, -h Show this help message and exit") + +def show_version(): + print(ASCII_ART) + print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}") + +def main(): + setup_logging() + + args = parse_args() + + # Show help and exit if --help is provided + if args.help: + show_help() + return + + # Show version and exit if --version or no relevant arguments are provided + if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'): + show_version() + return + + compose_file = args.compose_file + kaniko_image = args.kaniko_image + deploy = args.push + dry = args.dry_run + + if not os.path.exists(compose_file): + logging.error(f"{compose_file} not found") + return + + compose_data = load_compose_file(compose_file) + + services = compose_data.get('services', {}) + image_names = defaultdict(int) + + for service_name, service_data in services.items(): + image_name = service_data.get('image') + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + image_names[image_name] += 1 + + for image_name, count in image_names.items(): + if count > 1: + logging.error(f"Error: Image name {image_name} is used {count} times.") + return + + try: + with ThreadPoolExecutor() as executor: + futures = [] + for service_name, service_data in services.items(): + build_data = service_data.get('build', {}) + build_context = build_data.get('context', '.') + dockerfile = build_data.get('dockerfile', 'Dockerfile') + image_name = service_data.get('image') + build_args = build_data.get('args', {}) + + # Substitute environment variables with their values if they exist + build_args = {key: os.getenv(key, value) for key, value in build_args.items()} + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry)) + + for future in as_completed(futures): + future.result() + except Exception as exc: + logging.error(f"Build failed: {exc}") + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/linux/ecosystem/atlassian/confluence/8/8.8.1/requirements.txt b/linux/ecosystem/atlassian/confluence/8/8.8.1/requirements.txt new file mode 100644 index 000000000..9ed771861 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.8.1/requirements.txt @@ -0,0 +1,2 @@ +PyYAML +python-dotenv diff --git a/linux/ecosystem/atlassian/confluence/8/8.9.5/Dockerfile b/linux/ecosystem/atlassian/confluence/8/8.9.5/Dockerfile new file mode 100644 index 000000000..2c06065b5 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.9.5/Dockerfile @@ -0,0 +1,48 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG RELEASE=8.9.5 +ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html +ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence +ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence + +VOLUME ["${CONFLUENCE_HOME}"] +WORKDIR $CONFLUENCE_HOME + +# Expose HTTP and Synchrony ports +EXPOSE 8090 +EXPOSE 8091 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \ + && sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/confluence/8/8.9.5/Dockerfile.jdk11 b/linux/ecosystem/atlassian/confluence/8/8.9.5/Dockerfile.jdk11 new file mode 100644 index 000000000..93559b108 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.9.5/Dockerfile.jdk11 @@ -0,0 +1,49 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG RELEASE=8.9.5 +ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html +ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence +ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence + +VOLUME ["${CONFLUENCE_HOME}"] +WORKDIR $CONFLUENCE_HOME + +# Expose HTTP and Synchrony ports +EXPOSE 8090 +EXPOSE 8091 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \ + && sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \ + + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/confluence/8/8.9.5/Dockerfile.jdk17 b/linux/ecosystem/atlassian/confluence/8/8.9.5/Dockerfile.jdk17 new file mode 100644 index 000000000..b5dcedd45 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.9.5/Dockerfile.jdk17 @@ -0,0 +1,49 @@ +FROM epicmorg/debian:bookworm-jdk17 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG RELEASE=8.9.5 +ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html +ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence +ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence + +VOLUME ["${CONFLUENCE_HOME}"] +WORKDIR $CONFLUENCE_HOME + +# Expose HTTP and Synchrony ports +EXPOSE 8090 +EXPOSE 8091 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \ + && sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \ + + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/confluence/8/8.9.5/Makefile b/linux/ecosystem/atlassian/confluence/8/8.9.5/Makefile new file mode 100644 index 000000000..3383c9699 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.9.5/Makefile @@ -0,0 +1,50 @@ +PIP_BREAK_SYSTEM_PACKAGES=1 + +all: app + +app: + make build + make deploy + make clean + +build: + make pip + python3 kaniko-build.py --version + +dry: + make dry-run + +test: + make dry-run + +dry-run: + python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run + +pip: + rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED + pip3 install -r requirements.txt + pip install -r requirements.txt + +build-compose: + docker-compose build --compress --parallel --progress plain + +deploy: + make pip + python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug + +deploy-compose: + docker-compose push + +clean: + docker container prune -f + docker image prune -f + docker network prune -f + docker volume prune -f + docker system prune -af diff --git a/linux/ecosystem/atlassian/confluence/8/8.9.5/docker-compose.yml b/linux/ecosystem/atlassian/confluence/8/8.9.5/docker-compose.yml new file mode 100644 index 000000000..cd7f25231 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.9.5/docker-compose.yml @@ -0,0 +1,16 @@ +#version: '3' +services: + app: + image: "epicmorg/confluence:8.9.5" + build: + context: . + app-jdk11: + image: "epicmorg/confluence:8.9.5-jdk11" + build: + context: . + dockerfile: Dockerfile.jdk11 + app-jdk17: + image: "epicmorg/confluence:8.9.5-jdk17" + build: + context: . + dockerfile: Dockerfile.jdk17 diff --git a/linux/ecosystem/atlassian/confluence/8/8.9.5/entrypoint.sh b/linux/ecosystem/atlassian/confluence/8/8.9.5/entrypoint.sh new file mode 100755 index 000000000..250fc031a --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.9.5/entrypoint.sh @@ -0,0 +1,39 @@ +#!/bin/bash +set -euo pipefail + +export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") +export JRE_HOME="$JAVA_HOME/jre" +export JAVA_BINARY="$JRE_HOME/bin/java" +export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}') + + +# Setup Catalina Opts +: ${CATALINA_CONNECTOR_PROXYNAME:=} +: ${CATALINA_CONNECTOR_PROXYPORT:=} +: ${CATALINA_CONNECTOR_SCHEME:=http} +: ${CATALINA_CONNECTOR_SECURE:=false} + +: ${CATALINA_OPTS:=} + +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}" + +export CATALINA_OPTS + + +# Start Confluence as the correct user +if [ "${UID}" -eq 0 ]; then + echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}" + PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${CONFLUENCE_HOME}") + EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700 + if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then + chmod -R 700 "${CONFLUENCE_HOME}" && + chown -R "${RUN_USER}:${RUN_GROUP}" "${CONFLUENCE_HOME}" + fi + # Now drop privileges + exec su -s /bin/bash "${RUN_USER}" -c "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh $@" +else + exec "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh" "$@" +fi diff --git a/linux/ecosystem/atlassian/confluence/8/8.9.5/kaniko-build.py b/linux/ecosystem/atlassian/confluence/8/8.9.5/kaniko-build.py new file mode 100644 index 000000000..e693b5c17 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.9.5/kaniko-build.py @@ -0,0 +1,196 @@ +import os +import shutil +import argparse +import yaml +import subprocess +from collections import defaultdict +from concurrent.futures import ThreadPoolExecutor, as_completed +from dotenv import load_dotenv +import logging +import sys + +# Script version +SCRIPT_VERSION = "1.0.1.0" + +# ASCII art for EpicMorg +ASCII_ART = r""" ++=================================================+ +| ____| _) \ | | +| __| __ \ | __| |\/ | _ \ __| _` | | +| | | | | ( | | ( | | ( | | +|_____| .__/ _| \___| _| _| \___/ _| \__, | | +| | / _| _) | |___/ | +| ' / _` | __ \ | | / _ \ | +| . \ ( | | | | < ( | | +|_|\_\ \__,_| _| _| _| _|\_\ \___/ | +|\ \ / | +| \ \ \ / __| _` | __ \ __ \ _ \ __|| +| \ \ \ / | ( | | | | | __/ | | +| \_/\_/ _| \__,_| .__/ .__/ \___| _| | +| _| _| | ++=================================================+ +""" + +# Load environment variables from .env file +load_dotenv() + +def setup_logging(): + logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + +def parse_args(): + parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False) + parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file') + parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image') + parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry') + parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup') + parser.add_argument('--version', '-v', action='store_true', help='Show script version') + parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit') + return parser.parse_args() + +def load_compose_file(file_path): + with open(file_path, 'r') as file: + return yaml.safe_load(file) + +def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry): + kaniko_command = [ + 'docker', 'run', + '--rm', + '-t', + '-v', f'{os.path.abspath(build_context)}:/workspace', + ] + + # Add Docker config mounts for both read-only access + kaniko_command.extend([ + '-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon + '-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode + ]) + + kaniko_command.extend([ + kaniko_image, + '--context', '/workspace', + '--dockerfile', f'/workspace/{dockerfile}', + '--compressed-caching', + '--single-snapshot', + '--cleanup' + ]) + + if deploy: + kaniko_command.extend([ + '--destination', image_name + ]) + elif dry: + kaniko_command.extend([ + '--no-push' + ]) + else: + kaniko_command.extend([ + '--no-push' + ]) + + # Add build arguments if they exist + for arg_name, arg_value in build_args.items(): + kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}']) + + logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}") + + process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + + # Stream output in real-time + for line in process.stdout: + logging.info(line.strip()) + + process.wait() + + if process.returncode == 0: + logging.info(f"Successfully built {service_name}") + else: + for line in process.stderr: + logging.error(line.strip()) + logging.error(f"Error building {service_name}") + raise Exception(f"Failed to build {service_name}") + +def show_help(): + print(ASCII_ART) + print("EpicMorg: Kaniko-Compose Wrapper\n") + print("Arguments:") + print("--compose-file Path to docker-compose.yml file") + print("--kaniko-image Kaniko executor image") + print("--push, --deploy, -d, -p Deploy the built images to the registry") + print("--dry-run, --dry Dry run: build images without pushing and with cleanup") + print("--version, -v Show script version") + print("--help, -h Show this help message and exit") + +def show_version(): + print(ASCII_ART) + print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}") + +def main(): + setup_logging() + + args = parse_args() + + # Show help and exit if --help is provided + if args.help: + show_help() + return + + # Show version and exit if --version or no relevant arguments are provided + if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'): + show_version() + return + + compose_file = args.compose_file + kaniko_image = args.kaniko_image + deploy = args.push + dry = args.dry_run + + if not os.path.exists(compose_file): + logging.error(f"{compose_file} not found") + return + + compose_data = load_compose_file(compose_file) + + services = compose_data.get('services', {}) + image_names = defaultdict(int) + + for service_name, service_data in services.items(): + image_name = service_data.get('image') + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + image_names[image_name] += 1 + + for image_name, count in image_names.items(): + if count > 1: + logging.error(f"Error: Image name {image_name} is used {count} times.") + return + + try: + with ThreadPoolExecutor() as executor: + futures = [] + for service_name, service_data in services.items(): + build_data = service_data.get('build', {}) + build_context = build_data.get('context', '.') + dockerfile = build_data.get('dockerfile', 'Dockerfile') + image_name = service_data.get('image') + build_args = build_data.get('args', {}) + + # Substitute environment variables with their values if they exist + build_args = {key: os.getenv(key, value) for key, value in build_args.items()} + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry)) + + for future in as_completed(futures): + future.result() + except Exception as exc: + logging.error(f"Build failed: {exc}") + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/linux/ecosystem/atlassian/confluence/8/8.9.5/requirements.txt b/linux/ecosystem/atlassian/confluence/8/8.9.5/requirements.txt new file mode 100644 index 000000000..9ed771861 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/8/8.9.5/requirements.txt @@ -0,0 +1,2 @@ +PyYAML +python-dotenv diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.0/Dockerfile b/linux/ecosystem/atlassian/confluence/9/9.0.0/Dockerfile new file mode 100644 index 000000000..9f6b62d92 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.0/Dockerfile @@ -0,0 +1,48 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG RELEASE=9.0.0 +ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html +ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence +ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence + +VOLUME ["${CONFLUENCE_HOME}"] +WORKDIR $CONFLUENCE_HOME + +# Expose HTTP and Synchrony ports +EXPOSE 8090 +EXPOSE 8091 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \ + && sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.0/Dockerfile.jdk11 b/linux/ecosystem/atlassian/confluence/9/9.0.0/Dockerfile.jdk11 new file mode 100644 index 000000000..dd19c0012 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.0/Dockerfile.jdk11 @@ -0,0 +1,49 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG RELEASE=9.0.0 +ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html +ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence +ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence + +VOLUME ["${CONFLUENCE_HOME}"] +WORKDIR $CONFLUENCE_HOME + +# Expose HTTP and Synchrony ports +EXPOSE 8090 +EXPOSE 8091 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \ + && sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \ + + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.0/Dockerfile.jdk17 b/linux/ecosystem/atlassian/confluence/9/9.0.0/Dockerfile.jdk17 new file mode 100644 index 000000000..90e6e52de --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.0/Dockerfile.jdk17 @@ -0,0 +1,49 @@ +FROM epicmorg/debian:bookworm-jdk17 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG RELEASE=9.0.0 +ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html +ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence +ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence + +VOLUME ["${CONFLUENCE_HOME}"] +WORKDIR $CONFLUENCE_HOME + +# Expose HTTP and Synchrony ports +EXPOSE 8090 +EXPOSE 8091 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \ + && sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \ + + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.0/Makefile b/linux/ecosystem/atlassian/confluence/9/9.0.0/Makefile new file mode 100644 index 000000000..3383c9699 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.0/Makefile @@ -0,0 +1,50 @@ +PIP_BREAK_SYSTEM_PACKAGES=1 + +all: app + +app: + make build + make deploy + make clean + +build: + make pip + python3 kaniko-build.py --version + +dry: + make dry-run + +test: + make dry-run + +dry-run: + python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run + +pip: + rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED + pip3 install -r requirements.txt + pip install -r requirements.txt + +build-compose: + docker-compose build --compress --parallel --progress plain + +deploy: + make pip + python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug + +deploy-compose: + docker-compose push + +clean: + docker container prune -f + docker image prune -f + docker network prune -f + docker volume prune -f + docker system prune -af diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.0/docker-compose.yml b/linux/ecosystem/atlassian/confluence/9/9.0.0/docker-compose.yml new file mode 100644 index 000000000..b3addbe4d --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.0/docker-compose.yml @@ -0,0 +1,16 @@ +#version: '3' +services: + app: + image: "epicmorg/confluence:9.0.0" + build: + context: . + app-jdk11: + image: "epicmorg/confluence:9.0.0-jdk11" + build: + context: . + dockerfile: Dockerfile.jdk11 + app-jdk17: + image: "epicmorg/confluence:9.0.0-jdk17" + build: + context: . + dockerfile: Dockerfile.jdk17 diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.0/entrypoint.sh b/linux/ecosystem/atlassian/confluence/9/9.0.0/entrypoint.sh new file mode 100755 index 000000000..250fc031a --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.0/entrypoint.sh @@ -0,0 +1,39 @@ +#!/bin/bash +set -euo pipefail + +export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") +export JRE_HOME="$JAVA_HOME/jre" +export JAVA_BINARY="$JRE_HOME/bin/java" +export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}') + + +# Setup Catalina Opts +: ${CATALINA_CONNECTOR_PROXYNAME:=} +: ${CATALINA_CONNECTOR_PROXYPORT:=} +: ${CATALINA_CONNECTOR_SCHEME:=http} +: ${CATALINA_CONNECTOR_SECURE:=false} + +: ${CATALINA_OPTS:=} + +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}" + +export CATALINA_OPTS + + +# Start Confluence as the correct user +if [ "${UID}" -eq 0 ]; then + echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}" + PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${CONFLUENCE_HOME}") + EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700 + if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then + chmod -R 700 "${CONFLUENCE_HOME}" && + chown -R "${RUN_USER}:${RUN_GROUP}" "${CONFLUENCE_HOME}" + fi + # Now drop privileges + exec su -s /bin/bash "${RUN_USER}" -c "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh $@" +else + exec "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh" "$@" +fi diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.0/kaniko-build.py b/linux/ecosystem/atlassian/confluence/9/9.0.0/kaniko-build.py new file mode 100644 index 000000000..e693b5c17 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.0/kaniko-build.py @@ -0,0 +1,196 @@ +import os +import shutil +import argparse +import yaml +import subprocess +from collections import defaultdict +from concurrent.futures import ThreadPoolExecutor, as_completed +from dotenv import load_dotenv +import logging +import sys + +# Script version +SCRIPT_VERSION = "1.0.1.0" + +# ASCII art for EpicMorg +ASCII_ART = r""" ++=================================================+ +| ____| _) \ | | +| __| __ \ | __| |\/ | _ \ __| _` | | +| | | | | ( | | ( | | ( | | +|_____| .__/ _| \___| _| _| \___/ _| \__, | | +| | / _| _) | |___/ | +| ' / _` | __ \ | | / _ \ | +| . \ ( | | | | < ( | | +|_|\_\ \__,_| _| _| _| _|\_\ \___/ | +|\ \ / | +| \ \ \ / __| _` | __ \ __ \ _ \ __|| +| \ \ \ / | ( | | | | | __/ | | +| \_/\_/ _| \__,_| .__/ .__/ \___| _| | +| _| _| | ++=================================================+ +""" + +# Load environment variables from .env file +load_dotenv() + +def setup_logging(): + logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + +def parse_args(): + parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False) + parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file') + parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image') + parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry') + parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup') + parser.add_argument('--version', '-v', action='store_true', help='Show script version') + parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit') + return parser.parse_args() + +def load_compose_file(file_path): + with open(file_path, 'r') as file: + return yaml.safe_load(file) + +def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry): + kaniko_command = [ + 'docker', 'run', + '--rm', + '-t', + '-v', f'{os.path.abspath(build_context)}:/workspace', + ] + + # Add Docker config mounts for both read-only access + kaniko_command.extend([ + '-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon + '-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode + ]) + + kaniko_command.extend([ + kaniko_image, + '--context', '/workspace', + '--dockerfile', f'/workspace/{dockerfile}', + '--compressed-caching', + '--single-snapshot', + '--cleanup' + ]) + + if deploy: + kaniko_command.extend([ + '--destination', image_name + ]) + elif dry: + kaniko_command.extend([ + '--no-push' + ]) + else: + kaniko_command.extend([ + '--no-push' + ]) + + # Add build arguments if they exist + for arg_name, arg_value in build_args.items(): + kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}']) + + logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}") + + process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + + # Stream output in real-time + for line in process.stdout: + logging.info(line.strip()) + + process.wait() + + if process.returncode == 0: + logging.info(f"Successfully built {service_name}") + else: + for line in process.stderr: + logging.error(line.strip()) + logging.error(f"Error building {service_name}") + raise Exception(f"Failed to build {service_name}") + +def show_help(): + print(ASCII_ART) + print("EpicMorg: Kaniko-Compose Wrapper\n") + print("Arguments:") + print("--compose-file Path to docker-compose.yml file") + print("--kaniko-image Kaniko executor image") + print("--push, --deploy, -d, -p Deploy the built images to the registry") + print("--dry-run, --dry Dry run: build images without pushing and with cleanup") + print("--version, -v Show script version") + print("--help, -h Show this help message and exit") + +def show_version(): + print(ASCII_ART) + print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}") + +def main(): + setup_logging() + + args = parse_args() + + # Show help and exit if --help is provided + if args.help: + show_help() + return + + # Show version and exit if --version or no relevant arguments are provided + if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'): + show_version() + return + + compose_file = args.compose_file + kaniko_image = args.kaniko_image + deploy = args.push + dry = args.dry_run + + if not os.path.exists(compose_file): + logging.error(f"{compose_file} not found") + return + + compose_data = load_compose_file(compose_file) + + services = compose_data.get('services', {}) + image_names = defaultdict(int) + + for service_name, service_data in services.items(): + image_name = service_data.get('image') + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + image_names[image_name] += 1 + + for image_name, count in image_names.items(): + if count > 1: + logging.error(f"Error: Image name {image_name} is used {count} times.") + return + + try: + with ThreadPoolExecutor() as executor: + futures = [] + for service_name, service_data in services.items(): + build_data = service_data.get('build', {}) + build_context = build_data.get('context', '.') + dockerfile = build_data.get('dockerfile', 'Dockerfile') + image_name = service_data.get('image') + build_args = build_data.get('args', {}) + + # Substitute environment variables with their values if they exist + build_args = {key: os.getenv(key, value) for key, value in build_args.items()} + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry)) + + for future in as_completed(futures): + future.result() + except Exception as exc: + logging.error(f"Build failed: {exc}") + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.0/requirements.txt b/linux/ecosystem/atlassian/confluence/9/9.0.0/requirements.txt new file mode 100644 index 000000000..9ed771861 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.0/requirements.txt @@ -0,0 +1,2 @@ +PyYAML +python-dotenv diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.1/Dockerfile b/linux/ecosystem/atlassian/confluence/9/9.0.1/Dockerfile new file mode 100644 index 000000000..9c2ca5070 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.1/Dockerfile @@ -0,0 +1,48 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG RELEASE=9.0.1 +ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html +ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence +ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence + +VOLUME ["${CONFLUENCE_HOME}"] +WORKDIR $CONFLUENCE_HOME + +# Expose HTTP and Synchrony ports +EXPOSE 8090 +EXPOSE 8091 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \ + && sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.1/Dockerfile.jdk11 b/linux/ecosystem/atlassian/confluence/9/9.0.1/Dockerfile.jdk11 new file mode 100644 index 000000000..1c09826f8 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.1/Dockerfile.jdk11 @@ -0,0 +1,49 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG RELEASE=9.0.1 +ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html +ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence +ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence + +VOLUME ["${CONFLUENCE_HOME}"] +WORKDIR $CONFLUENCE_HOME + +# Expose HTTP and Synchrony ports +EXPOSE 8090 +EXPOSE 8091 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \ + && sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \ + + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.1/Dockerfile.jdk17 b/linux/ecosystem/atlassian/confluence/9/9.0.1/Dockerfile.jdk17 new file mode 100644 index 000000000..281d87a32 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.1/Dockerfile.jdk17 @@ -0,0 +1,49 @@ +FROM epicmorg/debian:bookworm-jdk17 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## +ARG RELEASE=9.0.1 +ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html +ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence +ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence + +VOLUME ["${CONFLUENCE_HOME}"] +WORKDIR $CONFLUENCE_HOME + +# Expose HTTP and Synchrony ports +EXPOSE 8090 +EXPOSE 8091 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \ + && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \ + && sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \ + + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.1/Makefile b/linux/ecosystem/atlassian/confluence/9/9.0.1/Makefile new file mode 100644 index 000000000..3383c9699 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.1/Makefile @@ -0,0 +1,50 @@ +PIP_BREAK_SYSTEM_PACKAGES=1 + +all: app + +app: + make build + make deploy + make clean + +build: + make pip + python3 kaniko-build.py --version + +dry: + make dry-run + +test: + make dry-run + +dry-run: + python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run + +pip: + rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED + pip3 install -r requirements.txt + pip install -r requirements.txt + +build-compose: + docker-compose build --compress --parallel --progress plain + +deploy: + make pip + python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug + +deploy-compose: + docker-compose push + +clean: + docker container prune -f + docker image prune -f + docker network prune -f + docker volume prune -f + docker system prune -af diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.1/docker-compose.yml b/linux/ecosystem/atlassian/confluence/9/9.0.1/docker-compose.yml new file mode 100644 index 000000000..08b7c3911 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.1/docker-compose.yml @@ -0,0 +1,16 @@ +#version: '3' +services: + app: + image: "epicmorg/confluence:9.0.1" + build: + context: . + app-jdk11: + image: "epicmorg/confluence:9.0.1-jdk11" + build: + context: . + dockerfile: Dockerfile.jdk11 + app-jdk17: + image: "epicmorg/confluence:9.0.1-jdk17" + build: + context: . + dockerfile: Dockerfile.jdk17 diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.1/entrypoint.sh b/linux/ecosystem/atlassian/confluence/9/9.0.1/entrypoint.sh new file mode 100755 index 000000000..250fc031a --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.1/entrypoint.sh @@ -0,0 +1,39 @@ +#!/bin/bash +set -euo pipefail + +export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") +export JRE_HOME="$JAVA_HOME/jre" +export JAVA_BINARY="$JRE_HOME/bin/java" +export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}') + + +# Setup Catalina Opts +: ${CATALINA_CONNECTOR_PROXYNAME:=} +: ${CATALINA_CONNECTOR_PROXYPORT:=} +: ${CATALINA_CONNECTOR_SCHEME:=http} +: ${CATALINA_CONNECTOR_SECURE:=false} + +: ${CATALINA_OPTS:=} + +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}" + +export CATALINA_OPTS + + +# Start Confluence as the correct user +if [ "${UID}" -eq 0 ]; then + echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}" + PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${CONFLUENCE_HOME}") + EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700 + if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then + chmod -R 700 "${CONFLUENCE_HOME}" && + chown -R "${RUN_USER}:${RUN_GROUP}" "${CONFLUENCE_HOME}" + fi + # Now drop privileges + exec su -s /bin/bash "${RUN_USER}" -c "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh $@" +else + exec "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh" "$@" +fi diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.1/kaniko-build.py b/linux/ecosystem/atlassian/confluence/9/9.0.1/kaniko-build.py new file mode 100644 index 000000000..e693b5c17 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.1/kaniko-build.py @@ -0,0 +1,196 @@ +import os +import shutil +import argparse +import yaml +import subprocess +from collections import defaultdict +from concurrent.futures import ThreadPoolExecutor, as_completed +from dotenv import load_dotenv +import logging +import sys + +# Script version +SCRIPT_VERSION = "1.0.1.0" + +# ASCII art for EpicMorg +ASCII_ART = r""" ++=================================================+ +| ____| _) \ | | +| __| __ \ | __| |\/ | _ \ __| _` | | +| | | | | ( | | ( | | ( | | +|_____| .__/ _| \___| _| _| \___/ _| \__, | | +| | / _| _) | |___/ | +| ' / _` | __ \ | | / _ \ | +| . \ ( | | | | < ( | | +|_|\_\ \__,_| _| _| _| _|\_\ \___/ | +|\ \ / | +| \ \ \ / __| _` | __ \ __ \ _ \ __|| +| \ \ \ / | ( | | | | | __/ | | +| \_/\_/ _| \__,_| .__/ .__/ \___| _| | +| _| _| | ++=================================================+ +""" + +# Load environment variables from .env file +load_dotenv() + +def setup_logging(): + logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + +def parse_args(): + parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False) + parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file') + parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image') + parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry') + parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup') + parser.add_argument('--version', '-v', action='store_true', help='Show script version') + parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit') + return parser.parse_args() + +def load_compose_file(file_path): + with open(file_path, 'r') as file: + return yaml.safe_load(file) + +def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry): + kaniko_command = [ + 'docker', 'run', + '--rm', + '-t', + '-v', f'{os.path.abspath(build_context)}:/workspace', + ] + + # Add Docker config mounts for both read-only access + kaniko_command.extend([ + '-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon + '-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode + ]) + + kaniko_command.extend([ + kaniko_image, + '--context', '/workspace', + '--dockerfile', f'/workspace/{dockerfile}', + '--compressed-caching', + '--single-snapshot', + '--cleanup' + ]) + + if deploy: + kaniko_command.extend([ + '--destination', image_name + ]) + elif dry: + kaniko_command.extend([ + '--no-push' + ]) + else: + kaniko_command.extend([ + '--no-push' + ]) + + # Add build arguments if they exist + for arg_name, arg_value in build_args.items(): + kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}']) + + logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}") + + process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + + # Stream output in real-time + for line in process.stdout: + logging.info(line.strip()) + + process.wait() + + if process.returncode == 0: + logging.info(f"Successfully built {service_name}") + else: + for line in process.stderr: + logging.error(line.strip()) + logging.error(f"Error building {service_name}") + raise Exception(f"Failed to build {service_name}") + +def show_help(): + print(ASCII_ART) + print("EpicMorg: Kaniko-Compose Wrapper\n") + print("Arguments:") + print("--compose-file Path to docker-compose.yml file") + print("--kaniko-image Kaniko executor image") + print("--push, --deploy, -d, -p Deploy the built images to the registry") + print("--dry-run, --dry Dry run: build images without pushing and with cleanup") + print("--version, -v Show script version") + print("--help, -h Show this help message and exit") + +def show_version(): + print(ASCII_ART) + print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}") + +def main(): + setup_logging() + + args = parse_args() + + # Show help and exit if --help is provided + if args.help: + show_help() + return + + # Show version and exit if --version or no relevant arguments are provided + if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'): + show_version() + return + + compose_file = args.compose_file + kaniko_image = args.kaniko_image + deploy = args.push + dry = args.dry_run + + if not os.path.exists(compose_file): + logging.error(f"{compose_file} not found") + return + + compose_data = load_compose_file(compose_file) + + services = compose_data.get('services', {}) + image_names = defaultdict(int) + + for service_name, service_data in services.items(): + image_name = service_data.get('image') + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + image_names[image_name] += 1 + + for image_name, count in image_names.items(): + if count > 1: + logging.error(f"Error: Image name {image_name} is used {count} times.") + return + + try: + with ThreadPoolExecutor() as executor: + futures = [] + for service_name, service_data in services.items(): + build_data = service_data.get('build', {}) + build_context = build_data.get('context', '.') + dockerfile = build_data.get('dockerfile', 'Dockerfile') + image_name = service_data.get('image') + build_args = build_data.get('args', {}) + + # Substitute environment variables with their values if they exist + build_args = {key: os.getenv(key, value) for key, value in build_args.items()} + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry)) + + for future in as_completed(futures): + future.result() + except Exception as exc: + logging.error(f"Build failed: {exc}") + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/linux/ecosystem/atlassian/confluence/9/9.0.1/requirements.txt b/linux/ecosystem/atlassian/confluence/9/9.0.1/requirements.txt new file mode 100644 index 000000000..9ed771861 --- /dev/null +++ b/linux/ecosystem/atlassian/confluence/9/9.0.1/requirements.txt @@ -0,0 +1,2 @@ +PyYAML +python-dotenv diff --git a/linux/ecosystem/atlassian/jira/9/9.12.12/Dockerfile b/linux/ecosystem/atlassian/jira/9/9.12.12/Dockerfile new file mode 100644 index 000000000..cfbeaa2b8 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.12.12/Dockerfile @@ -0,0 +1,53 @@ +FROM epicmorg/debian:bookworm-jdk8 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## + +ARG RELEASE=9.12.12 +ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files +ENV JIRA_HOME /var/atlassian/application-data/jira +ENV JIRA_INSTALL_DIR /opt/atlassian/jira + +VOLUME ["${JIRA_HOME}"] +WORKDIR $JIRA_HOME + +# Expose HTTP port +EXPOSE 8080 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${JIRA_INSTALL_DIR} \ + && wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \ + && tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \ + && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \ + && sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb && \ + rm -rfv /tmp/* + + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/jira/9/9.12.12/Dockerfile.jdk11 b/linux/ecosystem/atlassian/jira/9/9.12.12/Dockerfile.jdk11 new file mode 100644 index 000000000..a0d16cdb7 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.12.12/Dockerfile.jdk11 @@ -0,0 +1,52 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## + +ARG RELEASE=9.12.12 +ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files +ENV JIRA_HOME /var/atlassian/application-data/jira +ENV JIRA_INSTALL_DIR /opt/atlassian/jira + +VOLUME ["${JIRA_HOME}"] +WORKDIR $JIRA_HOME + +# Expose HTTP port +EXPOSE 8080 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${JIRA_INSTALL_DIR} \ + && wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \ + && tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \ + && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \ + && sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb && \ + rm -rfv /tmp/* + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/jira/9/9.12.12/Dockerfile.jdk17 b/linux/ecosystem/atlassian/jira/9/9.12.12/Dockerfile.jdk17 new file mode 100644 index 000000000..a5d7e379c --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.12.12/Dockerfile.jdk17 @@ -0,0 +1,52 @@ +FROM epicmorg/debian:bookworm-jdk17 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## + +ARG RELEASE=9.12.12 +ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files +ENV JIRA_HOME /var/atlassian/application-data/jira +ENV JIRA_INSTALL_DIR /opt/atlassian/jira + +VOLUME ["${JIRA_HOME}"] +WORKDIR $JIRA_HOME + +# Expose HTTP port +EXPOSE 8080 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${JIRA_INSTALL_DIR} \ + && wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \ + && tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \ + && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \ + && sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb && \ + rm -rfv /tmp/* + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/jira/9/9.12.12/Makefile b/linux/ecosystem/atlassian/jira/9/9.12.12/Makefile new file mode 100644 index 000000000..3383c9699 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.12.12/Makefile @@ -0,0 +1,50 @@ +PIP_BREAK_SYSTEM_PACKAGES=1 + +all: app + +app: + make build + make deploy + make clean + +build: + make pip + python3 kaniko-build.py --version + +dry: + make dry-run + +test: + make dry-run + +dry-run: + python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run + +pip: + rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED + pip3 install -r requirements.txt + pip install -r requirements.txt + +build-compose: + docker-compose build --compress --parallel --progress plain + +deploy: + make pip + python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug + +deploy-compose: + docker-compose push + +clean: + docker container prune -f + docker image prune -f + docker network prune -f + docker volume prune -f + docker system prune -af diff --git a/linux/ecosystem/atlassian/jira/9/9.12.12/docker-compose.yml b/linux/ecosystem/atlassian/jira/9/9.12.12/docker-compose.yml new file mode 100644 index 000000000..90b0a227d --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.12.12/docker-compose.yml @@ -0,0 +1,16 @@ +#version: '3' +services: + app: + image: "epicmorg/jira:9.12.12" + build: + context: . + app-jdk11: + image: "epicmorg/jira:9.12.12-jdk11" + build: + context: . + dockerfile: Dockerfile.jdk11 + app-jdk17: + image: "epicmorg/jira:9.12.12-jdk17" + build: + context: . + dockerfile: Dockerfile.jdk17 diff --git a/linux/ecosystem/atlassian/jira/9/9.12.12/entrypoint.sh b/linux/ecosystem/atlassian/jira/9/9.12.12/entrypoint.sh new file mode 100755 index 000000000..50ee4ecd1 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.12.12/entrypoint.sh @@ -0,0 +1,89 @@ +#!/bin/bash +set -euo pipefail + +export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") +export JRE_HOME="$JAVA_HOME/jre" +export JAVA_BINARY="$JRE_HOME/bin/java" +export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}') + +# Setup Catalina Opts +: ${CATALINA_CONNECTOR_PROXYNAME:=} +: ${CATALINA_CONNECTOR_PROXYPORT:=} +: ${CATALINA_CONNECTOR_SCHEME:=http} +: ${CATALINA_CONNECTOR_SECURE:=false} + +: ${CATALINA_OPTS:=} + +: ${JAVA_OPTS:=} + +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}" + +export JAVA_OPTS="${JAVA_OPTS} ${CATALINA_OPTS}" + +# Setup Data Center configuration +if [ ! -f "/etc/container_id" ]; then + uuidgen > /etc/container_id +fi +CONTAINER_ID=$(cat /etc/container_id) +CONTAINER_SHORT_ID=${CONTAINER_ID::8} + +: ${CLUSTERED:=false} +: ${JIRA_NODE_ID:=jira_node_${CONTAINER_SHORT_ID}} +: ${JIRA_SHARED_HOME:=${JIRA_HOME}/shared} +: ${EHCACHE_PEER_DISCOVERY:=} +: ${EHCACHE_LISTENER_HOSTNAME:=} +: ${EHCACHE_LISTENER_PORT:=} +: ${EHCACHE_LISTENER_SOCKETTIMEOUTMILLIS:=} +: ${EHCACHE_MULTICAST_ADDRESS:=} +: ${EHCACHE_MULTICAST_PORT:=} +: ${EHCACHE_MULTICAST_TIMETOLIVE:=} +: ${EHCACHE_MULTICAST_HOSTNAME:=} + +# Cleanly set/unset values in cluster.properties +function set_cluster_property { + if [ -z $2 ]; then + if [ -f "${JIRA_HOME}/cluster.properties" ]; then + sed -i -e "/^${1}/d" "${JIRA_HOME}/cluster.properties" + fi + return + fi + if [ ! -f "${JIRA_HOME}/cluster.properties" ]; then + echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties" + elif grep "^${1}" "${JIRA_HOME}/cluster.properties"; then + sed -i -e "s#^${1}=.*#${1}=${2}#g" "${JIRA_HOME}/cluster.properties" + else + echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties" + fi +} + +if [ "${CLUSTERED}" == "true" ]; then + set_cluster_property "jira.node.id" "${JIRA_NODE_ID}" + set_cluster_property "jira.shared.home" "${JIRA_SHARED_HOME}" + set_cluster_property "ehcache.peer.discovery" "${EHCACHE_PEER_DISCOVERY}" + set_cluster_property "ehcache.listener.hostName" "${EHCACHE_LISTENER_HOSTNAME}" + set_cluster_property "ehcache.listener.port" "${EHCACHE_LISTENER_PORT}" + set_cluster_property "ehcache.listener.socketTimeoutMillis" "${EHCACHE_LISTENER_PORT}" + set_cluster_property "ehcache.multicast.address" "${EHCACHE_MULTICAST_ADDRESS}" + set_cluster_property "ehcache.multicast.port" "${EHCACHE_MULTICAST_PORT}" + set_cluster_property "ehcache.multicast.timeToLive" "${EHCACHE_MULTICAST_TIMETOLIVE}" + set_cluster_property "ehcache.multicast.hostName" "${EHCACHE_MULTICAST_HOSTNAME}" +fi + + +# Start Jira as the correct user +if [ "${UID}" -eq 0 ]; then + echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}" + PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${JIRA_HOME}") + EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700 + if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then + chmod -R 700 "${JIRA_HOME}" && + chown -R "${RUN_USER}:${RUN_GROUP}" "${JIRA_HOME}" + fi + # Now drop privileges + exec su -s /bin/bash "${RUN_USER}" -c "$JIRA_INSTALL_DIR/bin/start-jira.sh $@" +else + exec "$JIRA_INSTALL_DIR/bin/start-jira.sh" "$@" +fi diff --git a/linux/ecosystem/atlassian/jira/9/9.12.12/kaniko-build.py b/linux/ecosystem/atlassian/jira/9/9.12.12/kaniko-build.py new file mode 100644 index 000000000..e693b5c17 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.12.12/kaniko-build.py @@ -0,0 +1,196 @@ +import os +import shutil +import argparse +import yaml +import subprocess +from collections import defaultdict +from concurrent.futures import ThreadPoolExecutor, as_completed +from dotenv import load_dotenv +import logging +import sys + +# Script version +SCRIPT_VERSION = "1.0.1.0" + +# ASCII art for EpicMorg +ASCII_ART = r""" ++=================================================+ +| ____| _) \ | | +| __| __ \ | __| |\/ | _ \ __| _` | | +| | | | | ( | | ( | | ( | | +|_____| .__/ _| \___| _| _| \___/ _| \__, | | +| | / _| _) | |___/ | +| ' / _` | __ \ | | / _ \ | +| . \ ( | | | | < ( | | +|_|\_\ \__,_| _| _| _| _|\_\ \___/ | +|\ \ / | +| \ \ \ / __| _` | __ \ __ \ _ \ __|| +| \ \ \ / | ( | | | | | __/ | | +| \_/\_/ _| \__,_| .__/ .__/ \___| _| | +| _| _| | ++=================================================+ +""" + +# Load environment variables from .env file +load_dotenv() + +def setup_logging(): + logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + +def parse_args(): + parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False) + parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file') + parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image') + parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry') + parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup') + parser.add_argument('--version', '-v', action='store_true', help='Show script version') + parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit') + return parser.parse_args() + +def load_compose_file(file_path): + with open(file_path, 'r') as file: + return yaml.safe_load(file) + +def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry): + kaniko_command = [ + 'docker', 'run', + '--rm', + '-t', + '-v', f'{os.path.abspath(build_context)}:/workspace', + ] + + # Add Docker config mounts for both read-only access + kaniko_command.extend([ + '-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon + '-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode + ]) + + kaniko_command.extend([ + kaniko_image, + '--context', '/workspace', + '--dockerfile', f'/workspace/{dockerfile}', + '--compressed-caching', + '--single-snapshot', + '--cleanup' + ]) + + if deploy: + kaniko_command.extend([ + '--destination', image_name + ]) + elif dry: + kaniko_command.extend([ + '--no-push' + ]) + else: + kaniko_command.extend([ + '--no-push' + ]) + + # Add build arguments if they exist + for arg_name, arg_value in build_args.items(): + kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}']) + + logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}") + + process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + + # Stream output in real-time + for line in process.stdout: + logging.info(line.strip()) + + process.wait() + + if process.returncode == 0: + logging.info(f"Successfully built {service_name}") + else: + for line in process.stderr: + logging.error(line.strip()) + logging.error(f"Error building {service_name}") + raise Exception(f"Failed to build {service_name}") + +def show_help(): + print(ASCII_ART) + print("EpicMorg: Kaniko-Compose Wrapper\n") + print("Arguments:") + print("--compose-file Path to docker-compose.yml file") + print("--kaniko-image Kaniko executor image") + print("--push, --deploy, -d, -p Deploy the built images to the registry") + print("--dry-run, --dry Dry run: build images without pushing and with cleanup") + print("--version, -v Show script version") + print("--help, -h Show this help message and exit") + +def show_version(): + print(ASCII_ART) + print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}") + +def main(): + setup_logging() + + args = parse_args() + + # Show help and exit if --help is provided + if args.help: + show_help() + return + + # Show version and exit if --version or no relevant arguments are provided + if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'): + show_version() + return + + compose_file = args.compose_file + kaniko_image = args.kaniko_image + deploy = args.push + dry = args.dry_run + + if not os.path.exists(compose_file): + logging.error(f"{compose_file} not found") + return + + compose_data = load_compose_file(compose_file) + + services = compose_data.get('services', {}) + image_names = defaultdict(int) + + for service_name, service_data in services.items(): + image_name = service_data.get('image') + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + image_names[image_name] += 1 + + for image_name, count in image_names.items(): + if count > 1: + logging.error(f"Error: Image name {image_name} is used {count} times.") + return + + try: + with ThreadPoolExecutor() as executor: + futures = [] + for service_name, service_data in services.items(): + build_data = service_data.get('build', {}) + build_context = build_data.get('context', '.') + dockerfile = build_data.get('dockerfile', 'Dockerfile') + image_name = service_data.get('image') + build_args = build_data.get('args', {}) + + # Substitute environment variables with their values if they exist + build_args = {key: os.getenv(key, value) for key, value in build_args.items()} + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry)) + + for future in as_completed(futures): + future.result() + except Exception as exc: + logging.error(f"Build failed: {exc}") + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/linux/ecosystem/atlassian/jira/9/9.12.12/requirements.txt b/linux/ecosystem/atlassian/jira/9/9.12.12/requirements.txt new file mode 100644 index 000000000..9ed771861 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.12.12/requirements.txt @@ -0,0 +1,2 @@ +PyYAML +python-dotenv diff --git a/linux/ecosystem/atlassian/jira/9/9.12.2/.env b/linux/ecosystem/atlassian/jira/9/9.12.2/.env deleted file mode 100644 index ba7f96020..000000000 --- a/linux/ecosystem/atlassian/jira/9/9.12.2/.env +++ /dev/null @@ -1,2 +0,0 @@ -RELEASE=9.12.2 -DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz \ No newline at end of file diff --git a/linux/ecosystem/atlassian/jira/9/9.12.2/Dockerfile b/linux/ecosystem/atlassian/jira/9/9.12.2/Dockerfile index d3d23294c..fc5e8155b 100644 --- a/linux/ecosystem/atlassian/jira/9/9.12.2/Dockerfile +++ b/linux/ecosystem/atlassian/jira/9/9.12.2/Dockerfile @@ -6,8 +6,8 @@ ARG DEBIAN_FRONTEND=noninteractive # ARGuments ################################################################## -ARG RELEASE -ARG DOWNLOAD_URL +ARG RELEASE=9.12.2 +ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz ################################################################## # Setup @@ -29,7 +29,8 @@ EXPOSE 8080 # Installing ################################################################## RUN mkdir -p ${JIRA_INSTALL_DIR} \ - && curl --user-agent "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/81.0" -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ + && wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \ + && tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \ && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ diff --git a/linux/ecosystem/atlassian/jira/9/9.12.2/Dockerfile.jdk11 b/linux/ecosystem/atlassian/jira/9/9.12.2/Dockerfile.jdk11 index a1c1e41d7..a8a1a7c4b 100644 --- a/linux/ecosystem/atlassian/jira/9/9.12.2/Dockerfile.jdk11 +++ b/linux/ecosystem/atlassian/jira/9/9.12.2/Dockerfile.jdk11 @@ -6,8 +6,8 @@ ARG DEBIAN_FRONTEND=noninteractive # ARGuments ################################################################## -ARG RELEASE -ARG DOWNLOAD_URL +ARG RELEASE=9.12.2 +ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz ################################################################## # Setup @@ -29,7 +29,8 @@ EXPOSE 8080 # Installing ################################################################## RUN mkdir -p ${JIRA_INSTALL_DIR} \ - && curl --user-agent "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/81.0" -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ + && wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \ + && tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \ && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ diff --git a/linux/ecosystem/atlassian/jira/9/9.12.2/Dockerfile.jdk17 b/linux/ecosystem/atlassian/jira/9/9.12.2/Dockerfile.jdk17 index fdd79def6..1e624719b 100644 --- a/linux/ecosystem/atlassian/jira/9/9.12.2/Dockerfile.jdk17 +++ b/linux/ecosystem/atlassian/jira/9/9.12.2/Dockerfile.jdk17 @@ -6,8 +6,8 @@ ARG DEBIAN_FRONTEND=noninteractive # ARGuments ################################################################## -ARG RELEASE -ARG DOWNLOAD_URL +ARG RELEASE=9.12.2 +ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz ################################################################## # Setup @@ -29,7 +29,8 @@ EXPOSE 8080 # Installing ################################################################## RUN mkdir -p ${JIRA_INSTALL_DIR} \ - && curl --user-agent "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/81.0" -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ + && wget --random-wait --retry-connrefused --waitretry=5 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \ + && tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \ && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ diff --git a/linux/ecosystem/atlassian/jira/9/9.12.2/docker-compose.yml b/linux/ecosystem/atlassian/jira/9/9.12.2/docker-compose.yml index 32c492ee6..bbd71d7b7 100644 --- a/linux/ecosystem/atlassian/jira/9/9.12.2/docker-compose.yml +++ b/linux/ecosystem/atlassian/jira/9/9.12.2/docker-compose.yml @@ -1,25 +1,16 @@ #version: '3' services: app: - image: "epicmorg/jira:${RELEASE}" + image: "epicmorg/jira:9.12.2" build: context: . - args: - RELEASE: ${RELEASE} - DOWNLOAD_URL: ${DOWNLOAD_URL} app-jdk11: - image: "epicmorg/jira:${RELEASE}-jdk11" + image: "epicmorg/jira:9.12.2-jdk11" build: context: . dockerfile: Dockerfile.jdk11 - args: - RELEASE: ${RELEASE} - DOWNLOAD_URL: ${DOWNLOAD_URL} app-jdk17: - image: "epicmorg/jira:${RELEASE}-jdk17" + image: "epicmorg/jira:9.12.2-jdk17" build: context: . dockerfile: Dockerfile.jdk17 - args: - RELEASE: ${RELEASE} - DOWNLOAD_URL: ${DOWNLOAD_URL} diff --git a/linux/ecosystem/atlassian/jira/9/9.14.1/Dockerfile b/linux/ecosystem/atlassian/jira/9/9.14.1/Dockerfile new file mode 100644 index 000000000..3da7edb02 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.14.1/Dockerfile @@ -0,0 +1,53 @@ +FROM epicmorg/debian:bookworm-jdk8 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## + +ARG RELEASE=9.14.1 +ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files +ENV JIRA_HOME /var/atlassian/application-data/jira +ENV JIRA_INSTALL_DIR /opt/atlassian/jira + +VOLUME ["${JIRA_HOME}"] +WORKDIR $JIRA_HOME + +# Expose HTTP port +EXPOSE 8080 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${JIRA_INSTALL_DIR} \ + && wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \ + && tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \ + && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \ + && sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb && \ + rm -rfv /tmp/* + + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/jira/9/9.14.1/Dockerfile.jdk11 b/linux/ecosystem/atlassian/jira/9/9.14.1/Dockerfile.jdk11 new file mode 100644 index 000000000..6775c8017 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.14.1/Dockerfile.jdk11 @@ -0,0 +1,52 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## + +ARG RELEASE=9.14.1 +ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files +ENV JIRA_HOME /var/atlassian/application-data/jira +ENV JIRA_INSTALL_DIR /opt/atlassian/jira + +VOLUME ["${JIRA_HOME}"] +WORKDIR $JIRA_HOME + +# Expose HTTP port +EXPOSE 8080 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${JIRA_INSTALL_DIR} \ + && wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \ + && tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \ + && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \ + && sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb && \ + rm -rfv /tmp/* + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/jira/9/9.14.1/Dockerfile.jdk17 b/linux/ecosystem/atlassian/jira/9/9.14.1/Dockerfile.jdk17 new file mode 100644 index 000000000..f4a52bbca --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.14.1/Dockerfile.jdk17 @@ -0,0 +1,52 @@ +FROM epicmorg/debian:bookworm-jdk17 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## + +ARG RELEASE=9.14.1 +ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files +ENV JIRA_HOME /var/atlassian/application-data/jira +ENV JIRA_INSTALL_DIR /opt/atlassian/jira + +VOLUME ["${JIRA_HOME}"] +WORKDIR $JIRA_HOME + +# Expose HTTP port +EXPOSE 8080 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${JIRA_INSTALL_DIR} \ + && wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \ + && tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \ + && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \ + && sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb && \ + rm -rfv /tmp/* + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/jira/9/9.14.1/Makefile b/linux/ecosystem/atlassian/jira/9/9.14.1/Makefile new file mode 100644 index 000000000..3383c9699 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.14.1/Makefile @@ -0,0 +1,50 @@ +PIP_BREAK_SYSTEM_PACKAGES=1 + +all: app + +app: + make build + make deploy + make clean + +build: + make pip + python3 kaniko-build.py --version + +dry: + make dry-run + +test: + make dry-run + +dry-run: + python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run + +pip: + rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED + pip3 install -r requirements.txt + pip install -r requirements.txt + +build-compose: + docker-compose build --compress --parallel --progress plain + +deploy: + make pip + python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug + +deploy-compose: + docker-compose push + +clean: + docker container prune -f + docker image prune -f + docker network prune -f + docker volume prune -f + docker system prune -af diff --git a/linux/ecosystem/atlassian/jira/9/9.14.1/docker-compose.yml b/linux/ecosystem/atlassian/jira/9/9.14.1/docker-compose.yml new file mode 100644 index 000000000..caa448ba8 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.14.1/docker-compose.yml @@ -0,0 +1,16 @@ +#version: '3' +services: + app: + image: "epicmorg/jira:9.14.1" + build: + context: . + app-jdk11: + image: "epicmorg/jira:9.14.1-jdk11" + build: + context: . + dockerfile: Dockerfile.jdk11 + app-jdk17: + image: "epicmorg/jira:9.14.1-jdk17" + build: + context: . + dockerfile: Dockerfile.jdk17 diff --git a/linux/ecosystem/atlassian/jira/9/9.14.1/entrypoint.sh b/linux/ecosystem/atlassian/jira/9/9.14.1/entrypoint.sh new file mode 100755 index 000000000..50ee4ecd1 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.14.1/entrypoint.sh @@ -0,0 +1,89 @@ +#!/bin/bash +set -euo pipefail + +export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") +export JRE_HOME="$JAVA_HOME/jre" +export JAVA_BINARY="$JRE_HOME/bin/java" +export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}') + +# Setup Catalina Opts +: ${CATALINA_CONNECTOR_PROXYNAME:=} +: ${CATALINA_CONNECTOR_PROXYPORT:=} +: ${CATALINA_CONNECTOR_SCHEME:=http} +: ${CATALINA_CONNECTOR_SECURE:=false} + +: ${CATALINA_OPTS:=} + +: ${JAVA_OPTS:=} + +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}" + +export JAVA_OPTS="${JAVA_OPTS} ${CATALINA_OPTS}" + +# Setup Data Center configuration +if [ ! -f "/etc/container_id" ]; then + uuidgen > /etc/container_id +fi +CONTAINER_ID=$(cat /etc/container_id) +CONTAINER_SHORT_ID=${CONTAINER_ID::8} + +: ${CLUSTERED:=false} +: ${JIRA_NODE_ID:=jira_node_${CONTAINER_SHORT_ID}} +: ${JIRA_SHARED_HOME:=${JIRA_HOME}/shared} +: ${EHCACHE_PEER_DISCOVERY:=} +: ${EHCACHE_LISTENER_HOSTNAME:=} +: ${EHCACHE_LISTENER_PORT:=} +: ${EHCACHE_LISTENER_SOCKETTIMEOUTMILLIS:=} +: ${EHCACHE_MULTICAST_ADDRESS:=} +: ${EHCACHE_MULTICAST_PORT:=} +: ${EHCACHE_MULTICAST_TIMETOLIVE:=} +: ${EHCACHE_MULTICAST_HOSTNAME:=} + +# Cleanly set/unset values in cluster.properties +function set_cluster_property { + if [ -z $2 ]; then + if [ -f "${JIRA_HOME}/cluster.properties" ]; then + sed -i -e "/^${1}/d" "${JIRA_HOME}/cluster.properties" + fi + return + fi + if [ ! -f "${JIRA_HOME}/cluster.properties" ]; then + echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties" + elif grep "^${1}" "${JIRA_HOME}/cluster.properties"; then + sed -i -e "s#^${1}=.*#${1}=${2}#g" "${JIRA_HOME}/cluster.properties" + else + echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties" + fi +} + +if [ "${CLUSTERED}" == "true" ]; then + set_cluster_property "jira.node.id" "${JIRA_NODE_ID}" + set_cluster_property "jira.shared.home" "${JIRA_SHARED_HOME}" + set_cluster_property "ehcache.peer.discovery" "${EHCACHE_PEER_DISCOVERY}" + set_cluster_property "ehcache.listener.hostName" "${EHCACHE_LISTENER_HOSTNAME}" + set_cluster_property "ehcache.listener.port" "${EHCACHE_LISTENER_PORT}" + set_cluster_property "ehcache.listener.socketTimeoutMillis" "${EHCACHE_LISTENER_PORT}" + set_cluster_property "ehcache.multicast.address" "${EHCACHE_MULTICAST_ADDRESS}" + set_cluster_property "ehcache.multicast.port" "${EHCACHE_MULTICAST_PORT}" + set_cluster_property "ehcache.multicast.timeToLive" "${EHCACHE_MULTICAST_TIMETOLIVE}" + set_cluster_property "ehcache.multicast.hostName" "${EHCACHE_MULTICAST_HOSTNAME}" +fi + + +# Start Jira as the correct user +if [ "${UID}" -eq 0 ]; then + echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}" + PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${JIRA_HOME}") + EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700 + if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then + chmod -R 700 "${JIRA_HOME}" && + chown -R "${RUN_USER}:${RUN_GROUP}" "${JIRA_HOME}" + fi + # Now drop privileges + exec su -s /bin/bash "${RUN_USER}" -c "$JIRA_INSTALL_DIR/bin/start-jira.sh $@" +else + exec "$JIRA_INSTALL_DIR/bin/start-jira.sh" "$@" +fi diff --git a/linux/ecosystem/atlassian/jira/9/9.14.1/kaniko-build.py b/linux/ecosystem/atlassian/jira/9/9.14.1/kaniko-build.py new file mode 100644 index 000000000..e693b5c17 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.14.1/kaniko-build.py @@ -0,0 +1,196 @@ +import os +import shutil +import argparse +import yaml +import subprocess +from collections import defaultdict +from concurrent.futures import ThreadPoolExecutor, as_completed +from dotenv import load_dotenv +import logging +import sys + +# Script version +SCRIPT_VERSION = "1.0.1.0" + +# ASCII art for EpicMorg +ASCII_ART = r""" ++=================================================+ +| ____| _) \ | | +| __| __ \ | __| |\/ | _ \ __| _` | | +| | | | | ( | | ( | | ( | | +|_____| .__/ _| \___| _| _| \___/ _| \__, | | +| | / _| _) | |___/ | +| ' / _` | __ \ | | / _ \ | +| . \ ( | | | | < ( | | +|_|\_\ \__,_| _| _| _| _|\_\ \___/ | +|\ \ / | +| \ \ \ / __| _` | __ \ __ \ _ \ __|| +| \ \ \ / | ( | | | | | __/ | | +| \_/\_/ _| \__,_| .__/ .__/ \___| _| | +| _| _| | ++=================================================+ +""" + +# Load environment variables from .env file +load_dotenv() + +def setup_logging(): + logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + +def parse_args(): + parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False) + parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file') + parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image') + parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry') + parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup') + parser.add_argument('--version', '-v', action='store_true', help='Show script version') + parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit') + return parser.parse_args() + +def load_compose_file(file_path): + with open(file_path, 'r') as file: + return yaml.safe_load(file) + +def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry): + kaniko_command = [ + 'docker', 'run', + '--rm', + '-t', + '-v', f'{os.path.abspath(build_context)}:/workspace', + ] + + # Add Docker config mounts for both read-only access + kaniko_command.extend([ + '-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon + '-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode + ]) + + kaniko_command.extend([ + kaniko_image, + '--context', '/workspace', + '--dockerfile', f'/workspace/{dockerfile}', + '--compressed-caching', + '--single-snapshot', + '--cleanup' + ]) + + if deploy: + kaniko_command.extend([ + '--destination', image_name + ]) + elif dry: + kaniko_command.extend([ + '--no-push' + ]) + else: + kaniko_command.extend([ + '--no-push' + ]) + + # Add build arguments if they exist + for arg_name, arg_value in build_args.items(): + kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}']) + + logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}") + + process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + + # Stream output in real-time + for line in process.stdout: + logging.info(line.strip()) + + process.wait() + + if process.returncode == 0: + logging.info(f"Successfully built {service_name}") + else: + for line in process.stderr: + logging.error(line.strip()) + logging.error(f"Error building {service_name}") + raise Exception(f"Failed to build {service_name}") + +def show_help(): + print(ASCII_ART) + print("EpicMorg: Kaniko-Compose Wrapper\n") + print("Arguments:") + print("--compose-file Path to docker-compose.yml file") + print("--kaniko-image Kaniko executor image") + print("--push, --deploy, -d, -p Deploy the built images to the registry") + print("--dry-run, --dry Dry run: build images without pushing and with cleanup") + print("--version, -v Show script version") + print("--help, -h Show this help message and exit") + +def show_version(): + print(ASCII_ART) + print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}") + +def main(): + setup_logging() + + args = parse_args() + + # Show help and exit if --help is provided + if args.help: + show_help() + return + + # Show version and exit if --version or no relevant arguments are provided + if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'): + show_version() + return + + compose_file = args.compose_file + kaniko_image = args.kaniko_image + deploy = args.push + dry = args.dry_run + + if not os.path.exists(compose_file): + logging.error(f"{compose_file} not found") + return + + compose_data = load_compose_file(compose_file) + + services = compose_data.get('services', {}) + image_names = defaultdict(int) + + for service_name, service_data in services.items(): + image_name = service_data.get('image') + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + image_names[image_name] += 1 + + for image_name, count in image_names.items(): + if count > 1: + logging.error(f"Error: Image name {image_name} is used {count} times.") + return + + try: + with ThreadPoolExecutor() as executor: + futures = [] + for service_name, service_data in services.items(): + build_data = service_data.get('build', {}) + build_context = build_data.get('context', '.') + dockerfile = build_data.get('dockerfile', 'Dockerfile') + image_name = service_data.get('image') + build_args = build_data.get('args', {}) + + # Substitute environment variables with their values if they exist + build_args = {key: os.getenv(key, value) for key, value in build_args.items()} + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry)) + + for future in as_completed(futures): + future.result() + except Exception as exc: + logging.error(f"Build failed: {exc}") + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/linux/ecosystem/atlassian/jira/9/9.14.1/requirements.txt b/linux/ecosystem/atlassian/jira/9/9.14.1/requirements.txt new file mode 100644 index 000000000..9ed771861 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.14.1/requirements.txt @@ -0,0 +1,2 @@ +PyYAML +python-dotenv diff --git a/linux/ecosystem/atlassian/jira/9/9.16.1/Dockerfile b/linux/ecosystem/atlassian/jira/9/9.16.1/Dockerfile new file mode 100644 index 000000000..815204e4d --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.16.1/Dockerfile @@ -0,0 +1,53 @@ +FROM epicmorg/debian:bookworm-jdk8 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## + +ARG RELEASE=9.16.1 +ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files +ENV JIRA_HOME /var/atlassian/application-data/jira +ENV JIRA_INSTALL_DIR /opt/atlassian/jira + +VOLUME ["${JIRA_HOME}"] +WORKDIR $JIRA_HOME + +# Expose HTTP port +EXPOSE 8080 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${JIRA_INSTALL_DIR} \ + && wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \ + && tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \ + && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \ + && sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb && \ + rm -rfv /tmp/* + + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/jira/9/9.16.1/Dockerfile.jdk11 b/linux/ecosystem/atlassian/jira/9/9.16.1/Dockerfile.jdk11 new file mode 100644 index 000000000..4c75a446d --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.16.1/Dockerfile.jdk11 @@ -0,0 +1,52 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## + +ARG RELEASE=9.16.1 +ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files +ENV JIRA_HOME /var/atlassian/application-data/jira +ENV JIRA_INSTALL_DIR /opt/atlassian/jira + +VOLUME ["${JIRA_HOME}"] +WORKDIR $JIRA_HOME + +# Expose HTTP port +EXPOSE 8080 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${JIRA_INSTALL_DIR} \ + && wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \ + && tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \ + && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \ + && sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb && \ + rm -rfv /tmp/* + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/jira/9/9.16.1/Dockerfile.jdk17 b/linux/ecosystem/atlassian/jira/9/9.16.1/Dockerfile.jdk17 new file mode 100644 index 000000000..137514a28 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.16.1/Dockerfile.jdk17 @@ -0,0 +1,52 @@ +FROM epicmorg/debian:bookworm-jdk17 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## + +ARG RELEASE=9.16.1 +ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files +ENV JIRA_HOME /var/atlassian/application-data/jira +ENV JIRA_INSTALL_DIR /opt/atlassian/jira + +VOLUME ["${JIRA_HOME}"] +WORKDIR $JIRA_HOME + +# Expose HTTP port +EXPOSE 8080 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${JIRA_INSTALL_DIR} \ + && wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \ + && tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \ + && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \ + && sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb && \ + rm -rfv /tmp/* + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/jira/9/9.16.1/Makefile b/linux/ecosystem/atlassian/jira/9/9.16.1/Makefile new file mode 100644 index 000000000..3383c9699 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.16.1/Makefile @@ -0,0 +1,50 @@ +PIP_BREAK_SYSTEM_PACKAGES=1 + +all: app + +app: + make build + make deploy + make clean + +build: + make pip + python3 kaniko-build.py --version + +dry: + make dry-run + +test: + make dry-run + +dry-run: + python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run + +pip: + rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED + pip3 install -r requirements.txt + pip install -r requirements.txt + +build-compose: + docker-compose build --compress --parallel --progress plain + +deploy: + make pip + python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug + +deploy-compose: + docker-compose push + +clean: + docker container prune -f + docker image prune -f + docker network prune -f + docker volume prune -f + docker system prune -af diff --git a/linux/ecosystem/atlassian/jira/9/9.16.1/docker-compose.yml b/linux/ecosystem/atlassian/jira/9/9.16.1/docker-compose.yml new file mode 100644 index 000000000..312dfee53 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.16.1/docker-compose.yml @@ -0,0 +1,16 @@ +#version: '3' +services: + app: + image: "epicmorg/jira:9.16.1" + build: + context: . + app-jdk11: + image: "epicmorg/jira:9.16.1-jdk11" + build: + context: . + dockerfile: Dockerfile.jdk11 + app-jdk17: + image: "epicmorg/jira:9.16.1-jdk17" + build: + context: . + dockerfile: Dockerfile.jdk17 diff --git a/linux/ecosystem/atlassian/jira/9/9.16.1/entrypoint.sh b/linux/ecosystem/atlassian/jira/9/9.16.1/entrypoint.sh new file mode 100755 index 000000000..50ee4ecd1 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.16.1/entrypoint.sh @@ -0,0 +1,89 @@ +#!/bin/bash +set -euo pipefail + +export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") +export JRE_HOME="$JAVA_HOME/jre" +export JAVA_BINARY="$JRE_HOME/bin/java" +export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}') + +# Setup Catalina Opts +: ${CATALINA_CONNECTOR_PROXYNAME:=} +: ${CATALINA_CONNECTOR_PROXYPORT:=} +: ${CATALINA_CONNECTOR_SCHEME:=http} +: ${CATALINA_CONNECTOR_SECURE:=false} + +: ${CATALINA_OPTS:=} + +: ${JAVA_OPTS:=} + +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}" + +export JAVA_OPTS="${JAVA_OPTS} ${CATALINA_OPTS}" + +# Setup Data Center configuration +if [ ! -f "/etc/container_id" ]; then + uuidgen > /etc/container_id +fi +CONTAINER_ID=$(cat /etc/container_id) +CONTAINER_SHORT_ID=${CONTAINER_ID::8} + +: ${CLUSTERED:=false} +: ${JIRA_NODE_ID:=jira_node_${CONTAINER_SHORT_ID}} +: ${JIRA_SHARED_HOME:=${JIRA_HOME}/shared} +: ${EHCACHE_PEER_DISCOVERY:=} +: ${EHCACHE_LISTENER_HOSTNAME:=} +: ${EHCACHE_LISTENER_PORT:=} +: ${EHCACHE_LISTENER_SOCKETTIMEOUTMILLIS:=} +: ${EHCACHE_MULTICAST_ADDRESS:=} +: ${EHCACHE_MULTICAST_PORT:=} +: ${EHCACHE_MULTICAST_TIMETOLIVE:=} +: ${EHCACHE_MULTICAST_HOSTNAME:=} + +# Cleanly set/unset values in cluster.properties +function set_cluster_property { + if [ -z $2 ]; then + if [ -f "${JIRA_HOME}/cluster.properties" ]; then + sed -i -e "/^${1}/d" "${JIRA_HOME}/cluster.properties" + fi + return + fi + if [ ! -f "${JIRA_HOME}/cluster.properties" ]; then + echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties" + elif grep "^${1}" "${JIRA_HOME}/cluster.properties"; then + sed -i -e "s#^${1}=.*#${1}=${2}#g" "${JIRA_HOME}/cluster.properties" + else + echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties" + fi +} + +if [ "${CLUSTERED}" == "true" ]; then + set_cluster_property "jira.node.id" "${JIRA_NODE_ID}" + set_cluster_property "jira.shared.home" "${JIRA_SHARED_HOME}" + set_cluster_property "ehcache.peer.discovery" "${EHCACHE_PEER_DISCOVERY}" + set_cluster_property "ehcache.listener.hostName" "${EHCACHE_LISTENER_HOSTNAME}" + set_cluster_property "ehcache.listener.port" "${EHCACHE_LISTENER_PORT}" + set_cluster_property "ehcache.listener.socketTimeoutMillis" "${EHCACHE_LISTENER_PORT}" + set_cluster_property "ehcache.multicast.address" "${EHCACHE_MULTICAST_ADDRESS}" + set_cluster_property "ehcache.multicast.port" "${EHCACHE_MULTICAST_PORT}" + set_cluster_property "ehcache.multicast.timeToLive" "${EHCACHE_MULTICAST_TIMETOLIVE}" + set_cluster_property "ehcache.multicast.hostName" "${EHCACHE_MULTICAST_HOSTNAME}" +fi + + +# Start Jira as the correct user +if [ "${UID}" -eq 0 ]; then + echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}" + PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${JIRA_HOME}") + EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700 + if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then + chmod -R 700 "${JIRA_HOME}" && + chown -R "${RUN_USER}:${RUN_GROUP}" "${JIRA_HOME}" + fi + # Now drop privileges + exec su -s /bin/bash "${RUN_USER}" -c "$JIRA_INSTALL_DIR/bin/start-jira.sh $@" +else + exec "$JIRA_INSTALL_DIR/bin/start-jira.sh" "$@" +fi diff --git a/linux/ecosystem/atlassian/jira/9/9.16.1/kaniko-build.py b/linux/ecosystem/atlassian/jira/9/9.16.1/kaniko-build.py new file mode 100644 index 000000000..e693b5c17 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.16.1/kaniko-build.py @@ -0,0 +1,196 @@ +import os +import shutil +import argparse +import yaml +import subprocess +from collections import defaultdict +from concurrent.futures import ThreadPoolExecutor, as_completed +from dotenv import load_dotenv +import logging +import sys + +# Script version +SCRIPT_VERSION = "1.0.1.0" + +# ASCII art for EpicMorg +ASCII_ART = r""" ++=================================================+ +| ____| _) \ | | +| __| __ \ | __| |\/ | _ \ __| _` | | +| | | | | ( | | ( | | ( | | +|_____| .__/ _| \___| _| _| \___/ _| \__, | | +| | / _| _) | |___/ | +| ' / _` | __ \ | | / _ \ | +| . \ ( | | | | < ( | | +|_|\_\ \__,_| _| _| _| _|\_\ \___/ | +|\ \ / | +| \ \ \ / __| _` | __ \ __ \ _ \ __|| +| \ \ \ / | ( | | | | | __/ | | +| \_/\_/ _| \__,_| .__/ .__/ \___| _| | +| _| _| | ++=================================================+ +""" + +# Load environment variables from .env file +load_dotenv() + +def setup_logging(): + logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + +def parse_args(): + parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False) + parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file') + parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image') + parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry') + parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup') + parser.add_argument('--version', '-v', action='store_true', help='Show script version') + parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit') + return parser.parse_args() + +def load_compose_file(file_path): + with open(file_path, 'r') as file: + return yaml.safe_load(file) + +def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry): + kaniko_command = [ + 'docker', 'run', + '--rm', + '-t', + '-v', f'{os.path.abspath(build_context)}:/workspace', + ] + + # Add Docker config mounts for both read-only access + kaniko_command.extend([ + '-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon + '-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode + ]) + + kaniko_command.extend([ + kaniko_image, + '--context', '/workspace', + '--dockerfile', f'/workspace/{dockerfile}', + '--compressed-caching', + '--single-snapshot', + '--cleanup' + ]) + + if deploy: + kaniko_command.extend([ + '--destination', image_name + ]) + elif dry: + kaniko_command.extend([ + '--no-push' + ]) + else: + kaniko_command.extend([ + '--no-push' + ]) + + # Add build arguments if they exist + for arg_name, arg_value in build_args.items(): + kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}']) + + logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}") + + process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + + # Stream output in real-time + for line in process.stdout: + logging.info(line.strip()) + + process.wait() + + if process.returncode == 0: + logging.info(f"Successfully built {service_name}") + else: + for line in process.stderr: + logging.error(line.strip()) + logging.error(f"Error building {service_name}") + raise Exception(f"Failed to build {service_name}") + +def show_help(): + print(ASCII_ART) + print("EpicMorg: Kaniko-Compose Wrapper\n") + print("Arguments:") + print("--compose-file Path to docker-compose.yml file") + print("--kaniko-image Kaniko executor image") + print("--push, --deploy, -d, -p Deploy the built images to the registry") + print("--dry-run, --dry Dry run: build images without pushing and with cleanup") + print("--version, -v Show script version") + print("--help, -h Show this help message and exit") + +def show_version(): + print(ASCII_ART) + print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}") + +def main(): + setup_logging() + + args = parse_args() + + # Show help and exit if --help is provided + if args.help: + show_help() + return + + # Show version and exit if --version or no relevant arguments are provided + if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'): + show_version() + return + + compose_file = args.compose_file + kaniko_image = args.kaniko_image + deploy = args.push + dry = args.dry_run + + if not os.path.exists(compose_file): + logging.error(f"{compose_file} not found") + return + + compose_data = load_compose_file(compose_file) + + services = compose_data.get('services', {}) + image_names = defaultdict(int) + + for service_name, service_data in services.items(): + image_name = service_data.get('image') + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + image_names[image_name] += 1 + + for image_name, count in image_names.items(): + if count > 1: + logging.error(f"Error: Image name {image_name} is used {count} times.") + return + + try: + with ThreadPoolExecutor() as executor: + futures = [] + for service_name, service_data in services.items(): + build_data = service_data.get('build', {}) + build_context = build_data.get('context', '.') + dockerfile = build_data.get('dockerfile', 'Dockerfile') + image_name = service_data.get('image') + build_args = build_data.get('args', {}) + + # Substitute environment variables with their values if they exist + build_args = {key: os.getenv(key, value) for key, value in build_args.items()} + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry)) + + for future in as_completed(futures): + future.result() + except Exception as exc: + logging.error(f"Build failed: {exc}") + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/linux/ecosystem/atlassian/jira/9/9.16.1/requirements.txt b/linux/ecosystem/atlassian/jira/9/9.16.1/requirements.txt new file mode 100644 index 000000000..9ed771861 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.16.1/requirements.txt @@ -0,0 +1,2 @@ +PyYAML +python-dotenv diff --git a/linux/ecosystem/atlassian/jira/9/9.17.1/Dockerfile b/linux/ecosystem/atlassian/jira/9/9.17.1/Dockerfile new file mode 100644 index 000000000..f24640223 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.17.1/Dockerfile @@ -0,0 +1,53 @@ +FROM epicmorg/debian:bookworm-jdk8 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## + +ARG RELEASE=9.17.1 +ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files +ENV JIRA_HOME /var/atlassian/application-data/jira +ENV JIRA_INSTALL_DIR /opt/atlassian/jira + +VOLUME ["${JIRA_HOME}"] +WORKDIR $JIRA_HOME + +# Expose HTTP port +EXPOSE 8080 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${JIRA_INSTALL_DIR} \ + && wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \ + && tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \ + && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \ + && sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb && \ + rm -rfv /tmp/* + + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/jira/9/9.17.1/Dockerfile.jdk11 b/linux/ecosystem/atlassian/jira/9/9.17.1/Dockerfile.jdk11 new file mode 100644 index 000000000..55d146cf5 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.17.1/Dockerfile.jdk11 @@ -0,0 +1,52 @@ +FROM epicmorg/debian:bookworm-jdk11 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## + +ARG RELEASE=9.17.1 +ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files +ENV JIRA_HOME /var/atlassian/application-data/jira +ENV JIRA_INSTALL_DIR /opt/atlassian/jira + +VOLUME ["${JIRA_HOME}"] +WORKDIR $JIRA_HOME + +# Expose HTTP port +EXPOSE 8080 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${JIRA_INSTALL_DIR} \ + && wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \ + && tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \ + && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \ + && sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb && \ + rm -rfv /tmp/* + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/jira/9/9.17.1/Dockerfile.jdk17 b/linux/ecosystem/atlassian/jira/9/9.17.1/Dockerfile.jdk17 new file mode 100644 index 000000000..6fbd4c71d --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.17.1/Dockerfile.jdk17 @@ -0,0 +1,52 @@ +FROM epicmorg/debian:bookworm-jdk17 +LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org" +ARG DEBIAN_FRONTEND=noninteractive + +################################################################## +# ARGuments +################################################################## + +ARG RELEASE=9.17.1 +ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz + +################################################################## +# Setup +################################################################## +ENV RUN_USER daemon +ENV RUN_GROUP daemon + +# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files +ENV JIRA_HOME /var/atlassian/application-data/jira +ENV JIRA_INSTALL_DIR /opt/atlassian/jira + +VOLUME ["${JIRA_HOME}"] +WORKDIR $JIRA_HOME + +# Expose HTTP port +EXPOSE 8080 + +################################################################## +# Installing +################################################################## +RUN mkdir -p ${JIRA_INSTALL_DIR} \ + && wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \ + && tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \ + && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \ + && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \ + && sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \ + && sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \ + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ + apt clean -y && \ + apt autoclean -y && \ + rm -rfv /var/lib/apt/lists/* && \ + rm -rfv /var/cache/apt/archives/*.deb && \ + rm -rfv /tmp/* + +RUN updatedb + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +CMD ["/entrypoint.sh", "-fg"] +ENTRYPOINT ["/usr/bin/tini", "--"] diff --git a/linux/ecosystem/atlassian/jira/9/9.17.1/Makefile b/linux/ecosystem/atlassian/jira/9/9.17.1/Makefile new file mode 100644 index 000000000..3383c9699 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.17.1/Makefile @@ -0,0 +1,50 @@ +PIP_BREAK_SYSTEM_PACKAGES=1 + +all: app + +app: + make build + make deploy + make clean + +build: + make pip + python3 kaniko-build.py --version + +dry: + make dry-run + +test: + make dry-run + +dry-run: + python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run + +pip: + rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED + rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED + pip3 install -r requirements.txt + pip install -r requirements.txt + +build-compose: + docker-compose build --compress --parallel --progress plain + +deploy: + make pip + python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug + +deploy-compose: + docker-compose push + +clean: + docker container prune -f + docker image prune -f + docker network prune -f + docker volume prune -f + docker system prune -af diff --git a/linux/ecosystem/atlassian/jira/9/9.17.1/docker-compose.yml b/linux/ecosystem/atlassian/jira/9/9.17.1/docker-compose.yml new file mode 100644 index 000000000..eb3277724 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.17.1/docker-compose.yml @@ -0,0 +1,17 @@ +#version: '3' +services: + app: + image: "epicmorg/jira:9.17.1" + build: + context: . + app-jdk11: + image: "epicmorg/jira:9.17.1-jdk11" + build: + context: . + dockerfile: Dockerfile.jdk11 + app-jdk17: + image: "epicmorg/jira:9.17.1-jdk17" + build: + context: . + dockerfile: Dockerfile.jdk17 + diff --git a/linux/ecosystem/atlassian/jira/9/9.17.1/entrypoint.sh b/linux/ecosystem/atlassian/jira/9/9.17.1/entrypoint.sh new file mode 100755 index 000000000..50ee4ecd1 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.17.1/entrypoint.sh @@ -0,0 +1,89 @@ +#!/bin/bash +set -euo pipefail + +export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") +export JRE_HOME="$JAVA_HOME/jre" +export JAVA_BINARY="$JRE_HOME/bin/java" +export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}') + +# Setup Catalina Opts +: ${CATALINA_CONNECTOR_PROXYNAME:=} +: ${CATALINA_CONNECTOR_PROXYPORT:=} +: ${CATALINA_CONNECTOR_SCHEME:=http} +: ${CATALINA_CONNECTOR_SECURE:=false} + +: ${CATALINA_OPTS:=} + +: ${JAVA_OPTS:=} + +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}" +CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}" + +export JAVA_OPTS="${JAVA_OPTS} ${CATALINA_OPTS}" + +# Setup Data Center configuration +if [ ! -f "/etc/container_id" ]; then + uuidgen > /etc/container_id +fi +CONTAINER_ID=$(cat /etc/container_id) +CONTAINER_SHORT_ID=${CONTAINER_ID::8} + +: ${CLUSTERED:=false} +: ${JIRA_NODE_ID:=jira_node_${CONTAINER_SHORT_ID}} +: ${JIRA_SHARED_HOME:=${JIRA_HOME}/shared} +: ${EHCACHE_PEER_DISCOVERY:=} +: ${EHCACHE_LISTENER_HOSTNAME:=} +: ${EHCACHE_LISTENER_PORT:=} +: ${EHCACHE_LISTENER_SOCKETTIMEOUTMILLIS:=} +: ${EHCACHE_MULTICAST_ADDRESS:=} +: ${EHCACHE_MULTICAST_PORT:=} +: ${EHCACHE_MULTICAST_TIMETOLIVE:=} +: ${EHCACHE_MULTICAST_HOSTNAME:=} + +# Cleanly set/unset values in cluster.properties +function set_cluster_property { + if [ -z $2 ]; then + if [ -f "${JIRA_HOME}/cluster.properties" ]; then + sed -i -e "/^${1}/d" "${JIRA_HOME}/cluster.properties" + fi + return + fi + if [ ! -f "${JIRA_HOME}/cluster.properties" ]; then + echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties" + elif grep "^${1}" "${JIRA_HOME}/cluster.properties"; then + sed -i -e "s#^${1}=.*#${1}=${2}#g" "${JIRA_HOME}/cluster.properties" + else + echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties" + fi +} + +if [ "${CLUSTERED}" == "true" ]; then + set_cluster_property "jira.node.id" "${JIRA_NODE_ID}" + set_cluster_property "jira.shared.home" "${JIRA_SHARED_HOME}" + set_cluster_property "ehcache.peer.discovery" "${EHCACHE_PEER_DISCOVERY}" + set_cluster_property "ehcache.listener.hostName" "${EHCACHE_LISTENER_HOSTNAME}" + set_cluster_property "ehcache.listener.port" "${EHCACHE_LISTENER_PORT}" + set_cluster_property "ehcache.listener.socketTimeoutMillis" "${EHCACHE_LISTENER_PORT}" + set_cluster_property "ehcache.multicast.address" "${EHCACHE_MULTICAST_ADDRESS}" + set_cluster_property "ehcache.multicast.port" "${EHCACHE_MULTICAST_PORT}" + set_cluster_property "ehcache.multicast.timeToLive" "${EHCACHE_MULTICAST_TIMETOLIVE}" + set_cluster_property "ehcache.multicast.hostName" "${EHCACHE_MULTICAST_HOSTNAME}" +fi + + +# Start Jira as the correct user +if [ "${UID}" -eq 0 ]; then + echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}" + PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${JIRA_HOME}") + EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700 + if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then + chmod -R 700 "${JIRA_HOME}" && + chown -R "${RUN_USER}:${RUN_GROUP}" "${JIRA_HOME}" + fi + # Now drop privileges + exec su -s /bin/bash "${RUN_USER}" -c "$JIRA_INSTALL_DIR/bin/start-jira.sh $@" +else + exec "$JIRA_INSTALL_DIR/bin/start-jira.sh" "$@" +fi diff --git a/linux/ecosystem/atlassian/jira/9/9.17.1/kaniko-build.py b/linux/ecosystem/atlassian/jira/9/9.17.1/kaniko-build.py new file mode 100644 index 000000000..e693b5c17 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.17.1/kaniko-build.py @@ -0,0 +1,196 @@ +import os +import shutil +import argparse +import yaml +import subprocess +from collections import defaultdict +from concurrent.futures import ThreadPoolExecutor, as_completed +from dotenv import load_dotenv +import logging +import sys + +# Script version +SCRIPT_VERSION = "1.0.1.0" + +# ASCII art for EpicMorg +ASCII_ART = r""" ++=================================================+ +| ____| _) \ | | +| __| __ \ | __| |\/ | _ \ __| _` | | +| | | | | ( | | ( | | ( | | +|_____| .__/ _| \___| _| _| \___/ _| \__, | | +| | / _| _) | |___/ | +| ' / _` | __ \ | | / _ \ | +| . \ ( | | | | < ( | | +|_|\_\ \__,_| _| _| _| _|\_\ \___/ | +|\ \ / | +| \ \ \ / __| _` | __ \ __ \ _ \ __|| +| \ \ \ / | ( | | | | | __/ | | +| \_/\_/ _| \__,_| .__/ .__/ \___| _| | +| _| _| | ++=================================================+ +""" + +# Load environment variables from .env file +load_dotenv() + +def setup_logging(): + logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + +def parse_args(): + parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False) + parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file') + parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image') + parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry') + parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup') + parser.add_argument('--version', '-v', action='store_true', help='Show script version') + parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit') + return parser.parse_args() + +def load_compose_file(file_path): + with open(file_path, 'r') as file: + return yaml.safe_load(file) + +def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry): + kaniko_command = [ + 'docker', 'run', + '--rm', + '-t', + '-v', f'{os.path.abspath(build_context)}:/workspace', + ] + + # Add Docker config mounts for both read-only access + kaniko_command.extend([ + '-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon + '-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode + ]) + + kaniko_command.extend([ + kaniko_image, + '--context', '/workspace', + '--dockerfile', f'/workspace/{dockerfile}', + '--compressed-caching', + '--single-snapshot', + '--cleanup' + ]) + + if deploy: + kaniko_command.extend([ + '--destination', image_name + ]) + elif dry: + kaniko_command.extend([ + '--no-push' + ]) + else: + kaniko_command.extend([ + '--no-push' + ]) + + # Add build arguments if they exist + for arg_name, arg_value in build_args.items(): + kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}']) + + logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}") + + process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + + # Stream output in real-time + for line in process.stdout: + logging.info(line.strip()) + + process.wait() + + if process.returncode == 0: + logging.info(f"Successfully built {service_name}") + else: + for line in process.stderr: + logging.error(line.strip()) + logging.error(f"Error building {service_name}") + raise Exception(f"Failed to build {service_name}") + +def show_help(): + print(ASCII_ART) + print("EpicMorg: Kaniko-Compose Wrapper\n") + print("Arguments:") + print("--compose-file Path to docker-compose.yml file") + print("--kaniko-image Kaniko executor image") + print("--push, --deploy, -d, -p Deploy the built images to the registry") + print("--dry-run, --dry Dry run: build images without pushing and with cleanup") + print("--version, -v Show script version") + print("--help, -h Show this help message and exit") + +def show_version(): + print(ASCII_ART) + print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}") + +def main(): + setup_logging() + + args = parse_args() + + # Show help and exit if --help is provided + if args.help: + show_help() + return + + # Show version and exit if --version or no relevant arguments are provided + if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'): + show_version() + return + + compose_file = args.compose_file + kaniko_image = args.kaniko_image + deploy = args.push + dry = args.dry_run + + if not os.path.exists(compose_file): + logging.error(f"{compose_file} not found") + return + + compose_data = load_compose_file(compose_file) + + services = compose_data.get('services', {}) + image_names = defaultdict(int) + + for service_name, service_data in services.items(): + image_name = service_data.get('image') + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + image_names[image_name] += 1 + + for image_name, count in image_names.items(): + if count > 1: + logging.error(f"Error: Image name {image_name} is used {count} times.") + return + + try: + with ThreadPoolExecutor() as executor: + futures = [] + for service_name, service_data in services.items(): + build_data = service_data.get('build', {}) + build_context = build_data.get('context', '.') + dockerfile = build_data.get('dockerfile', 'Dockerfile') + image_name = service_data.get('image') + build_args = build_data.get('args', {}) + + # Substitute environment variables with their values if they exist + build_args = {key: os.getenv(key, value) for key, value in build_args.items()} + + if not image_name: + logging.warning(f"No image specified for service {service_name}") + continue + + futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry)) + + for future in as_completed(futures): + future.result() + except Exception as exc: + logging.error(f"Build failed: {exc}") + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/linux/ecosystem/atlassian/jira/9/9.17.1/requirements.txt b/linux/ecosystem/atlassian/jira/9/9.17.1/requirements.txt new file mode 100644 index 000000000..9ed771861 --- /dev/null +++ b/linux/ecosystem/atlassian/jira/9/9.17.1/requirements.txt @@ -0,0 +1,2 @@ +PyYAML +python-dotenv diff --git a/linux/ecosystem/epicmorg/debian/12-bookworm/develop/Dockerfile b/linux/ecosystem/epicmorg/debian/12-bookworm/develop/Dockerfile index 223e4fc9d..3008dc1eb 100644 --- a/linux/ecosystem/epicmorg/debian/12-bookworm/develop/Dockerfile +++ b/linux/ecosystem/epicmorg/debian/12-bookworm/develop/Dockerfile @@ -826,7 +826,6 @@ RUN tar -xzf ${OPENSSL_111_TEMP} --directory /tmp && \ ln -sf ${OPENSSL_111_SRC_DIR} ${OPENSSL_111_DIR}/src && \ cd ${OPENSSL_111_TEMP_SRC} && \ ./config \ - no-shared \ zlib \ --with-zlib-include=${ZLIB_DIR}/include \ --with-zlib-lib=${ZLIB_DIR}/lib \ @@ -852,7 +851,6 @@ RUN tar -xzf ${OPENSSL_30_TEMP} --directory /tmp && \ ln -sf ${OPENSSL_30_SRC_DIR} ${OPENSSL_30_DIR}/src && \ cd ${OPENSSL_30_TEMP_SRC} && \ ./config \ - no-shared \ zlib \ --with-zlib-include=${ZLIB_DIR}/include \ --with-zlib-lib=${ZLIB_DIR}/lib \ @@ -881,7 +879,6 @@ RUN tar -xzf ${OPENSSL_31_TEMP} --directory /tmp && \ ln -sf ${OPENSSL_31_SRC_DIR} ${OPENSSL_31_DIR}/src && \ cd ${OPENSSL_31_TEMP_SRC} && \ ./config \ - no-shared \ zlib \ --with-zlib-include=${ZLIB_DIR}/include \ --with-zlib-lib=${ZLIB_DIR}/lib \ @@ -910,7 +907,6 @@ RUN tar -xzf ${OPENSSL_32_TEMP} --directory /tmp && \ ln -sf ${OPENSSL_32_SRC_DIR} ${OPENSSL_32_DIR}/src && \ cd ${OPENSSL_32_TEMP_SRC} && \ ./config \ - no-shared \ zlib \ --with-zlib-include=${ZLIB_DIR}/include \ --with-zlib-lib=${ZLIB_DIR}/lib \ @@ -941,7 +937,6 @@ RUN tar -xzf ${OPENSSL_33_TEMP} --directory /tmp && \ ln -sf ${OPENSSL_33_SRC_DIR} ${OPENSSL_33_DIR}/src && \ cd ${OPENSSL_33_TEMP_SRC} && \ ./config \ - no-shared \ zlib \ --with-zlib-include=${ZLIB_DIR}/include \ --with-zlib-lib=${ZLIB_DIR}/lib \ @@ -984,10 +979,10 @@ RUN tar -xzf ${LIBRESSL_TEMP} --directory /tmp && \ && \ make -j$(nproc) && \ make -j$(nproc) install && \ - ln -sfv ${LIBRESSL_INC_DIR}/* /usr/local/include && \ - ln -sfv ${LIBRESSL_LIB_DIR}/* /usr/local/lib && \ - echo "# LibreSSL support" >> ${LD_CONF_DIR}/LibreSSL.conf && \ - echo ${LIBRESSL_LIB_DIR} >> ${LD_CONF_DIR}/LibreSSL.conf && \ +# ln -sfv ${LIBRESSL_INC_DIR}/* /usr/local/include && \ +# ln -sfv ${LIBRESSL_LIB_DIR}/* /usr/local/lib && \ +# echo "# LibreSSL support" >> ${LD_CONF_DIR}/LibreSSL.conf && \ +# echo ${LIBRESSL_LIB_DIR} >> ${LD_CONF_DIR}/LibreSSL.conf && \ ldconfig ################################################################## @@ -1000,13 +995,13 @@ RUN mkdir -p ${BORINGSSL_DIR} ${BORINGSSL_SRC_DIR} && \ cd ${BORINGSSL_TEMP_SRC} && \ mkdir ${BORINGSSL_TEMP_SRC}/build && \ cd ${BORINGSSL_TEMP_SRC}/build && \ - cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=${BORINGSSL_DIR} .. && \ + cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE -DBUILD_SHARED_LIBS=1 -DCMAKE_INSTALL_PREFIX=${BORINGSSL_DIR} .. && \ make -j$(if [ $(nproc) -gt 8 ]; then echo $(( $(nproc) / 2 )); else echo $(nproc); fi) && \ make -j$(nproc) install && \ - ln -sfv ${BORINGSSL_INC_DIR}/* /usr/local/include && \ - ln -sfv ${BORINGSSL_LIB_DIR}/* /usr/local/lib && \ - echo "# BoringSSL support" >> ${LD_CONF_DIR}/BoringSSL.conf && \ - echo ${BORINGSSL_LIB_DIR} >> ${LD_CONF_DIR}/BoringSSL.conf && \ +# ln -sfv ${BORINGSSL_INC_DIR}/* /usr/local/include && \ +# ln -sfv ${BORINGSSL_LIB_DIR}/* /usr/local/lib && \ +# echo "# BoringSSL support" >> ${LD_CONF_DIR}/BoringSSL.conf && \ +# echo ${BORINGSSL_LIB_DIR} >> ${LD_CONF_DIR}/BoringSSL.conf && \ ldconfig ################################################################## diff --git a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk11/Dockerfile b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk11/Dockerfile index 0d6c19037..0a8e7374e 100644 --- a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk11/Dockerfile +++ b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk11/Dockerfile @@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION} +ENV JRE_HOME=${JAVA_HOME} ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## @@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## ADD ${K_JDK_URL} /tmp RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \ + ln -sfv ${JAVA_HOME} /usr/jre && \ java -version ################################################################## diff --git a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk16/Dockerfile b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk16/Dockerfile index 0f5c1ec36..d9beacbf9 100644 --- a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk16/Dockerfile +++ b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk16/Dockerfile @@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION} +ENV JRE_HOME=${JAVA_HOME} ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## @@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## ADD ${K_JDK_URL} /tmp RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \ + ln -sfv ${JAVA_HOME} /usr/jre && \ java -version ################################################################## diff --git a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk17/Dockerfile b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk17/Dockerfile index 5db4e54e7..e64989901 100644 --- a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk17/Dockerfile +++ b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk17/Dockerfile @@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION} +ENV JRE_HOME=${JAVA_HOME} ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## @@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## ADD ${K_JDK_URL} /tmp RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \ + ln -sfv ${JAVA_HOME} /usr/jre && \ java -version ################################################################## diff --git a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk18/Dockerfile b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk18/Dockerfile index 5c816e1ad..ac24ef73a 100644 --- a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk18/Dockerfile +++ b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk18/Dockerfile @@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION} +ENV JRE_HOME=${JAVA_HOME} ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## @@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## ADD ${K_JDK_URL} /tmp RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \ + ln -sfv ${JAVA_HOME} /usr/jre && \ java -version ################################################################## diff --git a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk19/Dockerfile b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk19/Dockerfile index b3d62d8bc..855b4e713 100644 --- a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk19/Dockerfile +++ b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk19/Dockerfile @@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION} +ENV JRE_HOME=${JAVA_HOME} ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## @@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## ADD ${K_JDK_URL} /tmp RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \ + ln -sfv ${JAVA_HOME} /usr/jre && \ java -version ################################################################## diff --git a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk20/Dockerfile b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk20/Dockerfile index e32acfb61..c7e2b4644 100644 --- a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk20/Dockerfile +++ b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk20/Dockerfile @@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION} +ENV JRE_HOME=${JAVA_HOME} ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## @@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## ADD ${K_JDK_URL} /tmp RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \ + ln -sfv ${JAVA_HOME} /usr/jre && \ java -version ################################################################## diff --git a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk21/Dockerfile b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk21/Dockerfile index 268dea24d..1263724c0 100644 --- a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk21/Dockerfile +++ b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk21/Dockerfile @@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION} +ENV JRE_HOME=${JAVA_HOME} ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## @@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## ADD ${K_JDK_URL} /tmp RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \ + ln -sfv ${JAVA_HOME} /usr/jre && \ java -version ################################################################## diff --git a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk22/Dockerfile b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk22/Dockerfile index f052bd6cc..c3c111232 100644 --- a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk22/Dockerfile +++ b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk22/Dockerfile @@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION} +ENV JRE_HOME=${JAVA_HOME} ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## @@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## ADD ${K_JDK_URL} /tmp RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \ + ln -sfv ${JAVA_HOME} /usr/jre && \ java -version ################################################################## diff --git a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk6/Dockerfile b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk6/Dockerfile index 959a7b44e..f3b17c23c 100644 --- a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk6/Dockerfile +++ b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk6/Dockerfile @@ -8,6 +8,7 @@ ARG K_JDK_URL=http://cdn.azul.com/zulu/bin/zulu${K_JDK_VERSION}-jdk${K_JDK_BUILD ARG K_JDK_TEMP=/tmp/zulu${K_JDK_VERSION}-jdk${K_JDK_BUILD_VERSION}-linux_x64.tar.gz ENV JAVA_HOME=/usr/local/zulu${K_JDK_VERSION}-jdk${K_JDK_BUILD_VERSION}-linux_x64 +ENV JRE_HOME=${JAVA_HOME} ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## @@ -15,6 +16,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## ADD ${K_JDK_URL} /tmp RUN tar -xvzf /tmp/zulu${K_JDK_VERSION}-jdk${K_JDK_BUILD_VERSION}-linux_x64.tar.gz --directory /usr/local && \ + ln -sfv ${JAVA_HOME} /usr/jre && \ java -version ################################################################## diff --git a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk7/Dockerfile b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk7/Dockerfile index 8798aae63..d0641a7f9 100644 --- a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk7/Dockerfile +++ b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk7/Dockerfile @@ -8,6 +8,7 @@ ARG K_JDK_URL=http://cdn.azul.com/zulu/bin/zulu${K_JDK_VERSION}-ca-jdk${K_JDK_BU ARG K_JDK_TEMP=/tmp/zulu${K_JDK_VERSION}-ca-jdk${K_JDK_BUILD_VERSION}-linux_x64.tar.gz ENV JAVA_HOME=/usr/local/zulu${K_JDK_VERSION}-ca-jdk${K_JDK_BUILD_VERSION}-linux_x64 +ENV JRE_HOME=${JAVA_HOME} ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## @@ -15,6 +16,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## ADD ${K_JDK_URL} /tmp RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \ + ln -sfv ${JAVA_HOME} /usr/jre && \ java -version ################################################################## diff --git a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk8/Dockerfile b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk8/Dockerfile index d4b18405a..b0a60c1e6 100644 --- a/linux/ecosystem/epicmorg/debian/12-bookworm/jdk8/Dockerfile +++ b/linux/ecosystem/epicmorg/debian/12-bookworm/jdk8/Dockerfile @@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}${K_JDK_BUILD_VERSION}.tar.gz ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}-${K_JDK_BUILD_VERSION} +ENV JRE_HOME=${JAVA_HOME} ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## @@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin ################################################################## ADD ${K_JDK_URL} /tmp RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \ + ln -sfv ${JAVA_HOME} /usr/jre && \ java -version ################################################################## diff --git a/linux/ecosystem/nginx/1.27.0/main/Dockerfile b/linux/ecosystem/nginx/1.27.0/main/Dockerfile index 4dacd7b7e..2d46986de 100644 --- a/linux/ecosystem/nginx/1.27.0/main/Dockerfile +++ b/linux/ecosystem/nginx/1.27.0/main/Dockerfile @@ -271,7 +271,7 @@ RUN cp -rf ${NGINX_TEMP_SRC}/* ${NGINX_SRC_DIR} && \ ## gd fuck ## --with-http_image_filter_module \ ## perftools fuck - --with-google_perftools_module \ +## --with-google_perftools_module \ ## perl problem fuck ## --with-http_perl_module \ ## @@ -291,7 +291,8 @@ RUN cp -rf ${NGINX_TEMP_SRC}/* ${NGINX_SRC_DIR} && \ ## undefined reference to `sasl_getprop' ## --add-module=modules/http-auth-ldap \ && \ - make -j$(nproc) && make install + make -j$(nproc) && \ + make -j$(nproc) install RUN rm -rfv ${NGINX_CONF_DIR}/nginx.conf && \ mkdir -p ${NGINX_MODULES_DIR} ${NGINX_MODULES_PERL_DIR} @@ -397,6 +398,5 @@ RUN nginx -V CMD ["nginx", "-g", "daemon off;"] #TODO: -# fix and redeploy develop (blocker!) +# fix and redeploy develop (blocker!) -- DONE # add link to /usr/src/nginx/ -> /src folder to final layer -# xz files in /usr/src/nginx/ folder to optimize size