From 2341aa743261b42c0f2f922d80ea6b59793e4ed1 Mon Sep 17 00:00:00 2001 From: Vadim Alekseev Date: Sun, 13 Aug 2023 16:28:13 +0300 Subject: [PATCH 01/14] Bump Go version --- .github/workflows/ci.yml | 12 ++++++------ .github/workflows/release.yml | 2 +- go.mod | 4 +++- go.sum | 13 +++++++++++++ 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ab986eff3..fbde7ff69 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ jobs: fail-fast: false matrix: flags: [ '' ] - go: [ '1.20' ] + go: [ '1.21' ] arch: [ amd64 ] runner: [ ubuntu-latest ] include: @@ -68,7 +68,7 @@ jobs: fail-fast: false matrix: flags: [ '' ] - go: [ '1.20' ] + go: [ '1.21' ] arch: [ amd64 ] runner: [ ubuntu-latest ] include: @@ -82,7 +82,7 @@ jobs: - name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.20' + go-version: '1.21' cache: true - name: Run Kafka @@ -134,7 +134,7 @@ jobs: - name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.20' + go-version: '1.21' cache: true - name: Lint @@ -159,7 +159,7 @@ jobs: - name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.20' + go-version: '1.21' cache: true - name: Generate doc @@ -183,7 +183,7 @@ jobs: - name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.20' + go-version: '1.21' cache: true - name: Download dependencies diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bb573fe9a..d62d63b2a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,7 +20,7 @@ jobs: - name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.20' + go-version: '1.21' cache: true - name: Run GoReleaser diff --git a/go.mod b/go.mod index 9dc5ce999..514c4c29c 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/ozontech/file.d -go 1.20 +go 1.21 + +toolchain go1.21.0 require ( github.com/ClickHouse/ch-go v0.58.0 diff --git a/go.sum b/go.sum index 3972eeaba..0e0940da2 100644 --- a/go.sum +++ b/go.sum @@ -10,6 +10,7 @@ github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA4 github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= github.com/Shopify/toxiproxy/v2 v2.5.0 h1:i4LPT+qrSlKNtQf5QliVjdP08GyAH8+BUIc9gT0eahc= +github.com/Shopify/toxiproxy/v2 v2.5.0/go.mod h1:yhM2epWtAmel9CB8r2+L+PCmhH6yH2pITaPAo7jxJl0= github.com/alecthomas/kingpin v2.2.6+incompatible h1:5svnBTFgJjZvGKyYBtMB0+m5wvrbUHiqye8wRJMlnYI= github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -75,7 +76,9 @@ github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6 github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= @@ -100,6 +103,7 @@ github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGK github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.2 h1:onZX1rnHT3Wv6cqNgYyFOOlgVKJrksuCMCRvJStbMYw= +github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= @@ -134,6 +138,7 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -156,6 +161,7 @@ github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9n github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.16.2 h1:K4ev2ib4LdQETX5cSZBG0DVLk1jwGqSPXBjdah3veNs= +github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= @@ -270,10 +276,12 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= @@ -333,6 +341,7 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= @@ -357,6 +366,7 @@ github.com/rjeczalik/notify v0.9.3 h1:6rJAzHTGKXGj76sbRgDiDcYj/HniypXmSJo1SWakZe github.com/rjeczalik/notify v0.9.3/go.mod h1:gF3zSOrafR9DQEWSE8TjfI9NkooDxbyT4UgRGKZA0lc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= @@ -424,6 +434,7 @@ go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeH go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= +go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -435,6 +446,7 @@ go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0 go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -597,6 +609,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= From 90697f76b2aeeb0667c6d6e055682cd45032ae9c Mon Sep 17 00:00:00 2001 From: Vadim Alekseev Date: Sun, 13 Aug 2023 16:28:35 +0300 Subject: [PATCH 02/14] Add .dockerignore --- .dockerignore | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..1e527f7d7 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +./file.d +.git +.idea +.vscode From 188b16a513f9bc2359a5deba344debeebea6a2e2 Mon Sep 17 00:00:00 2001 From: Vadim Alekseev Date: Sun, 13 Aug 2023 16:29:01 +0300 Subject: [PATCH 03/14] Update CI --- .github/workflows/cd.yml | 2 ++ Dockerfile | 9 ++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 695220d13..d275e34c7 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -35,4 +35,6 @@ jobs: uses: docker/build-push-action@v4 with: push: true + build-args: + - 'VERSION=${{ VERSION }}' tags: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ steps.set-version.outputs.VERSION }} diff --git a/Dockerfile b/Dockerfile index 9f5f4cb77..a59e92471 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,8 @@ # Build -FROM --platform=$BUILDPLATFORM golang:1.20-alpine AS build +FROM --platform=$BUILDPLATFORM golang:1.21-alpine AS build + +ARG VERSION +ARG BUILD_TIME RUN apk update RUN apk add git @@ -17,8 +20,8 @@ ENV GOOS linux ENV GOARCH amd64 RUN go build -trimpath \ - -ldflags "-X github.com/ozontech/file.d/buildinfo.Version=$(git describe --abbrev=4 --dirty --always --tags) \ - -X github.com/ozontech/file.d/buildinfo.BuildTime=$(date '+%Y-%m-%d_%H:%M:%S')" \ + -ldflags "-X github.com/ozontech/file.d/buildinfo.Version=${VERSION} \ + -X github.com/ozontech/file.d/buildinfo.BuildTime=${BUILD_TIME}" \ -o file.d ./cmd/file.d # Deploy From e8bbe052e4df6d57937ad9564d858e0c0d30c92a Mon Sep 17 00:00:00 2001 From: Vadim Alekseev Date: Sun, 13 Aug 2023 17:59:59 +0300 Subject: [PATCH 04/14] Update CI --- .github/workflows/cd.yml | 2 +- .github/workflows/ci.yml | 40 ++++++++++++---------------------------- 2 files changed, 13 insertions(+), 29 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index d275e34c7..15e81a0df 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -36,5 +36,5 @@ jobs: with: push: true build-args: - - 'VERSION=${{ VERSION }}' + - VERSION=${{ steps.set-version.outputs.VERSION }} tags: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ steps.set-version.outputs.VERSION }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fbde7ff69..9c96ff710 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,18 +12,11 @@ concurrency: jobs: test: - runs-on: ${{ matrix.runner }} + runs-on: ubuntu-latest strategy: fail-fast: false matrix: - flags: [ '' ] - go: [ '1.21' ] - arch: [ amd64 ] - runner: [ ubuntu-latest ] - include: - - arch: amd64 - runner: ubuntu-latest - flags: -race + flags: [ '', '-race' ] steps: - name: Checkout code uses: actions/checkout@v3 @@ -31,18 +24,14 @@ jobs: - name: Install Go uses: actions/setup-go@v4 with: - go-version: ${{ matrix.go }} + go-version: '1.21' cache: true - name: Build - env: - GOARCH: ${{ matrix.arch }} - GOFLAGS: ${{ matrix.flags }} run: go build ./... - name: Test env: - GOARCH: ${{ matrix.arch }} GOFLAGS: ${{ matrix.flags }} LOG_LEVEL: error run: go test -coverprofile=profile.out -covermode=atomic -v -coverpkg=./... ./... @@ -51,15 +40,16 @@ jobs: uses: actions/upload-artifact@v3 with: name: coverage - path: profile.out + path: | + profile.out + profile_race.out if-no-files-found: error retention-days: 1 - name: Run benchmarks if: ${{ !contains(matrix.flags, '-race') }} env: - GOARCH: ${{ matrix.arch }} - GOFLAGS: ${{ matrix.flags }} + LOG_LEVEL: error run: go test --timeout=15m --benchtime=3x --benchmem --bench="BenchmarkLightJsonReadPar" --run=$^ ./plugin/input/file/... e2e_test: @@ -67,14 +57,7 @@ jobs: strategy: fail-fast: false matrix: - flags: [ '' ] - go: [ '1.21' ] - arch: [ amd64 ] - runner: [ ubuntu-latest ] - include: - - arch: amd64 - runner: ubuntu-latest - flags: -race + flags: [ '', '-race' ] steps: - name: Checkout code uses: actions/checkout@v3 @@ -93,7 +76,6 @@ jobs: - name: E2E env: - GOARCH: ${{ matrix.arch }} GOFLAGS: ${{ matrix.flags }} LOG_LEVEL: error run: go test ./e2e -coverprofile=profile_e2e.out -covermode=atomic -tags=e2e_new -timeout=3m -coverpkg=./... @@ -102,7 +84,9 @@ jobs: uses: actions/upload-artifact@v3 with: name: coverage - path: profile_e2e.out + path: | + profile_e2e.out + profile_e2e_race.out if-no-files-found: error retention-days: 1 @@ -123,7 +107,7 @@ jobs: - name: Send coverage uses: codecov/codecov-action@v3 with: - files: profile.out, profile_e2e.out + files: profile.out, profile_race.out, profile_e2e.out, profile_e2e_race.out, lint: runs-on: ubuntu-latest From 8f315d929a844009cc4ffc1ce957ac5769bd7f35 Mon Sep 17 00:00:00 2001 From: Vadim Alekseev Date: Sun, 13 Aug 2023 18:30:42 +0300 Subject: [PATCH 05/14] Build images with matrix --- .github/workflows/cd.yml | 20 ++++++++++++++++---- Dockerfile | 7 +++---- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 15e81a0df..1f5cc3c58 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -10,7 +10,18 @@ jobs: permissions: packages: write contents: read - + strategy: + fail-fast: false + matrix: + image: + - name: 'ubuntu:18.04' + suffix: '-ubuntu18.04' + - name: 'ubuntu:20.04' + suffix: '-ubuntu20.04' + - name: 'ubuntu:22.04' + suffix: '-ubuntu22.04' + - name: 'ubuntu:latest' + suffix: '' steps: - uses: actions/checkout@v3 @@ -35,6 +46,7 @@ jobs: uses: docker/build-push-action@v4 with: push: true - build-args: - - VERSION=${{ steps.set-version.outputs.VERSION }} - tags: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ steps.set-version.outputs.VERSION }} + build-args: | + VERSION=${{ steps.set-version.outputs.VERSION }} + APP_IMAGE=${{ matrix.app_image }} + tags: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ steps.set-version.outputs.VERSION }}${{ matrix.image.suffix }} diff --git a/Dockerfile b/Dockerfile index a59e92471..09b4aefc8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,11 @@ +ARG APP_IMAGE=ubuntu:latest + # Build FROM --platform=$BUILDPLATFORM golang:1.21-alpine AS build ARG VERSION ARG BUILD_TIME -RUN apk update -RUN apk add git - WORKDIR /file.d COPY go.mod go.sum ./ @@ -25,7 +24,7 @@ RUN go build -trimpath \ -o file.d ./cmd/file.d # Deploy -FROM ubuntu:20.04 +FROM $APP_IMAGE RUN apt update RUN apt install systemd strace tcpdump traceroute telnet iotop curl jq iputils-ping htop -y From f64b7e6e84f0c5868c10669f13a149199da63cb7 Mon Sep 17 00:00:00 2001 From: Vadim Alekseev Date: Sun, 13 Aug 2023 20:16:34 +0300 Subject: [PATCH 06/14] Try to fix CI --- .github/workflows/cd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 1f5cc3c58..38b6dc731 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -48,5 +48,5 @@ jobs: push: true build-args: | VERSION=${{ steps.set-version.outputs.VERSION }} - APP_IMAGE=${{ matrix.app_image }} - tags: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ steps.set-version.outputs.VERSION }}${{ matrix.image.suffix }} + APP_IMAGE=${{ matrix.image.name }} + tags: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:$GITHUB_REF_NAME${{ matrix.image.suffix }} From 70f327dd86471c5ee0d260a62177fd9a4d804e99 Mon Sep 17 00:00:00 2001 From: Vadim Alekseev Date: Sun, 13 Aug 2023 20:23:53 +0300 Subject: [PATCH 07/14] Try to fix CI --- .github/workflows/cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 38b6dc731..4720c44a8 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -49,4 +49,4 @@ jobs: build-args: | VERSION=${{ steps.set-version.outputs.VERSION }} APP_IMAGE=${{ matrix.image.name }} - tags: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:$GITHUB_REF_NAME${{ matrix.image.suffix }} + tags: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ env.GITHUB_REF_NAME }}${{ matrix.image.suffix }} From dfa6ea0847bcb1d792ac9fe8608f8b03e3a24b05 Mon Sep 17 00:00:00 2001 From: Vadim Alekseev Date: Sun, 13 Aug 2023 20:28:22 +0300 Subject: [PATCH 08/14] Try to fix CI --- .github/workflows/cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 4720c44a8..22de02659 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -49,4 +49,4 @@ jobs: build-args: | VERSION=${{ steps.set-version.outputs.VERSION }} APP_IMAGE=${{ matrix.image.name }} - tags: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ env.GITHUB_REF_NAME }}${{ matrix.image.suffix }} + tags: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ github.ref_name }}${{ matrix.image.suffix }} From a770d51ca6c8bedc429e8f0d9dbb8385d2503691 Mon Sep 17 00:00:00 2001 From: Vadim Alekseev Date: Sun, 13 Aug 2023 20:31:39 +0300 Subject: [PATCH 09/14] Remove Set version step --- .github/workflows/cd.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 22de02659..3ab17ab64 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -35,18 +35,12 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Set version - id: set-version - run: | - VERSION=${GITHUB_REF/refs\/tags\//} - echo "VERSION=${VERSION}" >> $GITHUB_OUTPUT - - name: Build and push id: docker-build uses: docker/build-push-action@v4 with: push: true build-args: | - VERSION=${{ steps.set-version.outputs.VERSION }} + VERSION=${{ github.ref_name }} APP_IMAGE=${{ matrix.image.name }} tags: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ github.ref_name }}${{ matrix.image.suffix }} From 8ce78b9e72d663c4f5a2f46057d393dea813a841 Mon Sep 17 00:00:00 2001 From: Vadim Alekseev Date: Mon, 14 Aug 2023 10:05:31 +0300 Subject: [PATCH 10/14] Refactor Makefile --- Makefile | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index a850644e6..12aab3765 100644 --- a/Makefile +++ b/Makefile @@ -5,12 +5,7 @@ UPSTREAM_BRANCH ?= origin/master .PHONY: build build: echo "Building for amd64..." - GOOS=linux GOARCH=amd64 go build -trimpath -ldflags "-X github.com/ozontech/file.d/buildinfo.Version=${VERSION} -X github.com/ozontech/file.d/buildinfo.BuildTime=${TIME}" -o file.d ./cmd/file.d - -.PHONY: build-for-current-system -build-for-current-system: - echo "Building for current architecture..." - go build -ldflags "-X github.com/ozontech/file.d/buildinfo.Version=${VERSION} -X github.com/ozontech/file.d/buildinfo.BuildTime=${TIME}" -v -o file.d ./cmd/file.d + GOOS=linux GOARCH=amd64 go build -trimpath -ldflags "-X github.com/ozontech/file.d/buildinfo.Version=${VERSION}" -o file.d ./cmd/file.d .PHONY: cover cover: @@ -43,14 +38,9 @@ bench-file: gen-doc: go run github.com/vitkovskii/insane-doc@v0.0.3 -.PHONY: profile-file -profile-file: - go test -bench LightJsonReadPar ./plugin/input/file -v -count 1 -run -benchmem -benchtime 1x -cpuprofile cpu.pprof -memprofile mem.pprof -mutexprofile mutex.pprof - .PHONY: lint lint: - # installation: https://golangci-lint.run/usage/install/#local-installation - golangci-lint run + go run github.com/golangci/golangci-lint/cmd/golangci-lint@latest run .PHONY: mock mock: From b9486fdb1af3519d3db3763a29fa687aac95da4b Mon Sep 17 00:00:00 2001 From: Vadim Alekseev Date: Mon, 14 Aug 2023 10:05:41 +0300 Subject: [PATCH 11/14] Remove BuildTime --- buildinfo/buildinfo.go | 3 +-- cmd/file.d/file.d.go | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/buildinfo/buildinfo.go b/buildinfo/buildinfo.go index 62865eaae..364ce35ac 100644 --- a/buildinfo/buildinfo.go +++ b/buildinfo/buildinfo.go @@ -1,6 +1,5 @@ package buildinfo var ( - Version string - BuildTime string + Version string ) diff --git a/cmd/file.d/file.d.go b/cmd/file.d/file.d.go index 6a46fefa1..690c7fd68 100644 --- a/cmd/file.d/file.d.go +++ b/cmd/file.d/file.d.go @@ -72,7 +72,7 @@ func main() { kingpin.Version(buildinfo.Version) kingpin.Parse() - logger.Infof("Hi! I'm file.d version=%s %s", buildinfo.Version, buildinfo.BuildTime) + logger.Infof("Hi! I'm file.d version=%s %s", buildinfo.Version) setRuntimeSettings() insaneJSON.DisableBeautifulErrors = true From fabbc9c9d0116fc745a80a0804e545698e12ce44 Mon Sep 17 00:00:00 2001 From: Vadim Alekseev Date: Mon, 14 Aug 2023 10:06:06 +0300 Subject: [PATCH 12/14] Separate dev/github Dockerfiles --- build/package/Dockerfile | 32 ++++++++++++++++++++++ Dockerfile => build/package/Dockerfile_dev | 7 ++--- 2 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 build/package/Dockerfile rename Dockerfile => build/package/Dockerfile_dev (80%) diff --git a/build/package/Dockerfile b/build/package/Dockerfile new file mode 100644 index 000000000..7b943268f --- /dev/null +++ b/build/package/Dockerfile @@ -0,0 +1,32 @@ +ARG APP_IMAGE=ubuntu:latest + +# Build +FROM --platform=$BUILDPLATFORM golang:1.21-alpine AS build + +ARG VERSION +ARG BUILD_TIME + +WORKDIR /file.d + +COPY go.mod go.sum ./ + +RUN go mod download + +COPY . . + +ENV CGO_ENABLED 0 +ENV GOOS linux +ENV GOARCH amd64 + +RUN go build -trimpath \ + -ldflags "-X github.com/ozontech/file.d/buildinfo.Version=${VERSION}" \ + -o file.d ./cmd/file.d + +# Deploy +FROM $APP_IMAGE + +WORKDIR /file.d + +COPY --from=build /file.d/file.d /file.d/file.d + +CMD [ "./file.d" ] diff --git a/Dockerfile b/build/package/Dockerfile_dev similarity index 80% rename from Dockerfile rename to build/package/Dockerfile_dev index 09b4aefc8..2da13d81e 100644 --- a/Dockerfile +++ b/build/package/Dockerfile_dev @@ -1,5 +1,3 @@ -ARG APP_IMAGE=ubuntu:latest - # Build FROM --platform=$BUILDPLATFORM golang:1.21-alpine AS build @@ -19,12 +17,11 @@ ENV GOOS linux ENV GOARCH amd64 RUN go build -trimpath \ - -ldflags "-X github.com/ozontech/file.d/buildinfo.Version=${VERSION} \ - -X github.com/ozontech/file.d/buildinfo.BuildTime=${BUILD_TIME}" \ + -ldflags "-X github.com/ozontech/file.d/buildinfo.Version=${VERSION}" \ -o file.d ./cmd/file.d # Deploy -FROM $APP_IMAGE +FROM ubuntu:20.04 RUN apt update RUN apt install systemd strace tcpdump traceroute telnet iotop curl jq iputils-ping htop -y From 0e7d8c76ba9fdbaf51ec201b00a3764ea0381e9d Mon Sep 17 00:00:00 2001 From: Vadim Alekseev Date: Mon, 14 Aug 2023 10:06:22 +0300 Subject: [PATCH 13/14] Build for many targets --- .github/workflows/cd.yml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 3ab17ab64..4d1c2ba43 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -14,14 +14,18 @@ jobs: fail-fast: false matrix: image: - - name: 'ubuntu:18.04' - suffix: '-ubuntu18.04' - - name: 'ubuntu:20.04' - suffix: '-ubuntu20.04' - - name: 'ubuntu:22.04' - suffix: '-ubuntu22.04' - name: 'ubuntu:latest' suffix: '' + - name: 'ubuntu:22.04' + suffix: '-ubuntu22.04' + - name: 'ubuntu:20.04' + suffix: '-ubuntu20.04' + - name: 'ubuntu:18.04' + suffix: '-ubuntu18.04' + - name: 'alpine' + suffix: '-alpine' + - name: 'scratch' + suffix: '-scratch' steps: - uses: actions/checkout@v3 @@ -40,6 +44,8 @@ jobs: uses: docker/build-push-action@v4 with: push: true + file: ./build/package/Dockerfile + platforms: linux/amd64,linux/arm64 build-args: | VERSION=${{ github.ref_name }} APP_IMAGE=${{ matrix.image.name }} From d3d4359e315e8151f1538f1ab1bf2b374abcbaf4 Mon Sep 17 00:00:00 2001 From: Vadim Alekseev Date: Mon, 14 Aug 2023 10:29:47 +0300 Subject: [PATCH 14/14] Paste default.pgo --- build/package/Dockerfile | 1 + build/package/Dockerfile_dev | 1 + default.pgo | Bin 0 -> 32719 bytes 3 files changed, 2 insertions(+) create mode 100644 default.pgo diff --git a/build/package/Dockerfile b/build/package/Dockerfile index 7b943268f..e3e1b481c 100644 --- a/build/package/Dockerfile +++ b/build/package/Dockerfile @@ -19,6 +19,7 @@ ENV GOOS linux ENV GOARCH amd64 RUN go build -trimpath \ + -pgo default.pgo \ -ldflags "-X github.com/ozontech/file.d/buildinfo.Version=${VERSION}" \ -o file.d ./cmd/file.d diff --git a/build/package/Dockerfile_dev b/build/package/Dockerfile_dev index 2da13d81e..8e24a3393 100644 --- a/build/package/Dockerfile_dev +++ b/build/package/Dockerfile_dev @@ -17,6 +17,7 @@ ENV GOOS linux ENV GOARCH amd64 RUN go build -trimpath \ + -pgo default.pgo \ -ldflags "-X github.com/ozontech/file.d/buildinfo.Version=${VERSION}" \ -o file.d ./cmd/file.d diff --git a/default.pgo b/default.pgo new file mode 100644 index 0000000000000000000000000000000000000000..5094f87b6b47e8173afa52e6404fea1ad2ca99ba GIT binary patch literal 32719 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 a=|4_bzF8{&)Bg(q0RR6OS8m-_KLG$*rEi1) literal 0 HcmV?d00001