restructured and added script to create aws containers

This commit is contained in:
Vinay Aggarwal
2020-03-26 07:13:32 -07:00
parent 75833a3d44
commit 67fd380371
49 changed files with 309 additions and 4690 deletions

12
Amazon/containers/Dockerfile Executable file
View File

@@ -0,0 +1,12 @@
ARG UPSTREAM_IMAGE=docker.bintray.io/jfrog/artifactory-jcr
ARG UPSTREAM_TAG
FROM ${UPSTREAM_IMAGE}:${UPSTREAM_TAG}
USER root
# Copy security.xml
COPY ./security.xml /security_bootstrap/security.import.xml
RUN chown -R artifactory:artifactory /security_bootstrap
# Copy entrypoint script.
COPY ./entrypoint-artifactory.sh /entrypoint-artifactory.sh
COPY ./installer-info.json /artifactory_bootstrap/info/installer-info.json
RUN chmod 755 /entrypoint-artifactory.sh
USER artifactory

27
Amazon/containers/a.json Normal file
View File

@@ -0,0 +1,27 @@
{
"router": {
"node_id": "1dae71383ae3",
"state": "HEALTHY",
"message": "OK"
},
"services": [
{
"service_id": "jfac@01e49jb08bm7051xb2rp9k1ed8",
"node_id": "1dae71383ae3",
"state": "UNHEALTHY_PEER",
"message": "Service is healthy; there is at least one unhealthy service; there are missing services: jffe"
},
{
"service_id": "jfmd@01e49jbpqfhn39k8z3kyvqepzh",
"node_id": "1dae71383ae3",
"state": "UNHEALTHY_PEER",
"message": "Service is healthy; there is at least one unhealthy service; there are missing services: jffe"
},
{
"service_id": "jfrt@01e49jcq7t96ag11tq25h60759",
"node_id": "1dae71383ae3",
"state": "UNHEALTHY",
"message": "unexpected response status code: 503"
}
]
}

View File

