added make script and vars
This commit is contained in:
		
							
								
								
									
										15
									
								
								.vars
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								.vars
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| #/usr/bin/env bash | ||||
|  | ||||
| export GIT_HOST=git.bjphoster.com | ||||
| export DEPLOYMENT_HOST=docker.infra.bjphoster.cloud | ||||
| export DEPLOYMENT_PATHS=/opt/yaskm.bjphoster.com | ||||
| export GO_BUILDER=git.bjphoster.com/docker/gobuilder | ||||
| export GO_VERSION=1.22.2-alpine3.19 | ||||
| export GOOS=linux | ||||
| export GOARCH=amd64 | ||||
| export REPO_ORG=source | ||||
| export REPO_NAME=yaskm | ||||
| export CONTAINER_ORG=git.bjphoster.com/source | ||||
| export CONTAINER_IMAGE=yaskm | ||||
| export CONTAINER_IP=127.0.0.1 | ||||
| export CONTAINER_PORT=3000 | ||||
							
								
								
									
										59
									
								
								deploy.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										59
									
								
								deploy.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| ### | ||||
| # FLOW | ||||
| ### | ||||
| # | ||||
| # convert deployment paths (string) into array of strings | ||||
| # if path is not already set | ||||
| # if number of paths > 1 print the strings with corresponding index | ||||
| # get deployment path index from user | ||||
| # in every case (number of paths = 1 OR index left blank from user), index is 0 | ||||
| # if version is not already set | ||||
| # get version from user | ||||
| # if version is left balnk, version is "latest" | ||||
| # get deployment path from index X of deployments | ||||
| # ssh into deployment host | ||||
| # cd into deployment path | ||||
| # git pull last changes | ||||
| # set correct version in .env file | ||||
| # pull latest docker image and spin up containers | ||||
| # | ||||
|  | ||||
| # Convert deployment paths into array | ||||
| ENVIRONMENTS=($DEPLOYMENT_PATHS) | ||||
|  | ||||
| # Check if the DEPLOYMENT_PATH is not already set | ||||
| if [ -z "${DEPLOYMENT_PATH}" ]; then | ||||
|   # Print and ask for deployment environment (if more than one) | ||||
|   if [ "${#ENVIRONMENTS[@]}" -gt 1 ]; then | ||||
|     for i in "${!ENVIRONMENTS[@]}"; do | ||||
|       echo "$i: ${ENVIRONMENTS[$i]}" | ||||
|     done | ||||
|     read -p "Deployment environment: " DEPLOYMENT_ENVIRONMENT | ||||
|   fi | ||||
|   if [ -z "${DEPLOYMENT_ENVIRONMENT}" ]; then | ||||
|     DEPLOYMENT_ENVIRONMENT=0 | ||||
|   fi | ||||
|   # Select correct path | ||||
|   DEPLOYMENT_PATH="${ENVIRONMENTS[$DEPLOYMENT_ENVIRONMENT]}" | ||||
| fi | ||||
|  | ||||
| # Check if the DEPLOYMENT_VERSION is not already set | ||||
| if [ -z "${DEPLOYMENT_VERSION}" ]; then | ||||
|   # Ask for deployment version | ||||
|   read -p "Version [latest]: " DEPLOYMENT_VERSION | ||||
|   if [ -z "${DEPLOYMENT_VERSION}" ]; then | ||||
|     DEPLOYMENT_VERSION=latest | ||||
|   fi | ||||
| fi | ||||
|  | ||||
| echo "${DEPLOYMENT_PATH}" | ||||
| echo "${DEPLOYMENT_VERSION}" | ||||
|  | ||||
| ssh $DEPLOYMENT_HOST \ | ||||
|   "cd ${DEPLOYMENT_PATH} && \ | ||||
|   git pull && \ | ||||
|   sed -i "s/VERSION=.*/VERSION=${DEPLOYMENT_VERSION}/" .env && \ | ||||
|   docker compose pull && \ | ||||
|   docker compose up -d" | ||||
							
								
								
									
										33
									
								
								dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| # Stage 1 · go builder | ||||
| ARG GO_BUILDER=golang | ||||
| ARG GO_VERSION=latest | ||||
| FROM ${GO_BUILDER}:${GO_VERSION} AS build | ||||
|  | ||||
| ARG GO_OS | ||||
| ARG GO_ARCH | ||||
| ARG GIT_HOST | ||||
| ARG REPO_ORG | ||||
| ARG REPO_NAME | ||||
| ARG APP_VERSION | ||||
|  | ||||
| # Copy the project inside the builder container | ||||
| WORKDIR $GOPATH/src/${GIT_HOST}/$REPO_ORG/$REPO_NAME/ | ||||
| COPY . . | ||||
|  | ||||
| # Build the binary | ||||
| RUN CGO_ENABLED=0 GOOS=${GO_OS} GOARCH=${GO_ARCH} \ | ||||
|     go build \ | ||||
|     -installsuffix cgo \ | ||||
|     -ldflags="-w -s -X 'main.APP_VERSION=${APP_VERSION}' -X 'main.COMMIT_ID=$(git log HEAD --oneline | awk '{print $1}' | head -n1)'" \ | ||||
|     --o /app | ||||
|  | ||||
| # Stage 2 · scratch image | ||||
| FROM scratch | ||||
|  | ||||
| # Copy the necessary stuff from the build stage | ||||
| COPY --from=build /app /app | ||||
| # Copy the certificates - in case of fetches | ||||
| COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/cert.pem | ||||
|  | ||||
| # Execute the binary | ||||
| ENTRYPOINT ["/app"] | ||||
							
								
								
									
										54
									
								
								makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| #!make | ||||
