Initial commit.
All checks were successful
continuous-integration/drone Build is passing

This commit is contained in:
Stanislav Nikitin 2024-05-04 13:18:37 +05:00
commit 8b945c8f90
Signed by: pztrn
GPG Key ID: 1E944A0F0568B550
16 changed files with 273 additions and 0 deletions

37
.drone.yml Normal file
View File

@ -0,0 +1,37 @@
---
kind: pipeline
type: docker
name: "lint"
steps:
- name: lint
image: koalaman/shellcheck-alpine:v0.8.0
pull: if-not-exists
commands:
- /bin/shellcheck build.sh
---
kind: pipeline
type: docker
name: "build toolbox"
trigger:
event: ["tag"]
depends_on:
- "lint"
steps:
- name: "build toolbox"
image: "code.pztrn.name/containers/mirror/docker:26.1.1-dind"
pull: if-not-exists
privileged: true
environment:
REGISTRY: code.pztrn.name
REGISTRY_PROJECT: /containers/go-toolbox
REGISTRY_USERNAME: drone
REGISTRY_PASSWORD:
from_secret: drone_secret
commands:
- apk add --no-cache bash
- ./build.sh

3
.gitignore vendored Executable file
View File

@ -0,0 +1,3 @@
.idea
.vscode
*DS_Store*

3
.markdownlint.json Executable file
View File

@ -0,0 +1,3 @@
{
"line-length": false
}

8
.yamllint Executable file
View File

@ -0,0 +1,8 @@
---
extends: default
rules:
line-length: disable
braces:
min-spaces-inside: 1
max-spaces-inside: 1

19
Dockerfile Executable file
View File

@ -0,0 +1,19 @@
FROM debian:12.5-slim
COPY . /src
RUN for file in $(find /src -type f -name "*.sh"); do chmod +x $file; done
RUN /src/scripts/workers/debian.sh
RUN /src/scripts/workers/golang.sh
RUN /src/scripts/workers/dlv.sh
RUN /src/scripts/workers/golangci-lint.sh
RUN /src/scripts/workers/gofumpt.sh
RUN /src/scripts/workers/mockery.sh
RUN /src/scripts/workers/taskfile.sh
RUN /src/scripts/workers/go-junit-report.sh
RUN mkdir /home/container && chmod 0777 /home/container
ENV HOME=/home/container
ENV GOPATH=/home/container/go
ENV GOCACHE=/home/container/.cache

39
README.md Executable file
View File