@@ -0,0 +1,90 @@
#!/usr/bin/env bash
VERSION=$1
EDITIONS=( artifactory-pro artifactory-jcr )
#EDITIONS=( artifactory-jcr )
#EDITIONS=( artifactory-pro )
#for loop start: editoins
for EDITION in "${EDITIONS[@]}"
do
UPSTREAM_IMAGE_NAME=docker.bintray.io/jfrog/$EDITION
BUILD_IMAGE_NAME=partnership-public-images.jfrog.io/aws/$EDITION
ARTIFACTORY_PASSWORD=corona1831
# Logic starts here
if [ -z "$VERSION" ]
then
echo "No version passed in. Build failed."
echo "usage: buildAwsContainers <vesion> <edition>"
echo "example: buildAwsContainers artifactory-pro 7.2.1 "
exit -1
fi
# Extract and modify the entrypoint to run out custom code for first-time password
docker pull $UPSTREAM_IMAGE_NAME:$VERSION
docker run -d --rm --name tmp-docker $UPSTREAM_IMAGE_NAME:$VERSION
docker cp tmp-docker:/entrypoint-artifactory.sh original-entrypoint.sh
docker rm -f tmp-docker
perl -pe 's/^addExtraJavaArgs$/`cat extra_conf`/ge' original-entrypoint.sh > entrypoint-artifactory.sh
#Create installer-info file
if [ "$EDITION" == "artifactory-pro" ]
then
cat <<EOF > installer-info.json
{
"productId": "CloudFormation_artifactory-ha/$VERSION",
"features": [
{
"featureId": "Partner/ACC-006973"
}
]
}
EOF
else
cat <<EOF > installer-info.json
{
"productId": "CloudFormation_artifactory-jcr/$VERSION",
"features": [
{
"featureId": "Partner/ACC-006973"
}
]
}
EOF
fi
cat installer-info.json
# Create the new docker image
docker build --no-cache --build-arg UPSTREAM_TAG=$VERSION -t $BUILD_IMAGE_NAME:$VERSION .
# Run minimal test
set -x
docker run --name test-new-image -d -e ARTIFACTORY_PASSWORD=$ARTIFACTORY_PASSWORD -p 8081:8081 -p 8082:8082 $BUILD_IMAGE_NAME:$VERSION
# Wait for it to come up
SUCCESS=false
for i in {1..30}
do
STATUS=$(curl -u admin:$ARTIFACTORY_PASSWORD http://localhost:8082/router/api/v1/system/health | jq .services[0].state)
if [ "$STATUS" == "\"HEALTHY\"" ]; then
echo "Build successful!"
SUCCESS=true
break
fi
echo "Container is not up yet, waiting 10 seconds..."
sleep 10
done
if [ "$SUCCESS" = true ] ; then
echo "Test Succeeded. Build succeeded."
docker push $BUILD_IMAGE_NAME:$VERSION
else
echo "Test failed. Build failed. Removing docker image"
fi
#clearnup
docker stop test-new-image
docker rm test-new-image
rm installer-info.json
#for loop endL: editions
done

View File

@@ -0,0 +1,72 @@
#!/bin/bash
#
# An entrypoint script for Artifactory to allow custom setup before server starts
#
: ${ARTIFACTORY_NAME:=artifactory}
JF_ARTIFACTORY_PID=${JF_PRODUCT_HOME}/app/run/${ARTIFACTORY_NAME}.pid
. ${JF_PRODUCT_HOME}/app/bin/installerCommon.sh
ARTIFACTORY_BIN_FOLDER=${JF_PRODUCT_HOME}/app/bin
sourceScript(){
local file=$1
[ ! -z "${file}" ] || errorExit "target file is not passed to source a file"
[ -f "${file}" ] || errorExit "${file} file is not found"
source "${file}" || errorExit "Unable to source ${file}, please check if the $USER user has permissions to perform this action"
}
initHelpers(){
local systemYamlHelper="${ARTIFACTORY_BIN_FOLDER}"/systemYamlHelper.sh
local installerCommon="${ARTIFACTORY_BIN_FOLDER}"/installerCommon.sh
local artCommon="${ARTIFACTORY_BIN_FOLDER}"/artifactoryCommon.sh
export YQ_PATH="${ARTIFACTORY_BIN_FOLDER}/../third-party/yq"
sourceScript "${systemYamlHelper}"
sourceScript "${installerCommon}"
sourceScript "${artCommon}"
export JF_SYSTEM_YAML="${JF_PRODUCT_HOME}/var/etc/system.yaml"
}
# Print on container startup information about Dockerfile location
printDockerFileLocation() {
logger "Dockerfile for this image can found inside the container."
logger "To view the Dockerfile: 'cat /docker/artifactory-pro/Dockerfile.artifactory'."
}
terminate () {
echo -e "\nTerminating Artifactory"
${JF_PRODUCT_HOME}/app/bin/artifactory.sh stop
}
# Catch Ctrl+C and other termination signals to try graceful shutdown
trap terminate SIGINT SIGTERM SIGHUP
logger "Preparing to run Artifactory in Docker"
logger "Running as $(id)"
printDockerFileLocation
initHelpers
# Wait for DB
# On slow systems, when working with docker-compose, the DB container might be up,
# but not ready to accept connections when Artifactory is already trying to access it.
waitForDB
[ $? -eq 0 ] || errorExit "Database failed to start in the given time"
# Run Artifactory as JF_ARTIFACTORY_USER user
exec ${JF_PRODUCT_HOME}/app/bin/artifactory.sh &
art_pid=$!
if [ -n "$JF_ARTIFACTORY_PID" ];
then
mkdir -p $(dirname "$JF_ARTIFACTORY_PID") || \
errorExit "Could not create dir for $JF_ARTIFACTORY_PID";
fi
echo "${art_pid}" > ${JF_ARTIFACTORY_PID}
wait ${art_pid}

18
Amazon/containers/extra_conf Executable file
View File

@@ -0,0 +1,18 @@
addExtraJavaArgs
setupFirstTimePass() {
# Create a unique password
if [ -z "$ARTIFACTORY_PASSWORD" ]; then
echo "INFO: Since ARTIFACTORY_PASSWORD environment is not set. We are generating our own random password."
ARTIFACTORY_PASSWORD=$(openssl rand -base64 32 | tr -dc A-Za-z0-9 | head -c 18)
echo "Generated ARTIFACTORY_PASSWORD is $ARTIFACTORY_PASSWORD"
echo $ARTIFACTORY_PASSWORD > /var/opt/jfrog/artifactory/generated-pass.txt
fi
SALTED_PASSWD=$(echo -n ${ARTIFACTORY_PASSWORD}{CAFEBABEEBABEFAC} | md5sum | cut -d ' ' -f1)
sed -i -e "s/<password></<password>$SALTED_PASSWD</g" /security_bootstrap/security.import.xml
cp /security_bootstrap/security.import.xml /var/opt/jfrog/artifactory/etc/artifactory/security/security.import.xml
}
# Set up first time password only on initial boot
if [[ ! -f "/var/opt/jfrog/artifactory/init.boot.done" ]]; then
touch /var/opt/jfrog/artifactory/init.boot.done
setupFirstTimePass
fi

View File

@@ -0,0 +1,72 @@
#!/bin/bash
#
# An entrypoint script for Artifactory to allow custom setup before server starts
#
: ${ARTIFACTORY_NAME:=artifactory}
JF_ARTIFACTORY_PID=${JF_PRODUCT_HOME}/app/run/${ARTIFACTORY_NAME}.pid
. ${JF_PRODUCT_HOME}/app/bin/installerCommon.sh
ARTIFACTORY_BIN_FOLDER=${JF_PRODUCT_HOME}/app/bin
sourceScript(){
local file=$1
[ ! -z "${file}" ] || errorExit "target file is not passed to source a file"
[ -f "${file}" ] || errorExit "${file} file is not found"
source "${file}" || errorExit "Unable to source ${file}, please check if the $USER user has permissions to perform this action"
}
initHelpers(){
local systemYamlHelper="${ARTIFACTORY_BIN_FOLDER}"/systemYamlHelper.sh
local installerCommon="${ARTIFACTORY_BIN_FOLDER}"/installerCommon.sh
local artCommon="${ARTIFACTORY_BIN_FOLDER}"/artifactoryCommon.sh
export YQ_PATH="${ARTIFACTORY_BIN_FOLDER}/../third-party/yq"
sourceScript "${systemYamlHelper}"
sourceScript "${installerCommon}"
sourceScript "${artCommon}"
export JF_SYSTEM_YAML="${JF_PRODUCT_HOME}/var/etc/system.yaml"
}
# Print on container startup information about Dockerfile location
printDockerFileLocation() {
logger "Dockerfile for this image can found inside the container."
logger "To view the Dockerfile: 'cat /docker/artifactory-pro/Dockerfile.artifactory'."
}
terminate () {
echo -e "\nTerminating Artifactory"
${JF_PRODUCT_HOME}/app/bin/artifactory.sh stop
}
# Catch Ctrl+C and other termination signals to try graceful shutdown
trap terminate SIGINT SIGTERM SIGHUP
logger "Preparing to run Artifactory in Docker"
logger "Running as $(id)"
printDockerFileLocation
initHelpers
# Wait for DB
# On slow systems, when working with docker-compose, the DB container might be up,
# but not ready to accept connections when Artifactory is already trying to access it.
waitForDB
[ $? -eq 0 ] || errorExit "Database failed to start in the given time"
# Run Artifactory as JF_ARTIFACTORY_USER user
exec ${JF_PRODUCT_HOME}/app/bin/artifactory.sh &
art_pid=$!
if [ -n "$JF_ARTIFACTORY_PID" ];
then
mkdir -p $(dirname "$JF_ARTIFACTORY_PID") || \
errorExit "Could not create dir for $JF_ARTIFACTORY_PID";
fi
echo "${art_pid}" > ${JF_ARTIFACTORY_PID}
wait ${art_pid}

18
Amazon/containers/security.xml Executable file
View File

@@ -0,0 +1,18 @@
<security version="v8">
<users>
<user>
<username>admin</username>
<password></password>
<salt>CAFEBABEEBABEFAC</salt>
<admin>true</admin>
<enabled>true</enabled>
<updatableProfile>true</updatableProfile>
<accountNonExpired>true</accountNonExpired>
<credentialsNonExpired>true</credentialsNonExpired>
<accountNonLocked>true</accountNonLocked>
<realm>internal</realm>
<transientUser>false</transientUser>
<groups/>
</user>
</users>
</security>