Changes: - There is one unified docker-compose.yml for both repo and sync - Both containers are started together, but the maven container spins until the repo is ready - The repo is terminated when maven terminates - The repo is set up at port 80 in the container, 9001 on the host - The maven container is separated from the host network, only has connections to the repocustom-downloader
| @@ -1,23 +1,9 @@ | |||||
| # Maven Sync Setup | # Maven Sync Setup | ||||
| ## Repository | |||||
| _Reposilite_-based Maven Repository Manager acting as a caching proxy. | _Reposilite_-based Maven Repository Manager acting as a caching proxy. | ||||
| ```sh | ```sh | ||||
| mkdir data | |||||
| cd repo | |||||
| ./deploy.sh | |||||
| ./run.sh | |||||
| ``` | ``` | ||||
| TODO: something is not working correctly when loading the initial configuration. | |||||
| Take the content of the `reposilite.cdn` and paste it into the Configuration window | |||||
| after logging in as `admin:secret` on http://localhost:9001 and press _Update configuration and reload_. | |||||
| ## Sync job | |||||
| Script that can be triggered manually or scheduled. | |||||
| cd sync | |||||
| ./sync.sh | |||||
| Mirror tarballs. | |||||
| This starts the reposilite server, then starts maven and makes download all packages defined in the pom's in the `examples/` folder, including their dependencies. These packages are then cached by reposilite in `data/`. The relevant folders are turned into tarballs and saved in the root directory. | |||||
| @@ -0,0 +1,21 @@ | |||||
| version: '3.9' | |||||
| services: | |||||
| repo: | |||||
| image: dzikoysk/reposilite:3.0.0-alpha.23 | |||||
| user: ${USER_ID}:${GROUP_ID} | |||||
| environment: | |||||
| REPOSILITE_OPTS: "--token admin:secret --shared-configuration=/reposilite.cdn --shared-configuration-mode=copy" | |||||
| volumes: | |||||
| - ./repo/reposilite.cdn:/reposilite.cdn | |||||
| - ./data:/app/data | |||||
| ports: | |||||
| - "9001:80" | |||||
| restart: unless-stopped | |||||
| maven-sync-job: | |||||
| build: ./sync | |||||
| depends_on: | |||||
| - repo | |||||
| volumes: | |||||
| - ./examples:/poms | |||||
| network_mode: "service:repo" | |||||
| @@ -1,3 +0,0 @@ | |||||
| #!/bin/sh | |||||
| docker-compose run -u $(id -u):$(id -g) --service-ports repo | |||||
| @@ -1,14 +0,0 @@ | |||||
| version: '3.9' | |||||
| services: | |||||
| repo: | |||||
| image: dzikoysk/reposilite:3.0.0-alpha.23 | |||||
| environment: | |||||
| REPOSILITE_OPTS: "--token admin:secret --shared-configuration=/reposilite.cdn --shared-configuration-mode=copy --port=8080" | |||||
| volumes: | |||||
| - ./reposilite.cdn:/reposilite.cdn | |||||
| - ../data:/app/data | |||||
| ports: | |||||
| - "9001:8080" | |||||
| restart: unless-stopped | |||||
| @@ -0,0 +1,28 @@ | |||||
| #!/bin/sh | |||||
| # Get the owner of the current folder (prevents permission problems when running with sudo) | |||||
| user=$(stat -c "%u" .) | |||||
| group=$(stat -c "%g" .) | |||||
| if [ ! -d ./data ]; then | |||||
| mkdir ./data | |||||
| chown "$user:$group" ./data | |||||
| fi | |||||
| USER_ID=$user GROUP_ID=$group docker-compose up --build --exit-code-from maven-sync-job | |||||
| if [ $? -eq 0 ]; then | |||||
| echo "Creating a tarball of the Releases" | |||||
| tar zcvf ./maven-releases-packages.tar.gz ./data/repositories/releases/* 2>/dev/null | |||||
| chown "$user:$group" ./maven-releases-packages.tar.gz | |||||
| echo "Creating a tarball of the Snapshots" | |||||
| tar zcvf ./maven-snapshots-packages.tar.gz ./data/repositories/snapshots/* 2>/dev/null | |||||
| chown "$user:$group" ./maven-snapshots-packages.tar.gz | |||||
| echo "NEXT: mirror *.tar.gz and import into Artifactory." | |||||
| else | |||||
| echo "The sync failed, no tarballs created" | |||||
| exit 255 | |||||
| fi | |||||
| USER_ID=$user GROUP_ID=$group docker-compose down | |||||
| @@ -1,3 +1,4 @@ | |||||
| ** | ** | ||||
| !settings.xml | !settings.xml | ||||
| !resolve-deps-from-poms.sh | !resolve-deps-from-poms.sh | ||||
| !wait-for-it.sh | |||||
| @@ -2,8 +2,9 @@ FROM maven:alpine | |||||
| RUN mkdir /poms && mkdir -p /root/.m2 | RUN mkdir /poms && mkdir -p /root/.m2 | ||||
| ADD resolve-deps-from-poms.sh /resolve-deps-from-poms.sh | |||||
| ADD settings.xml /root/.m2/settings.xml | |||||
| COPY wait-for-it.sh /wait-for-it.sh | |||||
| COPY resolve-deps-from-poms.sh /resolve-deps-from-poms.sh | |||||
| COPY settings.xml /root/.m2/settings.xml | |||||
| VOLUME [ "/poms" ] | VOLUME [ "/poms" ] | ||||
| @@ -1,5 +0,0 @@ | |||||
| #!/bin/sh | |||||
| COCLI=docker # or podman | |||||
| docker build -t maven-sync-job . | |||||
| @@ -1,6 +1,12 @@ | |||||
| #!/bin/sh | #!/bin/sh | ||||
| for pom in /poms/*; do | |||||
| mvn -P central -f $pom dependency:go-offline; | |||||
| done | |||||
| /wait-for-it.sh -t 30 repo:80 | |||||
| if [ $? -lt 30 ]; then | |||||
| for pom in /poms/*; do | |||||
| mvn -P central -f $pom dependency:go-offline; | |||||
| done | |||||
| else | |||||
| echo "Can't connect to repository" | |||||
| exit 255 | |||||
| fi | |||||
| @@ -3,12 +3,12 @@ | |||||
| <mirror> | <mirror> | ||||
| <id>central</id> | <id>central</id> | ||||
| <mirrorOf>central</mirrorOf> | <mirrorOf>central</mirrorOf> | ||||
| <url>http://localhost:9001/releases</url> | |||||
| <url>http://repo/releases</url> | |||||
| </mirror> | </mirror> | ||||
| <mirror> | <mirror> | ||||
| <id>confluent</id> | <id>confluent</id> | ||||
| <mirrorOf>confluent</mirrorOf> | <mirrorOf>confluent</mirrorOf> | ||||
| <url>http://localhost:9001/confluent</url> | |||||
| <url>http://repo/confluent</url> | |||||
| </mirror> | </mirror> | ||||
| </mirrors> | </mirrors> | ||||
| </settings> | </settings> | ||||
| @@ -1,14 +0,0 @@ | |||||
| #!/bin/sh | |||||
| COCLI=docker # or podman | |||||
| $COCLI run --network=host -it --rm -v $(pwd)/../examples:/poms maven-sync-job | |||||
| cd ../data/repositories/releases/ | |||||
| echo "Creating a tarball of the Releases" | |||||
| tar zcvf ../../maven-releases-packages.tar.gz * 2>/dev/null | |||||
| echo "Creating a tarball of the Snapshots" | |||||
| cd ../snapshots | |||||
| tar zcvf ../../maven-snapshots-packages.tar.gz * 2>/dev/null | |||||
| echo "NEXT: mirror *.tar.gz and import into Artifactory." | |||||
| @@ -0,0 +1,20 @@ | |||||
| The MIT License (MIT) | |||||
| Copyright (c) 2016 Giles Hall | |||||
| Permission is hereby granted, free of charge, to any person obtaining a copy of | |||||
| this software and associated documentation files (the "Software"), to deal in | |||||
| the Software without restriction, including without limitation the rights to | |||||
| use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies | |||||
| of the Software, and to permit persons to whom the Software is furnished to do | |||||
| so, subject to the following conditions: | |||||
| The above copyright notice and this permission notice shall be included in all | |||||
| copies or substantial portions of the Software. | |||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||||
| SOFTWARE. | |||||
| @@ -0,0 +1,182 @@ | |||||
| #!/usr/bin/env bash | |||||
| # Use this script to test if a given TCP host/port are available | |||||
| WAITFORIT_cmdname=${0##*/} | |||||
| echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } | |||||
| usage() | |||||
| { | |||||
| cat << USAGE >&2 | |||||
| Usage: | |||||
| $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args] | |||||
| -h HOST | --host=HOST Host or IP under test | |||||
| -p PORT | --port=PORT TCP port under test | |||||
| Alternatively, you specify the host and port as host:port | |||||
| -s | --strict Only execute subcommand if the test succeeds | |||||
| -q | --quiet Don't output any status messages | |||||
| -t TIMEOUT | --timeout=TIMEOUT | |||||
| Timeout in seconds, zero for no timeout | |||||
| -- COMMAND ARGS Execute command with args after the test finishes | |||||
| USAGE | |||||
| exit 1 | |||||
| } | |||||
| wait_for() | |||||
| { | |||||
| if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then | |||||
| echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" | |||||
| else | |||||
| echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout" | |||||
| fi | |||||
| WAITFORIT_start_ts=$(date +%s) | |||||
| while : | |||||
| do | |||||
| if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then | |||||
| nc -z $WAITFORIT_HOST $WAITFORIT_PORT | |||||
| WAITFORIT_result=$? | |||||
| else | |||||
| (echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1 | |||||
| WAITFORIT_result=$? | |||||
| fi | |||||
| if [[ $WAITFORIT_result -eq 0 ]]; then | |||||
| WAITFORIT_end_ts=$(date +%s) | |||||
| echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds" | |||||
| break | |||||
| fi | |||||
| sleep 1 | |||||
| done | |||||
| return $WAITFORIT_result | |||||
| } | |||||
| wait_for_wrapper() | |||||
| { | |||||
| # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 | |||||
| if [[ $WAITFORIT_QUIET -eq 1 ]]; then | |||||
| timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & | |||||
| else | |||||
| timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & | |||||
| fi | |||||
| WAITFORIT_PID=$! | |||||
| trap "kill -INT -$WAITFORIT_PID" INT | |||||
| wait $WAITFORIT_PID | |||||
| WAITFORIT_RESULT=$? | |||||
| if [[ $WAITFORIT_RESULT -ne 0 ]]; then | |||||
| echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" | |||||
| fi | |||||
| return $WAITFORIT_RESULT | |||||
| } | |||||
| # process arguments | |||||
| while [[ $# -gt 0 ]] | |||||
| do | |||||
| case "$1" in | |||||
| *:* ) | |||||
| WAITFORIT_hostport=(${1//:/ }) | |||||
| WAITFORIT_HOST=${WAITFORIT_hostport[0]} | |||||
| WAITFORIT_PORT=${WAITFORIT_hostport[1]} | |||||
| shift 1 | |||||
| ;; | |||||
| --child) | |||||
| WAITFORIT_CHILD=1 | |||||
| shift 1 | |||||
| ;; | |||||
| -q | --quiet) | |||||
| WAITFORIT_QUIET=1 | |||||
| shift 1 | |||||
| ;; | |||||
| -s | --strict) | |||||
| WAITFORIT_STRICT=1 | |||||
| shift 1 | |||||
| ;; | |||||
| -h) | |||||
| WAITFORIT_HOST="$2" | |||||
| if [[ $WAITFORIT_HOST == "" ]]; then break; fi | |||||
| shift 2 | |||||
| ;; | |||||
| --host=*) | |||||
| WAITFORIT_HOST="${1#*=}" | |||||
| shift 1 | |||||
| ;; | |||||
| -p) | |||||
| WAITFORIT_PORT="$2" | |||||
| if [[ $WAITFORIT_PORT == "" ]]; then break; fi | |||||
| shift 2 | |||||
| ;; | |||||
| --port=*) | |||||
| WAITFORIT_PORT="${1#*=}" | |||||
| shift 1 | |||||
| ;; | |||||
| -t) | |||||
| WAITFORIT_TIMEOUT="$2" | |||||
| if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi | |||||
| shift 2 | |||||
| ;; | |||||
| --timeout=*) | |||||
| WAITFORIT_TIMEOUT="${1#*=}" | |||||
| shift 1 | |||||
| ;; | |||||
| --) | |||||
| shift | |||||
| WAITFORIT_CLI=("$@") | |||||
| break | |||||
| ;; | |||||
| --help) | |||||
| usage | |||||
| ;; | |||||
| *) | |||||
| echoerr "Unknown argument: $1" | |||||
| usage | |||||
| ;; | |||||
| esac | |||||
| done | |||||
| if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then | |||||
| echoerr "Error: you need to provide a host and port to test." | |||||
| usage | |||||
| fi | |||||
| WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15} | |||||
| WAITFORIT_STRICT=${WAITFORIT_STRICT:-0} | |||||
| WAITFORIT_CHILD=${WAITFORIT_CHILD:-0} | |||||
| WAITFORIT_QUIET=${WAITFORIT_QUIET:-0} | |||||
| # Check to see if timeout is from busybox? | |||||
| WAITFORIT_TIMEOUT_PATH=$(type -p timeout) | |||||
| WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH) | |||||
| WAITFORIT_BUSYTIMEFLAG="" | |||||
| if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then | |||||
| WAITFORIT_ISBUSY=1 | |||||
| # Check if busybox timeout uses -t flag | |||||
| # (recent Alpine versions don't support -t anymore) | |||||
| if timeout &>/dev/stdout | grep -q -e '-t '; then | |||||
| WAITFORIT_BUSYTIMEFLAG="-t" | |||||
| fi | |||||
| else | |||||
| WAITFORIT_ISBUSY=0 | |||||
| fi | |||||
| if [[ $WAITFORIT_CHILD -gt 0 ]]; then | |||||
| wait_for | |||||
| WAITFORIT_RESULT=$? | |||||
| exit $WAITFORIT_RESULT | |||||
| else | |||||
| if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then | |||||
| wait_for_wrapper | |||||
| WAITFORIT_RESULT=$? | |||||
| else | |||||
| wait_for | |||||
| WAITFORIT_RESULT=$? | |||||
| fi | |||||
| fi | |||||
| if [[ $WAITFORIT_CLI != "" ]]; then | |||||
| if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then | |||||
| echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess" | |||||
| exit $WAITFORIT_RESULT | |||||
| fi | |||||
| exec "${WAITFORIT_CLI[@]}" | |||||
| else | |||||
| exit $WAITFORIT_RESULT | |||||
| fi | |||||