| include .vars | ||||
|  | ||||
| default: version | ||||
|  | ||||
| clean: | ||||
| 	if [ "$$(docker images "$${CONTAINER_ORG}/$${CONTAINER_IMAGE}" --format "{{.Repository}}:{{.Tag}}")" != "" ]; then \ | ||||
| 		docker image rm $$(docker images "$${CONTAINER_ORG}/$${CONTAINER_IMAGE}" --all --format "{{.Repository}}:{{.Tag}}"); \ | ||||
| 	fi | ||||
|  | ||||
| docker: clean | ||||
| 	docker build \ | ||||
| 	--build-arg GO_BUILDER=$${GO_BUILDER} \ | ||||
| 	--build-arg GO_VERSION=$${GO_VERSION} \ | ||||
| 	--build-arg GO_OS=$${GO_OS} \ | ||||
| 	--build-arg GO_ARCH=$${GO_ARCH} \ | ||||
| 	--build-arg GIT_HOST=$${GIT_HOST} \ | ||||
| 	--build-arg REPO_ORG=$${REPO_ORG} \ | ||||
| 	--build-arg REPO_NAME=$${REPO_NAME} \ | ||||
| 	--build-arg APP_VERSION=$${APP_VERSION} \ | ||||
| 	-t $${CONTAINER_ORG}/$${CONTAINER_IMAGE}:$${APP_VERSION} .; \ | ||||
| 	if [ "$$(docker images --filter "dangling=true" --quiet --no-trunc)" != "" ]; then \ | ||||
| 		docker image rm $$(docker images --filter "dangling=true" --quiet --no-trunc); \ | ||||
| 	fi | ||||
|  | ||||
| dockerpush: | ||||
| 	docker push \ | ||||
| 	$${CONTAINER_ORG}/$${CONTAINER_IMAGE}:$${APP_VERSION} | ||||
|  | ||||
| deploy: | ||||
| 	bash -c "./deploy.sh" | ||||
|  | ||||
| version: | ||||
| 	bash -c "./version.sh" | ||||
|  | ||||
| run: | ||||
| 	docker run \ | ||||
| 	--rm \ | ||||
| 	--tty \ | ||||
| 	--interactive \ | ||||
| 	--publish $${CONTAINER_IP}:$${CONTAINER_PORT}:80 \ | ||||
| 	--workdir /go/src/$${GIT_HOST}/$${REPO_ORG}/$${REPO_NAME} \ | ||||
| 	--volume $(shell pwd):/go/src/$${GIT_HOST}/$${REPO_ORG}/$${REPO_NAME} \ | ||||
| 	$${GO_BUILDER}:$${GO_VERSION} \ | ||||
| 	go run . | ||||
|  | ||||
| dockerrun: | ||||
| 	docker run \ | ||||
| 	--rm \ | ||||
| 	--tty \ | ||||
| 	--interactive \ | ||||
| 	--publish $${CONTAINER_IP}:$${CONTAINER_PORT}:80 \ | ||||
| 	--volume $(shell pwd)/config.yml:/config.yml \ | ||||
| 	$${CONTAINER_ORG}/$${CONTAINER_IMAGE}:latest | ||||
							
								
								
									
										42
									
								
								version.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										42
									
								
								version.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| ### | ||||
| # FLOW | ||||
| ### | ||||
| # | ||||
| # get version from user | ||||
| # if version is left balnk, version is "latest" | ||||
| # get docker push from user | ||||
| # if docker push is left blank, it's negative | ||||
| # if version != "latest" create version tag at current commit | ||||
| # make the app | ||||
| # if docker push, push docker image | ||||
| # | ||||
|  | ||||
| # Get version from user | ||||
| read -p "Version [latest]: " VERSIONINPUT | ||||
| # If version was not provided, use the latest commit short hash as version | ||||
| if [ -z ${VERSIONINPUT} ]; then | ||||
|   APP_VERSION="latest" | ||||
| else | ||||
|   APP_VERSION=${VERSIONINPUT} | ||||
| fi | ||||
|  | ||||
| # Get docker push option from user | ||||
| read -p "Docker push? [n]: " DOCKERPUSH | ||||
| if [ -z ${DOCKERPUSH} ]; then | ||||
|   DOCKERPUSH=n | ||||
| fi | ||||
|  | ||||
| # Create version tag (if provided) | ||||
| if [ ! -z ${VERSIONINPUT} ]; then | ||||
|   git tag ${APP_VERSION} | ||||
| fi | ||||
|  | ||||
| # Build the app | ||||
| export APP_VERSION | ||||
| make docker | ||||
| # If wanted, push the docker image | ||||
| if [ ${DOCKERPUSH} = "y" ]; then | ||||
|   make dockerpush | ||||
| fi | ||||
		Reference in New Issue
	
	Block a user