Files
member_repo/shellscripts/DotDockerbuilder8.sh
Karsten Jeppesen 252b681f30
All checks were successful
DMA-CSD-CICD/member_repo/pipeline/head This commit looks good
test
2025-08-26 13:47:38 +02:00

206 lines
5.6 KiB
Bash

#!/bin/bash
VERSION="2025.05.12-1430"
usage() {
cat << EOF
DotDockerBuilder8 Version:$VERSION
Arguments:
-D|--directory (optional) path to solution folder
-S|--solution (mandatory) solution name
-P|--project (mandatory) project name
-p|--port (mandatory) exposed port
-G|--git (optional) git URI (gitea.a.ucnit.eu)
-U|--gituser (optional) authorized git user (docker)
-A|--accesstoken (optional) accesstoken for git user
-h|--help this text
EOF
exit
}
[ $# -eq 0 ] && usage
DIRECTORY=""
SOLUTION=""
PROJECT=""
EXPOSED_PORT="80"
while [[ $# -gt 0 ]]; do
case $1 in
-D|--directory)
DIRECTORY="$2"
shift # past argument
shift # past value
;;
-S|--solution)
SOLUTION="$2"
shift # past argument
shift # past value
;;
-P|--project)
PROJECT="$2"
shift # past argument
shift # past value
;;
-p|--port)
EXPOSED_PORT="$2"
shift # past argument
shift # past value
;;
-G|--git)
Git="$2"
shift # past argument
shift # past value
;;
-U|--gituser)
GitUser="$2"
shift # past argument
shift # past value
;;
-A|--accesstoken)
AccessToken="$2"
shift # past argument
shift # past value
;;
-h|--help)
usage
;;
-*|--*)
echo "Unknown option $1"
usage
;;
*)
shift # past argument
;;
esac
done
[ -n "$DIRECTORY" ] && cd $DIRECTORY
if [ ! -e $SOLUTION/$PROJECT/$PROJECT.csproj ]; then
echo "Error, Not found: $SOLUTION/$PROJECT/$PROJECT.csproj"
echo "Executed from $(pwd)"
cat << EOF
Usage:
$0 (-S|--solution) solution (-P|--project) project (-p|--port) exposed_port
Please call from just outside solution folder
EOF
echo "Current directory: $(pwd)"
exit
fi
RUNDIR=$pwd
thisArch=$(uname -m)
myRuntime="UNKNOWN"
[ "$thisArch" == "x86_64" ] && myRuntime="linux-x64"
[ "$thisArch" == "aarch64" ] && myRuntime="linux-arm64"
# Dockerfile.dotbuild is executed from parent of solution
cat << EOF > Dockerfile.dotbuild
# Version 2024.01.26 1702
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE $EXPOSED_PORT
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY $SOLUTION ./
RUN pwd
RUN dotnet restore "$PROJECT/$PROJECT.csproj"
RUN dotnet build "$PROJECT/$PROJECT.csproj" -c Release --self-contained --runtime $myRuntime -o /app/build
RUN ls -lR /app
FROM build AS publish
RUN dotnet publish "$PROJECT/$PROJECT.csproj" -c Release --self-contained --runtime $myRuntime -o /app/publish
RUN ls -lR /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
#ENTRYPOINT ["dotnet", "$PROJECT.dll"]
### New section
### CHECK_PORTS="mysql:3306 rabbitMQ:5672"
COPY start.dotbuild ./kajestartup.sh
RUN chmod 755 kajestartup.sh
CMD ./kajestartup.sh
RUN pwd
RUN ls -l
RUN cat ./kajestartup.sh
EOF
cat << EOF > start.dotbuild
#!/bin/bash
echo "Version 22.10.15 1446"
if [ -n "\$CHECK_PORTS" ]; then
echo "Must check ports before start"
! which nc >/dev/null && apt-get update && apt-get -y install netcat
for nn in \$(echo "\$CHECK_PORTS" | tr ';' ' '); do
xHost=\$(echo "\$nn" | cut -f 1 -d ':')
xPort=\$(echo "\$nn" | cut -f 2 -d ':')
echo "Checking Host: \$xHost Port: \$xPort"
while ! nc -z -v \$xHost \$xPort; do
echo "Waiting for Host: \$xHost Port: \$xPort"
sleep 5
done
echo "Checking Host: \$xHost Port: \$xPort ... OK"
done
echo "Checking ports done..."
fi
# Adding DOCKER_HOST will cause an entry in /etc/hosts for local access to host platform
if [ -n "\$DOCKER_HOST" ] && grep -qv "KAJE" /etc/hosts; then
echo "Adding DOCKER_HOST to /etc/hosts"
b0=\$(cat /proc/net/route | sed -n '2,2 p' | cut -b 21-22)
b1=\$(cat /proc/net/route | sed -n '2,2 p' | cut -b 19-20)
b2=\$(cat /proc/net/route | sed -n '2,2 p' | cut -b 17-18)
b3=\$(cat /proc/net/route | sed -n '2,2 p' | cut -b 15-16)
echo "\$((16#\$b0)).\$((16#\$b1)).\$((16#\$b2)).\$((16#\$b3)) \$DOCKER_HOST" >> /etc/hosts
echo "# KAJE WAS HERE" >> /etc/hosts
echo "Changed /etc/hosts:"
cat /etc/hosts
fi
echo "Starting: \$(date)"
dotnet $PROJECT.dll
[ "\$ZOMBIE" == "YES" ] && echo "ZOMBIE STATE ENTERED" && sleep 1d
EOF
# We are just outside solution folder
tagName=$(echo "$PROJECT" | tr '[:upper:]' '[:lower:]')
pwd
if [ -e $SOLUTION/$PROJECT/$PROJECT.csproj ]; then
echo "Project file OK"
else
echo "Project file NOK"
exit
fi
echo "--------------"
cat ./Dockerfile.dotbuild
echo "--------------"
echo "docker build --file ./Dockerfile.dotbuild --tag=$tagName:latest ."
sudo docker build --file ./Dockerfile.dotbuild --tag=$tagName:latest .
if [ -n "$Git" ]; then
CONTAINERNAME=$(echo -n "$Git/$GitUser/$tagName" | tr '[:upper:]' '[:lower:]')
sudo docker image rm $CONTAINERNAME:latest
sudo docker image rm $CONTAINERNAME:$(date +%y%m%d)
sudo docker image tag $tagName:latest $CONTAINERNAME:latest
sudo docker image tag $tagName:latest $CONTAINERNAME:$(date +%y%m%d)
sudo docker image ls
echo "Pushing images to repository"
sudo docker login $Git --username=$GitUser --password=$AccessToken
echo "docker push $CONTAINERNAME:latest"
sudo docker push $CONTAINERNAME:latest
echo "docker push $CONTAINERNAME:$(date +%y%m%d)"
sudo docker push $CONTAINERNAME:$(date +%y%m%d)
echo "Cleaning up: [$tagName:latest] [$CONTAINERNAME:latest] [$CONTAINERNAME:$(date +%y%m%d)]"
sudo docker image rm $tagName:latest
sudo docker image rm $CONTAINERNAME:latest $CONTAINERNAME:$(date +%y%m%d)
fi
sudo docker image prune --force
echo "Done..."