build files using docker

This commit is contained in:
Willem@105.pve1.lan 2022-02-18 14:30:12 +02:00
parent 57862495fe
commit 9a4863c4f4
7 changed files with 278 additions and 13 deletions

11
.gitignore vendored
View File

@ -7,4 +7,13 @@
boringproxy_*.tar.gz
# Boringproxy database, created if exec is run in boringproxy folder
boringproxy_db.json
boringproxy_db.json
# Development files
dev.yml
# Docker client examples
# Ignore everything in config
docker/client/examples/home-assistant/config/*
# But not these files...
!docker/client/examples/home-assistant/config/configuration.yaml

View File

@ -1,19 +1,32 @@
FROM golang:1.17-alpine3.15 as builder
LABEL boringproxy=builder
ARG VERSION
ARG GOOS="linux"
ARG GOARCH="amd64"
ARG BRANCH="master"
ARG REPO="https://github.com/boringproxy/boringproxy.git"
ARG ORIGIN='local'
WORKDIR /build
RUN apk add git
RUN if [[ "ORIGIN" == 'remote' ]] ; then git clone --depth 1 --branch "${BRANCH}" ${REPO}; fi
COPY go.* ./
RUN go mod download
COPY . .
RUN export VERSION='2'
RUN cd cmd/boringproxy && CGO_ENABLED=0 go build -o boringproxy
RUN cd cmd/boringproxy && CGO_ENABLED=0 GOOS=${GOOS} GOARCH=${GOARCH} \
go build -ldflags "-X main.Version=${VERSION}" \
-o boringproxy
FROM scratch
FROM scratch
EXPOSE 80 443
COPY --from=builder /build/cmd/boringproxy/boringproxy /
ENTRYPOINT ["/boringproxy"]
CMD ["server"]
CMD ["version"]

BIN
default_logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 913 B

2
docker/.gitignore vendored
View File

@ -1,2 +0,0 @@
# Docker-compose file with local dev config
dev.yml

View File

@ -1,7 +0,0 @@
# Ignore everything in config
config/*
# But not these files...
!config/configuration.yaml
# Ignore everything in development config
dev-config/*

220
scripts/build_docker.sh Executable file
View File

@ -0,0 +1,220 @@
#!/bin/bash
# Run from root boringproxy folder and call with ./scripts/build_docker.sh
############################################################
# Help #
############################################################
Help()
{
# Display Help
echo "Script to buid BoringProxy executables using docker"
echo "Syntax: build_docker.sh [h|help|local|remote]"
echo
echo "h & help: Display help documetation"
echo
echo "local: Build executables from local repo (current folder)"
echo "options:"
echo " a|arch Architecture to build for build (amd64,arm,arm64)"
echo " os Operating System to build for (linux,freebsd,openbsd,windows,darwin)"
echo " o|output Output format (image,exec)"
echo "example: "
echo " build_docker.sh local -a=amd -s=linux -o=image"
echo
echo "local: Build executables remote repo (Github fork)"
echo "options:"
echo " a|arch Architecture to build for build (amd64,arm,arm64)"
echo " os Operating System to build for (linux,freebsd,openbsd,windows,darwin)"
echo " u|user Github user"
echo " b|branch Branch/Tree"
echo " o|output Output format (image,exec)"
echo "example: "
echo " generate_docker.sh remote -a=amd -s=linux -u=wgrobler -b=dev -o=exec"
echo
}
############################################################
############################################################
# Main program #
############################################################
############################################################
# Check if file was run from correct working directory, if correct script file will exists
FILE=./scripts/build_docker.sh
if [ ! -f "$FILE" ]; then
echo "Script needs to be run from root boringproxy folder, call with ./scripts/build_docker.sh"
exit;
fi
if [ -z "$1" ];
then
echo "No input variabled supplied"
echo "Here is the script help documentation:"
echo
Help
exit;
else
if [ "$1" == "help" ] || [ "$1" == "h" ];
then
Help
exit;
fi
if [ "$1" == "local" ];
then
CMD='local'
GOARCH='amd64';
GOOS='linux';
OUTPUT_FORMAT='image';
# Get the options
for i in "$@"; do
case $i in
-a=*|--arch=*)
GOARCH="${i#*=}";
shift;
;;
-os=*)
GOOS="${i#*=}";
shift;
;;
-o=*|--output=*)
OUTPUT_FORMAT="${i#*=}";
shift;
;;
-*|--*)
echo "Unknown option $i"
exit 1
;;
*)
;;
esac
done
fi
if [ "$1" == "remote" ];
then
CMD='remote'
GOARCH='amd64';
GOOS='linux';
BRANCH='master';
GITHUB_USER="boringproxy"
OUTPUT_FORMAT='image';
# Get the options
for i in "$@"; do
case $i in
-a=*|--arch=*)
GOARCH="${i#*=}";
shift;
;;
-os=*)
GOOS="${i#*=}";
shift;
;;
-b=*|--branch=*)
BRANCH="${i#*=}";
shift;
;;
-u=*|--user=*)
GITHUB_USER="${i#*=}";
shift;
;;
-o=*|--output=*)
OUTPUT_FORMAT="${i#*=}";
shift;
;;
-*|--*)
echo "Unknown option $i"
exit 1
;;
*)
;;
esac
done
fi
fi
# Get current timestamp and set at TAG
timestamp=$(date +%s)
# Make build folder if not already exists
mkdir -p ./build
# Check if logo.png exists, if not create
FILE=./logo.png
if [ -f "$FILE" ];
then
echo "$FILE exists. Using file in build";
else
echo "$FILE does not exist. Creating file";
cp ./default_logo.png ./logo.png;
fi
if [ "$CMD" == "local" ];
then
echo "Building from local git repo"
# Get current version from git tags
version=$(git describe --tags)
# Set docker image name
if [ "$OUTPUT_FORMAT" == "image" ];
then DockerImage="boringproxy-$GOOS-$GOARCH";
else DockerImage="boringproxy-$GOOS-$GOARCH:$timestamp";
fi
# Build docker image(s)
docker build -t $DockerImage . \
--build-arg VERSION=$(git describe --tags) \
--build-arg GOARCH=$GOARCH \
--build-arg GOOS=$GOOS;
fi
if [ "$CMD" == "remote" ];
then
echo "Building from remote git repo"
# Set docker image name
if [ "$OUTPUT_FORMAT" == "image" ];
then DockerImage="$GITHUB_USER.$BRANCH.boringproxy-$GOOS-$GOARCH";
else DockerImage="$GITHUB_USER.$BRANCH.boringproxy-$GOOS-$GOARCH:$timestamp";
fi
# Build docker image(s)
REPO="https://github.com/$GITHUB_USER/boringproxy.git"
docker build -t $DockerImage . \
--build-arg VERSION="$GITHUB_USER:$BRANCH" \
--build-arg GOARCH=$GOARCH \
--build-arg GOOS=$GOOS \
--build-arg BRANCH=$BRANCH \
--build-arg REPO=$REPO;
fi
# if DockerImage is set, continue
if [ -n "$DockerImage" ];
then
if [ "$OUTPUT_FORMAT" == "image" ];
then
# Prune intermediate images
docker image prune -f --filter label=boringproxy=builder
echo
echo "Docker file created with filename: $DockerImage"
echo "Use $DockerImage as image name when uploading"
else
# Prune intermediate images
docker image prune -f --filter label=boringproxy=builder
# Set filename for exec
if [ "$CMD" == "local" ];
then FILENAME="boringproxy-$GOOS-$GOARCH";
else FILENAME="$GITHUB_USER.$BRANCH.boringproxy-$GOOS-$GOARCH";
fi
# Copy exec from image
docker cp $(docker create $DockerImage):/boringproxy ./build/$FILENAME;
# Remove temp container
docker rm $(docker container ls -n 1 | awk '{ print $1 }' | grep -v CONTAINER)
# Remove image
docker rmi $DockerImage;
fi
fi

32
scripts/upload_docker_github.sh Executable file
View File

@ -0,0 +1,32 @@
#!/bin/bash
# This file is used to upload a build docker image to GitHub.
# Run build_docker.sh first to create new image
# Run from root boringproxy folder and call with ./scripts/upload_docker_image.sh github-username
# github-username must be lowercase
# https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry
if [ -z "$1" ];
then {
echo "Container name required";
exit;
}
fi
if [ -z "$2" ];
then echo "GitHub username required";
else {
if [ -z "$3" ];
then {
echo "No TAG set, using latest";
tag='latest';
}
else tag=$3;
fi
docker image tag $1 ghcr.io/$2/$1:$tag
CR_PAT=`cat ~/.auth_tokens/github`
echo $CR_PAT | docker login ghcr.io -u $2 --password-stdin
docker push ghcr.io/$2/$1:$tag
} fi