Refactor CI and dev workflow with buildx bake (#247)

* Upload artifacts
* Add image-local target
* Single job for artifacts and image
* Add armv5 artifact

Co-authored-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
CrazyMax
2020-12-26 11:30:46 +01:00
committed by GitHub
parent 3543bbf454
commit 3bbe883358
23 changed files with 471 additions and 260 deletions

View File

@@ -2,15 +2,7 @@
/*.iml /*.iml
.dev .dev
/.git
/.github
/.res
/bin /bin
/dist /dist
/docs /site
/.editorconfig /coverage.txt
/.gitignore
/.goreleaser.yml
/CHANGELOG.md
/LICENSE
/README.md

View File

@@ -2,18 +2,20 @@
Hi there! I'm thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. Hi there! I'm thrilled that you'd like to contribute to this project. Your help is essential for keeping it great.
Contributions to this project are [released](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license) to the public under the [project's open source license](../LICENSE). Contributions to this project are [released](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license)
to the public under the [project's open source license](../LICENSE).
## Submitting a pull request ## Submitting a pull request
1. [Fork](https://github.com/crazy-max/diun/fork) and clone the repository 1. [Fork](https://github.com/crazy-max/diun/fork) and clone the repository
2. Configure and install the dependencies: `go mod download` 2. Configure and install the dependencies: `go mod download`
3. Create a new branch: `git checkout -b my-branch-name` 3. Create a new branch: `git checkout -b my-branch-name`
4. Make your change 4. Make your changes
5. Test your code: `go test -covermode=atomic ./...` 5. Validate: `docker buildx bake validate`
6. Build with [GoReleaser](https://goreleaser.com/): `goreleaser release --skip-publish --skip-validate --rm-dist` 6. Test your code: `docker buildx bake test`
7. Push to your fork and [submit a pull request](https://github.com/crazy-max/diun/compare) 7. Build the project: `docker buildx bake artifact-all image-all`
8. Pat your self on the back and wait for your pull request to be reviewed and merged. 8. Push to your fork and [submit a pull request](https://github.com/crazy-max/diun/compare)
9. Pat your self on the back and wait for your pull request to be reviewed and merged.
Here are a few things you can do that will increase the likelihood of your pull request being accepted: Here are a few things you can do that will increase the likelihood of your pull request being accepted:

View File

@@ -20,62 +20,45 @@ on:
- 'docs/**' - 'docs/**'
- 'mkdocs.yml' - 'mkdocs.yml'
jobs:
go:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Prepare
id: prep
run: |
if [[ $GITHUB_REF == refs/tags/* ]]; then
echo ::set-output name=tag_name::${GITHUB_REF#refs/tags/}
fi
-
name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.15
-
name: Cache Go modules
uses: actions/cache@v2
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
-
name: GoReleaser
uses: goreleaser/goreleaser-action@v2
with:
version: latest
args: release --skip-publish --rm-dist
-
name: GitHub Release
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
with:
draft: true
files: |
dist/checksums.txt
dist/*.tar.gz
dist/*.zip
name: ${{ steps.prep.outputs.tag_name }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
docker:
runs-on: ubuntu-latest
env: env:
DOCKERHUB_SLUG: crazymax/diun DOCKERHUB_SLUG: crazymax/diun
GHCR_SLUG: ghcr.io/crazy-max/diun GHCR_SLUG: ghcr.io/crazy-max/diun
jobs:
test:
runs-on: ubuntu-latest
steps: steps:
- -
name: Checkout name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
with:
fetch-depth: 0
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
with:
version: latest
buildkitd-flags: --debug
-
name: Test
uses: crazy-max/ghaction-docker-buildx-bake@v1
with:
targets: test
-
name: Upload coverage
uses: codecov/codecov-action@v1
with:
file: ./coverage.txt
build:
runs-on: ubuntu-latest
needs: [ test ]
steps:
-
name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- -
name: Docker meta name: Docker meta
id: docker_meta id: docker_meta
@@ -84,9 +67,13 @@ jobs:
images: | images: |
${{ env.DOCKERHUB_SLUG }} ${{ env.DOCKERHUB_SLUG }}
${{ env.GHCR_SLUG }} ${{ env.GHCR_SLUG }}
tag-semver: |
{{version}}
tag-edge: true tag-edge: true
tag-match: ^v(\d{1,3}.\d{1,3}.\d{1,3})$ label-custom: |
tag-match-group: 1 org.opencontainers.image.title=Diun
org.opencontainers.image.description=Docker image update notifier
org.opencontainers.image.vendor=CrazyMax
- -
name: Set up QEMU name: Set up QEMU
uses: docker/setup-qemu-action@v1 uses: docker/setup-qemu-action@v1
@@ -94,7 +81,8 @@ jobs:
name: Set up Docker Buildx name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1 uses: docker/setup-buildx-action@v1
with: with:
buildkitd-flags: "--debug" version: latest
buildkitd-flags: --debug
- -
name: Login to DockerHub name: Login to DockerHub
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request'
@@ -111,21 +99,41 @@ jobs:
username: ${{ secrets.GHCR_USERNAME }} username: ${{ secrets.GHCR_USERNAME }}
password: ${{ secrets.GHCR_TOKEN }} password: ${{ secrets.GHCR_TOKEN }}
- -
name: Build name: Build artifacts
uses: docker/build-push-action@v2 uses: crazy-max/ghaction-docker-buildx-bake@v1
with: with:
context: . targets: artifact-all
file: ./Dockerfile -
platforms: linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/386,linux/ppc64le name: Move artifacts
run: |
mv ./dist/**/* ./dist/
-
name: Upload artifacts
uses: actions/upload-artifact@v2
with:
name: diun
path: ./dist/*
if-no-files-found: error
-
name: Build image
uses: crazy-max/ghaction-docker-buildx-bake@v1
with:
files: |
./docker-bake.hcl
${{ steps.docker_meta.outputs.bake-file }}
targets: image-all
push: ${{ github.event_name != 'pull_request' }} push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.docker_meta.outputs.tags }} -
build-args: | name: GitHub Release
VERSION=${{ steps.docker_meta.outputs.version }} uses: softprops/action-gh-release@v1
labels: | if: startsWith(github.ref, 'refs/tags/')
${{ steps.docker_meta.outputs.labels }} with:
org.opencontainers.image.title=Diun draft: true
org.opencontainers.image.description=Docker image update notifier files: |
org.opencontainers.image.vendor=CrazyMax dist/*.tar.gz
dist/*.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- -
name: Check manifest name: Check manifest
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request'

View File

@@ -30,27 +30,15 @@ jobs:
with: with:
fetch-depth: 0 fetch-depth: 0
- -
name: Prepare name: Set up Docker Buildx
id: prep uses: docker/setup-buildx-action@v1
run: | with:
VERSION=edge version: latest
RELEASE=false
if [[ $GITHUB_REF == refs/tags/* ]]; then
VERSION=${GITHUB_REF#refs/tags/v}
fi
if [[ $VERSION =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
RELEASE=true
fi
echo ::set-output name=release::${RELEASE}
-
name: Build mkdocs Docker image
run: |
docker build -t mkdocs -f ./docs/Dockerfile ./
- -
name: Build docs name: Build docs
run: | uses: crazy-max/ghaction-docker-buildx-bake@v1
docker run --rm -v "$(pwd):/docs" mkdocs build --strict with:
sudo chown -R $(id -u):$(id -g) ./site targets: docs
- -
name: Check GitHub Pages status name: Check GitHub Pages status
uses: crazy-max/ghaction-github-status@v2 uses: crazy-max/ghaction-github-status@v2
@@ -58,7 +46,7 @@ jobs:
pages_threshold: major_outage pages_threshold: major_outage
- -
name: Deploy name: Deploy
if: github.event_name != 'pull_request' && (endsWith(github.ref, github.event.repository.default_branch) || steps.prep.outputs.release == 'true') if: github.event_name != 'pull_request'
uses: crazy-max/ghaction-github-pages@v2 uses: crazy-max/ghaction-github-pages@v2
with: with:
target_branch: gh-pages target_branch: gh-pages

View File

@@ -1,44 +0,0 @@
name: gosum
on:
push:
branches:
- 'master'
paths:
- '.github/workflows/gosum.yml'
- 'go.mod'
- 'go.sum'
jobs:
fix:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.15
-
name: Tidy
run: |
rm -f go.sum
go mod tidy
-
name: Set up Git
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
git config user.name GitHub
git config user.email noreply@github.com
git remote set-url origin https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git
-
name: Commit and push changes
run: |
git add .
if output=$(git status --porcelain) && [ ! -z "$output" ]; then
git commit --author "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>" --message "Fix go modules"
git push
fi

View File

@@ -1,57 +0,0 @@
name: test
on:
push:
branches:
- 'master'
tags:
- 'v*'
paths-ignore:
- '**.md'
- '.github/workflows/docs.yml'
- 'docs/**'
- 'mkdocs.yml'
pull_request:
branches:
- 'master'
paths-ignore:
- '**.md'
- '.github/workflows/docs.yml'
- 'docs/**'
- 'mkdocs.yml'
jobs:
test:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.15
-
name: Cache Go modules
uses: actions/cache@v2
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
-
name: Go mod
run: |
go mod download
-
name: Test
run: |
go test -coverprofile=coverage.txt -covermode=atomic -race ./...
-
name: Upload coverage
uses: codecov/codecov-action@v1
if: success()
with:
token: ${{ secrets.CODECOV_TOKEN }}
file: ./coverage.txt

30
.github/workflows/validate.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
name: validate
on:
push:
branches:
- 'master'
tags:
- 'v*'
- 'dockerfile/*'
pull_request:
branches:
- 'master'
jobs:
validate:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
with:
version: latest
-
name: Validate
uses: crazy-max/ghaction-docker-buildx-bake@v1
with:
targets: validate

2
.gitignore vendored
View File

@@ -4,3 +4,5 @@
.dev .dev
/bin /bin
/dist /dist
/site
/coverage.txt

View File

@@ -1,45 +0,0 @@
env:
- GO111MODULE=on
- GOPROXY=https://goproxy.io,direct
before:
hooks:
- go mod download
builds:
-
main: ./cmd/main.go
ldflags:
- -s -w -X main.version={{.Version}}
env:
- CGO_ENABLED=0
goos:
- darwin
- linux
- windows
goarch:
- 386
- amd64
- arm
- arm64
- ppc64le
- s390x
goarm:
- 6
- 7
archives:
-
replacements:
386: i386
amd64: x86_64
format_overrides:
- goos: windows
format: zip
files:
- LICENSE
- README.md
- CHANGELOG.md
checksum:
name_template: 'checksums.txt'

View File

@@ -1,27 +1,35 @@
# syntax=docker/dockerfile:1.2
ARG GO_VERSION=1.15 ARG GO_VERSION=1.15
ARG VERSION=dev ARG GORELEASER_VERSION=0.149.0
FROM --platform=${BUILDPLATFORM:-linux/amd64} tonistiigi/xx:golang AS xgo FROM --platform=$BUILDPLATFORM golang:${GO_VERSION}-alpine AS base
ARG GORELEASER_VERSION
FROM --platform=${BUILDPLATFORM:-linux/amd64} golang:${GO_VERSION}-alpine AS base RUN apk add --no-cache ca-certificates curl gcc file git musl-dev tar
RUN apk add --no-cache curl gcc git musl-dev RUN wget -qO- https://github.com/goreleaser/goreleaser/releases/download/v${GORELEASER_VERSION}/goreleaser_Linux_x86_64.tar.gz | tar -zxvf - goreleaser \
COPY --from=xgo / / && mv goreleaser /usr/local/bin/goreleaser
WORKDIR /src WORKDIR /src
FROM base AS gomod FROM base AS gomod
COPY . . RUN --mount=type=bind,target=.,rw \
RUN go mod download --mount=type=cache,target=/go/pkg/mod \
go mod tidy && go mod download
FROM gomod AS build FROM gomod AS build
ARG TARGETPLATFORM ARG TARGETPLATFORM
ARG TARGETOS ARG TARGETOS
ARG TARGETARCH ARG TARGETARCH
ARG VERSION ARG TARGETVARIANT
ENV CGO_ENABLED 0 ARG GIT_REF
ENV GOPROXY https://goproxy.io,direct RUN --mount=type=bind,target=/src,rw \
RUN go build -ldflags "-w -s -X 'main.version=${VERSION}'" -v -o /opt/diun cmd/main.go --mount=type=cache,target=/root/.cache/go-build \
--mount=target=/go/pkg/mod,type=cache \
./hack/goreleaser.sh
FROM --platform=${TARGETPLATFORM:-linux/amd64} alpine:latest FROM scratch AS artifacts
COPY --from=build /out/*.tar.gz /
COPY --from=build /out/*.zip /
FROM --platform=$TARGETPLATFORM alpine
LABEL maintainer="CrazyMax" LABEL maintainer="CrazyMax"
RUN apk --update --no-cache add \ RUN apk --update --no-cache add \
@@ -29,7 +37,7 @@ RUN apk --update --no-cache add \
libressl \ libressl \
&& rm -rf /tmp/* /var/cache/apk/* && rm -rf /tmp/* /var/cache/apk/*
COPY --from=build /opt/diun /usr/local/bin/diun COPY --from=build /usr/local/bin/diun /usr/local/bin/diun
RUN diun --version RUN diun --version
ENV DIUN_DB_PATH="/data/diun.db" ENV DIUN_DB_PATH="/data/diun.db"

View File

@@ -47,7 +47,7 @@ func main() {
kong.Description(fmt.Sprintf("%s. More info: %s", meta.Desc, meta.URL)), kong.Description(fmt.Sprintf("%s. More info: %s", meta.Desc, meta.URL)),
kong.UsageOnError(), kong.UsageOnError(),
kong.Vars{ kong.Vars{
"version": fmt.Sprintf("%s", version), "version": version,
}, },
kong.ConfigureHelp(kong.HelpOptions{ kong.ConfigureHelp(kong.HelpOptions{
Compact: true, Compact: true,

88
docker-bake.hcl Normal file
View File

@@ -0,0 +1,88 @@
// Go version
variable "GO_VERSION" {
default = "1.15"
}
// GitHub reference as defined in GitHub Actions (eg. refs/head/master))
variable "GITHUB_REF" {
default = ""
}
target "go-version" {
args = {
GO_VERSION = GO_VERSION
}
}
// Special target: https://github.com/crazy-max/ghaction-docker-meta#bake-definition
target "ghaction-docker-meta" {
tags = ["crazymax/diun:local"]
}
group "default" {
targets = ["image-local"]
}
group "validate" {
targets = ["lint", "vendor-validate"]
}
target "lint" {
inherits = ["go-version"]
dockerfile = "./hack/lint.Dockerfile"
target = "lint"
}
target "vendor-validate" {
inherits = ["go-version"]
dockerfile = "./hack/vendor.Dockerfile"
target = "validate"
}
target "vendor-update" {
inherits = ["go-version"]
dockerfile = "./hack/vendor.Dockerfile"
target = "update"
output = ["."]
}
target "test" {
inherits = ["go-version"]
dockerfile = "./hack/test.Dockerfile"
target = "test-coverage"
output = ["."]
}
target "docs" {
dockerfile = "./hack/docs.Dockerfile"
target = "release"
output = ["./site"]
}
target "artifact" {
args = {
GIT_REF = GITHUB_REF
}
inherits = ["go-version"]
target = "artifacts"
output = ["./dist"]
}
target "artifact-all" {
inherits = ["artifact"]
platforms = ["linux/amd64", "linux/arm/v5", "linux/arm/v6", "linux/arm/v7", "linux/arm64", "linux/386", "linux/ppc64le", "linux/s390x", "windows/amd64", "windows/386", "darwin/amd64"]
}
target "image" {
inherits = ["go-version", "ghaction-docker-meta"]
}
target "image-local" {
inherits = ["image"]
output = ["type=docker"]
}
target "image-all" {
inherits = ["image"]
platforms = ["linux/amd64", "linux/arm/v6", "linux/arm/v7", "linux/arm64", "linux/386", "linux/ppc64le"]
}

View File

@@ -8,6 +8,7 @@ Choose the archive matching the destination platform:
* [diun_{{ git.tag | trim('v') }}_darwin_x86_64.tar.gz]({{ config.repo_url }}/releases/download/v{{ git.tag | trim('v') }}/diun_{{ git.tag | trim('v') }}_darwin_x86_64.tar.gz) * [diun_{{ git.tag | trim('v') }}_darwin_x86_64.tar.gz]({{ config.repo_url }}/releases/download/v{{ git.tag | trim('v') }}/diun_{{ git.tag | trim('v') }}_darwin_x86_64.tar.gz)
* [diun_{{ git.tag | trim('v') }}_linux_arm64.tar.gz]({{ config.repo_url }}/releases/download/v{{ git.tag | trim('v') }}/diun_{{ git.tag | trim('v') }}_linux_arm64.tar.gz) * [diun_{{ git.tag | trim('v') }}_linux_arm64.tar.gz]({{ config.repo_url }}/releases/download/v{{ git.tag | trim('v') }}/diun_{{ git.tag | trim('v') }}_linux_arm64.tar.gz)
* [diun_{{ git.tag | trim('v') }}_linux_armv5.tar.gz]({{ config.repo_url }}/releases/download/v{{ git.tag | trim('v') }}/diun_{{ git.tag | trim('v') }}_linux_armv5.tar.gz)
* [diun_{{ git.tag | trim('v') }}_linux_armv6.tar.gz]({{ config.repo_url }}/releases/download/v{{ git.tag | trim('v') }}/diun_{{ git.tag | trim('v') }}_linux_armv6.tar.gz) * [diun_{{ git.tag | trim('v') }}_linux_armv6.tar.gz]({{ config.repo_url }}/releases/download/v{{ git.tag | trim('v') }}/diun_{{ git.tag | trim('v') }}_linux_armv6.tar.gz)
* [diun_{{ git.tag | trim('v') }}_linux_armv7.tar.gz]({{ config.repo_url }}/releases/download/v{{ git.tag | trim('v') }}/diun_{{ git.tag | trim('v') }}_linux_armv7.tar.gz) * [diun_{{ git.tag | trim('v') }}_linux_armv7.tar.gz]({{ config.repo_url }}/releases/download/v{{ git.tag | trim('v') }}/diun_{{ git.tag | trim('v') }}_linux_armv7.tar.gz)
* [diun_{{ git.tag | trim('v') }}_linux_i386.tar.gz]({{ config.repo_url }}/releases/download/v{{ git.tag | trim('v') }}/diun_{{ git.tag | trim('v') }}_linux_i386.tar.gz) * [diun_{{ git.tag | trim('v') }}_linux_i386.tar.gz]({{ config.repo_url }}/releases/download/v{{ git.tag | trim('v') }}/diun_{{ git.tag | trim('v') }}_linux_i386.tar.gz)

View File

@@ -1,7 +1,7 @@
FROM squidfunk/mkdocs-material:6.1.7 # syntax=docker/dockerfile:1.2
RUN \ FROM squidfunk/mkdocs-material:6.1.7 AS base
apk add --no-cache \ RUN apk add --no-cache \
git \ git \
git-fast-import \ git-fast-import \
openssh \ openssh \
@@ -14,3 +14,10 @@ RUN \
'mkdocs-macros-plugin' \ 'mkdocs-macros-plugin' \
&& apk del .build gcc musl-dev \ && apk del .build gcc musl-dev \
&& rm -rf /tmp/* && rm -rf /tmp/*
FROM base AS generate
RUN --mount=type=bind,target=. \
mkdocs build --strict --site-dir /tmp/site
FROM scratch AS release
COPY --from=generate /tmp/site/ /

164
hack/goreleaser.sh Executable file
View File

@@ -0,0 +1,164 @@
#!/usr/bin/env sh
: ${TARGETPLATFORM=}
: ${TARGETOS=}
: ${TARGETARCH=}
: ${TARGETVARIANT=}
: ${CGO_ENABLED=}
: ${GOARCH=}
: ${GOOS=}
: ${GOARM=}
: ${GOBIN=}
: ${GIT_REF=}
set -eu
if [ ! -z "$TARGETPLATFORM" ]; then
os="$(echo $TARGETPLATFORM | cut -d"/" -f1)"
arch="$(echo $TARGETPLATFORM | cut -d"/" -f2)"
if [ ! -z "$os" ] && [ ! -z "$arch" ]; then
export GOOS="$os"
export GOARCH="$arch"
if [ "$arch" = "arm" ]; then
case "$(echo $TARGETPLATFORM | cut -d"/" -f3)" in
"v5")
export GOARM="5"
;;
"v6")
export GOARM="6"
;;
*)
export GOARM="7"
;;
esac
fi
fi
fi
if [ ! -z "$TARGETOS" ]; then
export GOOS="$TARGETOS"
fi
if [ ! -z "$TARGETARCH" ]; then
export GOARCH="$TARGETARCH"
fi
if [ "$TARGETARCH" = "arm" ]; then
if [ ! -z "$TARGETVARIANT" ]; then
case "$TARGETVARIANT" in
"v5")
export GOARM="5"
;;
"v6")
export GOARM="6"
;;
*)
export GOARM="7"
;;
esac
else
export GOARM="7"
fi
fi
if [ "$CGO_ENABLED" = "1" ]; then
case "$GOARCH" in
"amd64")
export CC="x86_64-linux-gnu-gcc"
;;
"ppc64le")
export CC="powerpc64le-linux-gnu-gcc"
;;
"s390x")
export CC="s390x-linux-gnu-gcc"
;;
"arm64")
export CC="aarch64-linux-gnu-gcc"
;;
"arm")
case "$GOARM" in
"5")
export CC="arm-linux-gnueabi-gcc"
;;
*)
export CC="arm-linux-gnueabihf-gcc"
;;
esac
;;
esac
fi
if [ "$GOOS" = "wasi" ]; then
export GOOS="js"
fi
if [ -z "$GOBIN" ] && [ -n "$GOPATH" ] && [ -n "$GOARCH" ] && [ -n "$GOOS" ]; then
export PATH=${GOPATH}/bin/${GOOS}_${GOARCH}:${PATH}
fi
cat > ./.goreleaser.yml <<EOL
dist: /out
builds:
-
main: ./cmd/main.go
ldflags:
- -s -w -X "main.version={{ .Version }}"
env:
- CGO_ENABLED=0
goos:
- ${GOOS}
goarch:
- ${GOARCH}
goarm:
- ${GOARM}
hooks:
post:
- cp "{{ .Path }}" /usr/local/bin/diun
archives:
-
replacements:
386: i386
amd64: x86_64
format_overrides:
- goos: windows
format: zip
files:
- CHANGELOG.md
- LICENSE
- README.md
release:
disable: true
EOL
gitTag=""
case "$GIT_REF" in
refs/tags/v*)
gitTag="${GIT_REF#refs/tags/v}"
export GORELEASER_CURRENT_TAG=$gitTag
;;
*)
if gitTag=$(git tag --points-at HEAD --sort -version:creatordate | head -n 1); then
if [ -z "$gitTag" ]; then
gitTag=$(git describe --tags --abbrev=0)
fi
fi
;;
esac
echo "git tag found: ${gitTag}"
gitDirty="true"
if git describe --exact-match --tags --match "$gitTag" >/dev/null 2>&1; then
gitDirty="false"
fi
echo "git dirty: ${gitDirty}"
flags=""
if [ "$gitDirty" = "true" ]; then
flags="--snapshot"
fi
set -x
/usr/local/bin/goreleaser release $flags

15
hack/lint.Dockerfile Normal file
View File

@@ -0,0 +1,15 @@
# syntax=docker/dockerfile:1.2
ARG GO_VERSION=1.15
FROM golang:${GO_VERSION}-alpine AS base
RUN apk add --no-cache gcc musl-dev
WORKDIR /src
FROM golangci/golangci-lint:v1.27-alpine AS golangci-lint
FROM base AS lint
RUN --mount=type=bind,target=. \
--mount=type=cache,target=/root/.cache/go-build \
--mount=type=cache,target=/root/.cache/golangci-lint \
--mount=from=golangci-lint,source=/usr/bin/golangci-lint,target=/usr/bin/golangci-lint \
golangci-lint run --timeout 10m0s ./...

20
hack/test.Dockerfile Normal file
View File

@@ -0,0 +1,20 @@
# syntax=docker/dockerfile:1.2
ARG GO_VERSION=1.15
FROM golang:${GO_VERSION}-alpine AS base
RUN apk add --no-cache gcc musl-dev
WORKDIR /src
FROM base AS gomod
RUN --mount=type=bind,target=.,rw \
--mount=type=cache,target=/go/pkg/mod \
go mod tidy && go mod download
FROM gomod AS test
RUN --mount=type=bind,target=. \
--mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
go test -v -coverprofile=/tmp/coverage.txt -covermode=atomic -race ./...
FROM scratch AS test-coverage
COPY --from=test /tmp/coverage.txt /coverage.txt

24
hack/vendor.Dockerfile Normal file
View File

@@ -0,0 +1,24 @@
# syntax=docker/dockerfile:1.2
ARG GO_VERSION=1.15
FROM golang:${GO_VERSION}-alpine AS base
RUN apk add --no-cache git
WORKDIR /src
FROM base AS vendored
RUN --mount=type=bind,target=.,rw \
--mount=type=cache,target=/go/pkg/mod \
go mod tidy && go mod download && \
mkdir /out && cp go.mod go.sum /out
FROM scratch AS update
COPY --from=vendored /out /
FROM vendored AS validate
RUN --mount=type=bind,target=.,rw \
git add -A && cp -rf /out/* .; \
if [ -n "$(git status --porcelain -- go.mod go.sum)" ]; then \
echo >&2 'ERROR: Vendor result differs. Please vendor your package with "docker buildx bake update-vendor"'; \
git status --porcelain -- go.mod go.sum; \
exit 1; \
fi

View File

@@ -101,7 +101,7 @@ func (di *Diun) Start() error {
// Start scheduler // Start scheduler
di.cron.Start() di.cron.Start()
log.Info().Msgf("Next run in %s (%s)", log.Info().Msgf("Next run in %s (%s)",
durafmt.ParseShort(di.cron.Entry(di.jobID).Next.Sub(time.Now())).String(), durafmt.ParseShort(time.Until(di.cron.Entry(di.jobID).Next)).String(),
di.cron.Entry(di.jobID).Next) di.cron.Entry(di.jobID).Next)
select {} select {}
@@ -116,7 +116,7 @@ func (di *Diun) Run() {
defer atomic.StoreUint32(&di.locker, 0) defer atomic.StoreUint32(&di.locker, 0)
if di.jobID > 0 { if di.jobID > 0 {
defer log.Info().Msgf("Next run in %s (%s)", defer log.Info().Msgf("Next run in %s (%s)",
durafmt.ParseShort(di.cron.Entry(di.jobID).Next.Sub(time.Now())).String(), durafmt.ParseShort(time.Until(di.cron.Entry(di.jobID).Next)).String(),
di.cron.Entry(di.jobID).Next) di.cron.Entry(di.jobID).Next)
} }

View File

@@ -516,7 +516,7 @@ func TestValidation(t *testing.T) {
dec, err := env.Encode("DIUN_", cfg) dec, err := env.Encode("DIUN_", cfg)
require.NoError(t, err) require.NoError(t, err)
for _, value := range dec { for _, value := range dec {
fmt.Println(fmt.Sprintf(`%s=%s`, value.Name, value.Default)) fmt.Printf(`%s=%s\n`, value.Name, value.Default)
} }
}) })
} }

View File

@@ -55,7 +55,11 @@ func (c *Client) migration2() error {
if err != nil { if err != nil {
return err return err
} }
defer tx.Rollback() defer func() {
if err := tx.Rollback(); err != nil {
log.Error().Err(err).Msg("Cannot rollback")
}
}()
bucket := tx.Bucket([]byte(bucketManifest)) bucket := tx.Bucket([]byte(bucketManifest))
curs := bucket.Cursor() curs := bucket.Cursor()

View File

@@ -11,6 +11,7 @@ import (
"github.com/matrix-org/gomatrix" "github.com/matrix-org/gomatrix"
"github.com/microcosm-cc/bluemonday" "github.com/microcosm-cc/bluemonday"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/rs/zerolog/log"
"github.com/russross/blackfriday/v2" "github.com/russross/blackfriday/v2"
) )
@@ -42,7 +43,11 @@ func (c *Client) Send(entry model.NotifEntry) error {
if err != nil { if err != nil {
return errors.Wrap(err, "failed to initialize Matrix client") return errors.Wrap(err, "failed to initialize Matrix client")
} }
defer m.Logout() defer func() {
if _, err := m.Logout(); err != nil {
log.Error().Err(err).Msg("Cannot logout")
}
}()
user, err := utl.GetSecret(c.cfg.User, c.cfg.UserFile) user, err := utl.GetSecret(c.cfg.User, c.cfg.UserFile)
if err != nil { if err != nil {

View File

@@ -59,7 +59,6 @@ plugins:
- exclude: - exclude:
glob: glob:
- "_overrides/*" - "_overrides/*"
- "Dockerfile"
- git-revision-date-localized: - git-revision-date-localized:
type: iso_datetime type: iso_datetime
- macros - macros