All checks were successful
DMA-CSD-CICD/member_repo/pipeline/head This commit looks good
206 lines
5.6 KiB
Bash
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..."
|