This repository has been archived by the owner on Sep 23, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added tentacle-multiserverpolling custom tentacle image and updated r…
…elevant workflow build
- Loading branch information
Cory Reid
committed
Feb 25, 2022
1 parent
bcc585e
commit d39bba8
Showing
6 changed files
with
571 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
45
tentacle-multiserverpolling/install-scripts/install-docker.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
264
tentacle-multiserverpolling/scripts/configure-tentacle.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 "" |
Oops, something went wrong.