@ -0,0 +1,39 @@
# Go ToolBox
Docker image with everything you might need for developing apps in Go.
**Note that for newer mac hardware you have to use Docker Desktop or amd64 virtual machine in lima/other tools!**
## What's inside
Debian 12 (slim) is used as base image.
| Binary | Version | Project | Repo |
| ----------------- | ------- | --------------- | ------------------------------------------------------------- |
| `go` | 1.22.2 | Go | |
| `golangci-lint` | 1.57.2 | golangci-lint | [External link](https://github.com/golangci/golangci-lint) |
| `gofumpt` | 0.6.0 | gofumpt | [External link](https://github.com/mvdan/gofumpt) |
| `mockery_v2` | 2.42.2 | mockery | [External link](https://github.com/vektra/mockery) |
| `task` | 3.36.0 | taskfile | [External link](https://github.com/go-task/task) |
| `go-junit-report` | 2.1.0 | go-junit-report | [External link](https://github.com/jstemmer/go-junit-report) |
| `delve` | 1.22.1 | delve | [External link](https://github.com/go-delve/delve) |
## HOME
Home directory is `/home/container`.
## Caching
Go's build cache resides in `/home/container/.cache`, `GOCACHE` environment variable is defined. You can mount it when needed in Dockerfile as:
```Dockerfile
RUN --mount=type=cache,target="$GOCACHE" go build
```
## Utilities examples
### JUnit report generation (for Gitlab)
```shell
go test -v 2>&1 ./... | go-junit-report -set-exit-code > unit-report.xml
```

37
build.sh Executable file
View File

@ -0,0 +1,37 @@
#!/bin/bash
# build.sh checks if docker image with same sha256 exists remotely.
# if exists, do nothing, if not, build the image
commit_sha="${DRONE_COMMIT_SHA}"
image_path="${REGISTRY}${REGISTRY_PROJECT}"
if [ "${DRONE_TAG}" != "" ]; then
tag="${DRONE_TAG}"
else
tag="${DRONE_COMMIT_SHA}"
fi
# Starting Docker daemon.
/usr/local/bin/dockerd --data-root=/var/lib/docker --max-concurrent-uploads 1 &
# Wait for it.
echo "* Waiting for Docker daemon to start..."
while true; do
if docker ps &>/dev/null; then
break
fi
done
echo "* Logging in to registry..."
docker login -u "${REGISTRY_USERNAME}" -p "${REGISTRY_PASSWORD}" "${REGISTRY}"
echo "* Building docker image ${image_path}:${tag}..."
if docker manifest inspect "${image_path}:${tag}" >/dev/null; then
echo "* Docker image ${image_path}:${tag} is already exists on remote, no rebuilt necessary."
exit 0
fi
docker build --pull --build-arg VCS_REF="${commit_sha}" --build-arg VCS_URL="${image_path}" --tag "${image_path}:${tag}" .
docker push "${image_path}:${tag}"

17
scripts/helpers/arch.sh Executable file
View File

@ -0,0 +1,17 @@
#!/bin/bash
# shellcheck disable=SC2034
# Line above disables shellcheck linters:
# * SC2043 - unused variable (this file sourced elsewhere).
base_arch=$(uname -m)
arch=""
if [ "$base_arch" = "x86_64" ]; then
arch=amd64
elif [ "$base_arch" = "aarch64" ]; then
arch=arm64
else
echo "unknown arch"
exit 1
fi

4
scripts/workers/debian.sh Executable file
View File

@ -0,0 +1,4 @@
#!/bin/bash
apt update && apt upgrade -y
apt install -y build-essential curl file git make

7
scripts/workers/dlv.sh Executable file
View File

@ -0,0 +1,7 @@
#!/bin/bash
dlv_version=1.22.1
set -xe
CGO_ENABLED=0 GOBIN=/usr/local/bin/ go install -ldflags "-s -w -extldflags '-static'" github.com/go-delve/delve/cmd/dlv@v"$dlv_version"

View File

@ -0,0 +1,10 @@
#!/bin/bash
go_junit_report_version=2.1.0
cd /tmp
git clone https://github.com/jstemmer/go-junit-report.git
cd go-junit-report || exit 1
git checkout "v${go_junit_report_version}"
go build -o /usr/local/bin/go-junit-report .
rm -rf /tmp/go-junit-report

12
scripts/workers/gofumpt.sh Executable file
View File

@ -0,0 +1,12 @@
#!/bin/bash
gofumpt_version="0.6.0"
set -xe
cd /tmp
git clone https://github.com/mvdan/gofumpt.git
cd gofumpt || exit 1
git checkout "v${gofumpt_version}"
go build -o /usr/local/bin/gofumpt .
rm -rf /tmp/gofumpt

22
scripts/workers/golang.sh Executable file
View File

@ -0,0 +1,22 @@
#!/bin/bash
# shellcheck disable=SC2154
# Line above disables shellcheck linters:
# * SC2154 - variable referenced but not assigned (false positive, assigned when sourced arch.sh).
set -xe
go_version=1.22.2
# shellcheck disable=SC2086,SC2046,SC2164
cd $(dirname ${BASH_SOURCE[0]})
script_path=$(pwd)
# shellcheck disable=SC1091
source "${script_path}/../helpers/arch.sh"
curl "https://dl.google.com/go/go${go_version}.linux-${arch}.tar.gz" -o "/tmp/go-${arch}.tar.gz"
file "/tmp/go-${arch}.tar.gz"
tar -xf "/tmp/go-${arch}.tar.gz" -C /usr/local/
rm "/tmp/go-${arch}.tar.gz"
ln -s /usr/local/go/bin/* /usr/local/bin

View File

@ -0,0 +1,20 @@
#!/bin/bash
# shellcheck disable=SC2154
# Line above disables shellcheck linters:
# * SC2154 - variable referenced but not assigned (false positive, assigned when sourced arch.sh).
golangci_lint_version=1.57.2
# shellcheck disable=SC2086,SC2046,SC2164
cd "$(dirname ${BASH_SOURCE[0]})"
script_path=$(pwd)
# shellcheck disable=SC1091
source "${script_path}/../helpers/arch.sh"
curl -L "https://github.com/golangci/golangci-lint/releases/download/v${golangci_lint_version}/golangci-lint-${golangci_lint_version}-linux-${arch}.tar.gz" -o "/tmp/golangci-lint-${arch}.tar.gz"
file "/tmp/golangci-lint-${arch}.tar.gz"
tar -xf "/tmp/golangci-lint-${arch}.tar.gz" -C /tmp
mv "/tmp/golangci-lint-${golangci_lint_version}-linux-${arch}/golangci-lint" /usr/local/bin
rm -rf "/tmp/golangci-lint-${arch}.tar.gz" "/tmp/golangci-lint-${golangci_lint_version}-linux-${arch}/"

14
scripts/workers/mockery.sh Executable file
View File

@ -0,0 +1,14 @@
#!/bin/bash
mockery_v2_version=2.42.2
cd /tmp || exit 1
# mockery v2 we download from releases page
arch=$(uname -m)
download_url="https://github.com/vektra/mockery/releases/download/v${mockery_v2_version}/mockery_${mockery_v2_version}_Linux_${arch}.tar.gz"
curl -L ${download_url} -o "/tmp/mockery_${arch}.tar.gz"
mkdir /tmp/mockery_v2
tar xf "/tmp/mockery_${arch}.tar.gz" -C /tmp/mockery_v2
mv /tmp/mockery_v2/mockery /usr/local/bin/mockery_v2
rm -rf "/tmp/mockery_$(uname -m).tar.gz" /tmp/mockery*

21
scripts/workers/taskfile.sh Executable file
View File

@ -0,0 +1,21 @@
#!/bin/bash
# shellcheck disable=SC2154
# Line above disables shellcheck linters:
# * SC2154 - variable referenced but not assigned (false positive, assigned when sourced arch.sh).
taskfile_version=3.36.0
# shellcheck disable=SC2086,SC2046,SC2164
cd "$(dirname ${BASH_SOURCE[0]})"
script_path=$(pwd)
# shellcheck disable=SC1091
source "${script_path}/../helpers/arch.sh"
curl -L "https://github.com/go-task/task/releases/download/v${taskfile_version}/task_linux_${arch}.tar.gz" -o "/tmp/taskfile-${arch}.tar.gz"
file "/tmp/taskfile-${arch}.tar.gz"
tar -xf "/tmp/taskfile-${arch}.tar.gz" -C /tmp
mv "/tmp/task" /usr/local/bin
rm -rf "/tmp/*"
ls -la /usr/local/bin