mirror of
https://github.com/crazy-max/diun.git
synced 2025-12-21 21:33:22 +01:00
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:
@@ -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
|
|
||||||
|
|||||||
14
.github/CONTRIBUTING.md
vendored
14
.github/CONTRIBUTING.md
vendored
@@ -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:
|
||||||
|
|
||||||
|
|||||||
138
.github/workflows/build.yml
vendored
138
.github/workflows/build.yml
vendored
@@ -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'
|
||||||
|
|||||||
28
.github/workflows/docs.yml
vendored
28
.github/workflows/docs.yml
vendored
@@ -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
|
||||||
|
|||||||
44
.github/workflows/gosum.yml
vendored
44
.github/workflows/gosum.yml
vendored
@@ -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
|
|
||||||
57
.github/workflows/test.yml
vendored
57
.github/workflows/test.yml
vendored
@@ -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
30
.github/workflows/validate.yml
vendored
Normal 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
2
.gitignore
vendored
@@ -4,3 +4,5 @@
|
|||||||
.dev
|
.dev
|
||||||
/bin
|
/bin
|
||||||
/dist
|
/dist
|
||||||
|
/site
|
||||||
|
/coverage.txt
|
||||||
|
|||||||
@@ -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'
|
|
||||||
36
Dockerfile
36
Dockerfile
@@ -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"
|
||||||
|
|||||||
@@ -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
88
docker-bake.hcl
Normal 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"]
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
164
hack/goreleaser.sh
Executable 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
15
hack/lint.Dockerfile
Normal 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
20
hack/test.Dockerfile
Normal 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
24
hack/vendor.Dockerfile
Normal 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
|
||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user