Skip to content
This repository has been archived by the owner on Sep 23, 2024. It is now read-only.

Commit

Permalink
Added tentacle-multiserverpolling custom tentacle image and updated r…
Browse files Browse the repository at this point in the history
…elevant workflow build
  • Loading branch information
Cory Reid committed Feb 25, 2022
1 parent bcc585e commit d39bba8
Show file tree
Hide file tree
Showing 6 changed files with 571 additions and 0 deletions.
16 changes: 16 additions & 0 deletions .github/workflows/dockerhubpush.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ env:
DOTNET_CORE_IMAGE_NAME: octopuslabs/tentacle-dotnetcoreworker
JAVA_IMAGE_NAME: octopuslabs/tentacle-javaworker
NODEJS_IMAGE_NAME: octopuslabs/tentacle-nodejsworker
POLLING_MULTI_SERVER_IMAGE_NAME: octopuslabs/tentacle-multiserverpolling

jobs:
# Push image to GitHub Packages.
Expand Down Expand Up @@ -141,4 +142,19 @@ jobs:
docker push $K8S_IMAGE_NAME:$VERSION
docker push $K8S_IMAGE_NAME:latest
- name: Build multi-server polling image
run: docker build ./tentacle-multiserverpolling --tag $POLLING_MULTI_SERVER_IMAGE_NAME

