diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index cc68c18cac2..d625667ce44 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -32,6 +32,8 @@ jobs: - uses: actions/checkout@v6 - name: Install libgit2 1.5 for git2go v34 run: backend/scripts/install-libgit2.sh + - name: Install mockery 3.7.2 + run: backend/scripts/install-mockery.sh - name: Cache golangci-lint id: cache-golangci-lint uses: actions/cache@v5 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 485ae5c72f6..ae9d080e6ca 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -49,6 +49,8 @@ jobs: run: git config --global --add safe.directory $(pwd) - name: Install libgit2 1.5 for git2go v34 run: backend/scripts/install-libgit2.sh + - name: Install mockery 3.7.2 + run: backend/scripts/install-mockery.sh - name: Build Python run: | cd backend diff --git a/backend/.mockery.core.yml b/backend/.mockery.core.yml new file mode 100644 index 00000000000..352a9ab90cb --- /dev/null +++ b/backend/.mockery.core.yml @@ -0,0 +1,38 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# mockery v3 configuration for the ./core tree. +# +# Replaces the v2 command line +# mockery --recursive --keeptree --dir=./core --output=./mocks/core \ +# --unroll-variadic=false --name='.*' +# and reproduces the exact same layout: backend/mocks/core//.go +# with package name `mocks` and an un-prefixed mock struct name. +# +# NOTE: this config is deliberately kept separate from `.mockery.helpers.yml`. +# `helpers/unithelper` imports the generated `mocks/core/...` packages, so the +# core mocks have to exist before the helpers tree can be type-checked by +# mockery v3 (which, unlike v2, loads packages via go/packages). +all: true +recursive: true +template: testify +dir: "mocks/{{.InterfaceDirRelative}}" +filename: "{{.InterfaceName}}.go" +pkgname: "mocks" +structname: "{{.InterfaceName}}" +template-data: + unroll-variadic: false +packages: + github.com/apache/incubator-devlake/core: diff --git a/backend/.mockery.helpers.yml b/backend/.mockery.helpers.yml new file mode 100644 index 00000000000..ef703c5931c --- /dev/null +++ b/backend/.mockery.helpers.yml @@ -0,0 +1,35 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# mockery v3 configuration for the ./helpers tree. +# +# Replaces the v2 command line +# mockery --recursive --keeptree --dir=./helpers --output=./mocks/helpers \ +# --unroll-variadic=false --name='.*' +# and reproduces the exact same layout: backend/mocks/helpers//.go +# with package name `mocks` and an un-prefixed mock struct name. +# +# Must run *after* `.mockery.core.yml` — see the note there. +all: true +recursive: true +template: testify +dir: "mocks/{{.InterfaceDirRelative}}" +filename: "{{.InterfaceName}}.go" +pkgname: "mocks" +structname: "{{.InterfaceName}}" +template-data: + unroll-variadic: false +packages: + github.com/apache/incubator-devlake/helpers: diff --git a/backend/Dockerfile b/backend/Dockerfile index 3a30664cc7b..e77fe682eec 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -49,7 +49,7 @@ RUN if [ "$(arch)" != "x86_64" ] ; then \ apt-get install -y gcc-x86-64-linux-gnu binutils-x86-64-linux-gnu ; \ fi -RUN go install github.com/vektra/mockery/v2@v2.53.6 +RUN go install github.com/vektra/mockery/v3@v3.7.2 RUN go install github.com/swaggo/swag/cmd/swag@v1.16.6 COPY --from=debian-amd64 /usr/include /rootfs-amd64/usr/include diff --git a/backend/Dockerfile.local b/backend/Dockerfile.local index 5dcfcaa7130..262204179b7 100644 --- a/backend/Dockerfile.local +++ b/backend/Dockerfile.local @@ -47,7 +47,7 @@ RUN mkdir -p /tmp/build && cd /tmp/build && \ make -j$(nproc) install && \ ldconfig -RUN go install github.com/vektra/mockery/v2@v2.53.6 +RUN go install github.com/vektra/mockery/v3@v3.7.2 RUN go install github.com/swaggo/swag/cmd/swag@v1.16.6 WORKDIR /app diff --git a/backend/Makefile b/backend/Makefile index 7aca0a2e471..8dde31dc6bf 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -27,7 +27,7 @@ PYTHON_DIR ?= "./python" all: build go-dep: - go install github.com/vektra/mockery/v2@v2.53.6 + go install github.com/vektra/mockery/v3@v3.7.2 go install github.com/swaggo/swag/cmd/swag@v1.16.6 go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.12.2 @@ -73,8 +73,12 @@ debug: build-plugin-debug mock: rm -rf mocks - mockery --recursive --keeptree --dir=./core --output=./mocks/core --unroll-variadic=false --name='.*' - mockery --recursive --keeptree --dir=./helpers --output=./mocks/helpers --unroll-variadic=false --name='.*' + # mockery v3 is configured via YAML instead of CLI flags. Two invocations are + # required (and must run in this order): `helpers/unithelper` imports the + # generated `mocks/core/...` packages, and v3 type-checks the sources it + # parses, so the core mocks have to exist before the helpers tree loads. + mockery --config .mockery.core.yml + mockery --config .mockery.helpers.yml test: unit-test e2e-test diff --git a/backend/scripts/install-mockery.sh b/backend/scripts/install-mockery.sh new file mode 100755 index 00000000000..b748fe5e218 --- /dev/null +++ b/backend/scripts/install-mockery.sh @@ -0,0 +1,100 @@ +#!/bin/sh +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eu + +MOCKERY_VERSION=3.7.2 +INSTALL_DIR=/opt/mockery/$MOCKERY_VERSION +MOCKERY_BIN=$INSTALL_DIR/mockery + +get_version() { + if version_output=$("$1" version 2>/dev/null); then + : + else + version_output=$("$1" --version 2>&1 || true) + fi + printf '%s\n' "$version_output" | + tr ' =' '\n' | + sed -n 's/^v\{0,1\}\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\)$/\1/p' | + head -n 1 +} + +use_installed_mockery() { + export PATH="$INSTALL_DIR:$PATH" + if [ -n "${GITHUB_PATH:-}" ]; then + echo "$INSTALL_DIR" >> "$GITHUB_PATH" + fi +} + +current_mockery=$(command -v mockery 2>/dev/null || true) +if [ -n "$current_mockery" ]; then + current_version=$(get_version "$current_mockery" || true) + if [ "$current_version" = "$MOCKERY_VERSION" ]; then + echo "mockery $current_version is already installed" + exit 0 + fi +fi + +if [ -x "$MOCKERY_BIN" ]; then + installed_version=$(get_version "$MOCKERY_BIN" || true) + if [ "$installed_version" = "$MOCKERY_VERSION" ]; then + use_installed_mockery + echo "mockery $installed_version is already installed in $INSTALL_DIR" + exit 0 + fi +fi + +case "$(uname -m)" in + x86_64|amd64) + archive_name=mockery_${MOCKERY_VERSION}_Linux_x86_64.tar.gz + archive_sha256=db819b897de126634cefeb3773a3b76eea7769c718f0e5e62e968ab00add12c6 + ;; + aarch64|arm64) + archive_name=mockery_${MOCKERY_VERSION}_Linux_arm64.tar.gz + archive_sha256=27141b83d8bccc29d66ed91093da69604b320d417bd562d819c8b0372f1444ad + ;; + *) + echo "unsupported architecture: $(uname -m)" >&2 + exit 1 + ;; +esac + +if [ "$(id -u)" -ne 0 ]; then + echo "install-mockery.sh must run as root" >&2 + exit 1 +fi + +download_url=https://github.com/vektra/mockery/releases/download/v${MOCKERY_VERSION}/${archive_name} +work_dir=$(mktemp -d) +trap 'rm -rf "$work_dir"' EXIT HUP INT TERM + +archive=$work_dir/$archive_name +curl --fail --location --retry 3 "$download_url" --output "$archive" +echo "$archive_sha256 $archive" | sha256sum --check --strict + +tar -xzf "$archive" -C "$work_dir" +mkdir -p "$INSTALL_DIR" +install -m 0755 "$work_dir/mockery" "$MOCKERY_BIN" + +use_installed_mockery +installed_version=$(get_version "$MOCKERY_BIN") +if [ "$installed_version" != "$MOCKERY_VERSION" ]; then + echo "expected mockery $MOCKERY_VERSION, found ${installed_version:-unknown}" >&2 + exit 1 +fi + +echo "installed mockery $installed_version in $INSTALL_DIR" diff --git a/devops/docker/lake-builder/Dockerfile b/devops/docker/lake-builder/Dockerfile index 8675a4cb7b5..14464f4951a 100644 --- a/devops/docker/lake-builder/Dockerfile +++ b/devops/docker/lake-builder/Dockerfile @@ -64,7 +64,7 @@ RUN mv /root/go /go &&\ # Install Golang Tools RUN export GOPATH=/go && \ - go install github.com/vektra/mockery/v2@v2.53.6 && \ + go install github.com/vektra/mockery/v3@v3.7.2 && \ go install github.com/swaggo/swag/cmd/swag@v1.16.1 # Golang Env