- name: Push multi-server polling image to DockerHub
run: |
# Strip git ref prefix from version
VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
# Strip "v" prefix from tag name
[[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
echo VERSION=$VERSION
docker tag $POLLING_MULTI_SERVER_IMAGE_NAME $POLLING_MULTI_SERVER_IMAGE_NAME:latest
docker tag $POLLING_MULTI_SERVER_IMAGE_NAME $POLLING_MULTI_SERVER_IMAGE_NAME:$VERSION
docker push $POLLING_MULTI_SERVER_IMAGE_NAME:$VERSION
docker push $POLLING_MULTI_SERVER_IMAGE_NAME:latest
46 changes: 46 additions & 0 deletions tentacle-multiserverpolling/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
FROM octopusdeploy/tentacle

RUN apt-get update && \
apt-get install -y curl sudo dos2unix jq && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

EXPOSE 10933

WORKDIR /tmp

COPY docker/linux/install-scripts/* /install-scripts/
RUN chmod +x /install-scripts/*.sh

COPY docker/linux/scripts/* /scripts/
RUN chmod +x /scripts/*.sh

WORKDIR /

# We know this won't reduce the image size at all. It's just to make the filesystem a little tidier.
RUN rm -rf /tmp/*

ENV OCTOPUS_RUNNING_IN_CONTAINER=Y
ENV ACCEPT_EULA=N
ENV CustomPublicHostName=""
ENV DISABLE_DIND=N
ENV ListeningPort=""
ENV MachinePolicy="Default Machine Policy"
ENV PublicHostNameConfiguration="ComputerName"
ENV ServerApiKey=""
ENV ServerPassword=""
ENV ServerPort=""
ENV ServerUrl=""
ENV ServerUsername=""
ENV Space="Default"
ENV TargetEnvironment=""
ENV TargetName=""
ENV TargetRole=""
ENV TargetTenant=""
ENV TargetTenantTag=""
ENV TargetTenantedDeploymentParticipation=""
ENV TargetWorkerPool=""

VOLUME /var/lib/docker

CMD /scripts/configure-tentacle.sh && /scripts/run-tentacle.sh
45 changes: 45 additions & 0 deletions tentacle-multiserverpolling/install-scripts/install-docker.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#!/bin/bash
set -eux

# This script is adapted from https://github.com/docker-library/docker/blob/master/19.03/dind/Dockerfile

apt-get update

# https://github.com/docker/docker/blob/master/project/PACKAGERS.md#runtime-dependencies
apt-get install -y \
btrfs-progs \
e2fsprogs \
iptables \
openssl \
uidmap \
xfsprogs \
xz-utils \
pigz \
dos2unix

# set up subuid/subgid so that "--userns-remap=default" works out-of-the-box
addgroup --system dockremap
adduser --system --group dockremap
echo 'dockremap:165536:65536' >> /etc/subuid
echo 'dockremap:165536:65536' >> /etc/subgid

# https://github.com/docker/docker/tree/master/hack/dind
export DIND_COMMIT=37498f009d8bf25fbb6199e8ccd34bed84f2874b

curl -o /usr/local/bin/dind "https://raw.githubusercontent.com/docker/docker/${DIND_COMMIT}/hack/dind"
chmod +x /usr/local/bin/dind
dos2unix /usr/local/bin/dind

chmod +x /usr/local/bin/dockerd-entrypoint.sh
dos2unix /usr/local/bin/dockerd-entrypoint.sh

export VERSION=19
curl -sSL https://get.docker.com/ | sh

# https://forums.docker.com/t/failing-to-start-dockerd-failed-to-create-nat-chain-docker/78269
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
update-alternatives --set iptables /usr/sbin/iptables-legacy

# Remove the apt cache
apt-get clean
rm -rf /var/lib/apt/lists/*
264 changes: 264 additions & 0 deletions tentacle-multiserverpolling/scripts/configure-tentacle.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,264 @@
#!/bin/bash
set -e

if [[ "$ACCEPT_EULA" != "Y" ]]; then
echo "ERROR: You must accept the EULA at https://octopus.com/company/legal by passing an environment variable 'ACCEPT_EULA=Y'"
exit 1
fi

# Tentacle Docker images only support once instance per container. Running multiple instances can be achieved by running multiple containers.
instanceName=Tentacle
configurationDirectory=/etc/octopus
applicationsDirectory=/home/Octopus/Applications
alreadyConfiguredSemaphore="$configurationDirectory/.configuredSemaphore"
internalListeningPort=10933

mkdir -p $configurationDirectory
mkdir -p $applicationsDirectory

if [ ! -f /usr/bin/tentacle ]; then
ln -s /opt/octopus/tentacle/Tentacle /usr/bin/tentacle
fi

if [ -f "$alreadyConfiguredSemaphore" ]; then
echo "Octopus Tentacle is already configured. Skipping reconfiguration."
echo "If you want to force reconfiguration, please delete the file $alreadyConfiguredSemaphore and re-launch the container."
exit 0
fi

function getPublicHostName() {
if [[ "$PublicHostNameConfiguration" == "PublicIp" ]]; then
curl https://api.ipify.org/
elif [[ "$PublicHostNameConfiguration" == "FQDN" ]]; then
hostname --fqdn
elif [[ "$PublicHostNameConfiguration" == "ComputerName" ]]; then
hostname
elif [[ "$PublicHostNameConfiguration" == "CustomInternal" ]]; then
hostname -i
else
echo $CustomPublicHostName
fi
}

function validateVariables() {
if [[ -z "$ServerApiKey" ]]; then
if [[ -z "$ServerPassword" || -z "$ServerUsername" ]]; then
echo "Please specify either an API key or a username/password with the 'ServerApiKey' or 'ServerUsername'/'ServerPassword' environment variables" >&2
exit 1
fi
fi

if [[ -z "$ServerUrl" ]]; then
echo "Please specify an Octopus Server with the 'ServerUrl' environment variable" >&2
exit 1
fi

if [[ ! -z "$TargetWorkerPool" ]]; then
if [[ ! -z "$TargetEnvironment" ]]; then
echo "The 'TargetEnvironment' environment variable is not valid in combination with the 'TargetWorkerPool' variable" >&2
exit 1
fi

if [[ ! -z "$TargetRole" ]]; then
echo "The 'TargetRole' environment variable is not valid in combination with the 'TargetWorkerPool' variable" >&2
exit 1
fi
else
if [[ -z "$TargetEnvironment" ]]; then
echo "Please specify an environment name with the 'TargetEnvironment' environment variable" >&2
exit 1
fi

if [[ -z "$TargetRole" ]]; then
echo "Please specify a role name with the 'TargetRole' environment variable" >&2
exit 1
fi
fi

echo " - server endpoint '$ServerUrl'"
echo " - api key '##########'"
if [[ ! -z "$ServerPort" ]]; then
echo " - communication mode 'Polling' (Active)"
echo " - server port $ServerPort"
else
echo " - communication mode 'Listening' (Passive)"
echo " - registered port $ListeningPort"
fi
if [[ ! -z "$TargetWorkerPool" ]]; then
echo " - worker pool '$TargetWorkerPool'"
else
echo " - environment '$TargetEnvironment'"
echo " - role '$TargetRole'"
fi
echo " - host '$PublicHostNameConfiguration'"
if [[ ! -z "$TargetName" ]]; then
echo " - name '$TargetName'"
fi
if [[ ! -z "$TargetTenant" ]]; then
echo " - tenant '$TargetTenant'"
fi
if [[ ! -z "$TargetTenantTag" ]]; then
echo " - tenant tag '$TargetTenantTag'"
fi
if [[ ! -z "$TargetTenantedDeploymentParticipation" ]]; then
echo " - tenanted deployment participation '$TargetTenantedDeploymentParticipation'"
fi
if [[ ! -z "$Space" ]]; then
echo " - space '$Space'"
fi
}

function configureTentacle() {
tentacle create-instance --instance "$instanceName" --config "$configurationDirectory/tentacle.config"

echo "Setting directory paths ..."
tentacle configure --instance "$instanceName" --app "$applicationsDirectory"

echo "Configuring communication type ..."
if [[ ! -z "$ServerPort" ]]; then
tentacle configure --instance "$instanceName" --noListen "True"
else
tentacle configure --instance "$instanceName" --port $internalListeningPort --noListen "False"
fi

echo "Updating trust ..."
tentacle configure --instance "$instanceName" --reset-trust

echo "Creating certificate ..."
tentacle new-certificate --instance "$instanceName" --if-blank
}

function registerTentacle() {
echo "Registering with server ..."

local ARGS=()

if [[ ! -z "$TargetWorkerPool" ]]; then
ARGS+=('register-worker')

IFS=',' read -ra WORKER_POOLS <<<"$TargetWorkerPool"
for i in "${WORKER_POOLS[@]}"; do
ARGS+=('--workerpool' "$i")
done
else
ARGS+=('register-with')

if [[ ! -z "$TargetEnvironment" ]]; then
IFS=',' read -ra ENVIRONMENTS <<<"$TargetEnvironment"
for i in "${ENVIRONMENTS[@]}"; do
ARGS+=('--environment' "$i")
done
fi

if [[ ! -z "$TargetRole" ]]; then
IFS=',' read -ra ROLES <<<"$TargetRole"
for i in "${ROLES[@]}"; do
ARGS+=('--role' "$i")
done
fi

if [[ ! -z "$TargetTenant" ]]; then
IFS=',' read -ra TENANTS <<<"$TargetTenant"
for i in "${TENANTS[@]}"; do
ARGS+=('--tenant' "$i")
done
fi

if [[ ! -z "$TargetTenantTag" ]]; then
IFS=',' read -ra TENANTTAGS <<<"$TargetTenantTag"
for i in "${TENANTTAGS[@]}"; do
ARGS+=('--tenanttag' "$i")
done
fi
fi

ARGS+=(
'--instance' "$instanceName"
'--server' "$1"
'--space' "$Space"
'--policy' "$MachinePolicy"
'--force')

if [[ ! -z "$ServerPort" ]]; then
ARGS+=(
'--comms-style' 'TentacleActive'
'--server-comms-port' $ServerPort)
else
ARGS+=(
'--comms-style' 'TentaclePassive'
'--publicHostName' $(getPublicHostName))

if [[ ! -z "$ListeningPort" && "$ListeningPort" != "$internalListeningPort" ]]; then
ARGS+=('--tentacle-comms-port' $ListeningPort)
fi
fi

if [[ ! -z "$ServerApiKey" ]]; then
echo "Registering Tentacle with API key"
ARGS+=('--apiKey' $ServerApiKey)
else
echo "Registering Tentacle with username/password"
ARGS+=(
'--username' "$ServerUsername"
'--password' "$ServerPassword")
fi

if [[ ! -z "$TargetName" ]]; then
ARGS+=('--name' "$TargetName")
fi

if [[ ! -z "$TargetTenantedDeploymentParticipation" ]]; then
ARGS+=('--tenanted-deployment-participation' "$TargetTenantedDeploymentParticipation")
fi

tentacle "${ARGS[@]}"
}

function registerAdditionalInstances() {

local ARGS=()

ARGS+=(
'poll-server'
'--instance' "$instanceName"
'--server' "$1"
)

if [[ ! -z "$ServerApiKey" ]]; then
echo "Registering Tentacle with API key"
ARGS+=('--apiKey' $ServerApiKey)
else
echo "Registering Tentacle with username/password"
ARGS+=(
'--username' "$ServerUsername"
'--password' "$ServerPassword")
fi

tentacle "${ARGS[@]}"
}

echo "==============================================="
echo "Configuring Octopus Deploy Tentacle"

validateVariables

echo "==============================================="

if [[ ! -z "$ServerUrl" ]]; then
IFS=',' read -ra SERVERURLS <<<"$ServerUrl"
for i in "${SERVERURLS[@]}"; do
if [[ "${SERVERURLS[0]}" == $i ]]; then
echo "Configuring and registering tentacle with this server: $i"
configureTentacle
registerTentacle $i
else
echo "Registering additional server with this tentacle: $i"
registerAdditionalInstances $i
fi
done
fi

touch $alreadyConfiguredSemaphore

echo "Configuration successful."
echo ""
Loading

0 comments on commit d39bba8

Please sign in to comment.