From d84cc826c72b9f3ce33ac800a3ae903166fd9b5e Mon Sep 17 00:00:00 2001 From: apostasie Date: Wed, 5 Mar 2025 16:59:44 -0800 Subject: [PATCH] Add install-go make targets and cleanup lint Signed-off-by: apostasie --- .github/workflows/lint.yml | 127 ++++++++++++++++++++++--------------- Makefile | 44 +++++++++++++ 2 files changed, 120 insertions(+), 51 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 608bd9e1354..a9230362151 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -8,75 +8,100 @@ on: pull_request: env: - GO_VERSION: 1.24.x + GO_VERSION: 1.24 GOTOOLCHAIN: local + GO_INSTALL_DESTINATION: /opt jobs: - go: + go_current: timeout-minutes: 5 - name: "go | ${{ matrix.goos }} | ${{ matrix.canary }}" - runs-on: "${{ matrix.os }}" - defaults: - run: - shell: bash - strategy: - fail-fast: false - matrix: - include: - - os: ubuntu-24.04 - goos: linux - - os: ubuntu-24.04 - goos: freebsd - # FIXME: this is currently failing in a non-sensical way, so, running on linux instead... - # - os: windows-2022 - - os: ubuntu-24.04 - goos: windows - - os: ubuntu-24.04 - goos: linux - # This allows the canary script to select any upcoming golang alpha/beta/RC - canary: go-canary + name: "go stable" + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 1 + - name: Environment setup + run: | + echo "GO_VERSION=$(make install-go-resolve-version)" >> "$GITHUB_ENV" + echo "PATH=$GO_INSTALL_DESTINATION/go/bin:$HOME/go/bin:$PATH" >> "$GITHUB_ENV" + - uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4.2.2 + id: cache-go + with: + path: /opt/go + key: golang-${{ env.GO_VERSION }} + - uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4.2.2 + id: cache-go-dev + with: + path: ~/go/bin + key: golang-dev-${{ env.GO_VERSION }}-${{ hashFiles('Makefile') }} + - if: ${{ steps.cache-go.outputs.cache-hit != 'true' }} + name: Install go + continue-on-error: false + run: make install-go + - if: ${{ steps.cache-go-dev.outputs.cache-hit != 'true' }} + name: Install dev tools + continue-on-error: false + run: make install-dev-tools + - name: make lint-imports + run: make lint-imports + - name: make lint-mod + run: make lint-mod + - name: make lint-go-all + run: make lint-go-all + # Debug + - name: go version + run: go version + + go_canary: + timeout-minutes: 5 + name: "go canary" + runs-on: ubuntu-24.04 env: - GOOS: "${{ matrix.goos }}" + GO_VERSION: canary steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 1 - - name: Set GO env + - name: Environment setup run: | - # If canary is specified, get the latest available golang pre-release instead of the major version - if [ "$canary" != "" ]; then - . ./hack/build-integration-canary.sh - canary::golang::latest - fi - - uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 + echo "GO_VERSION=$(make install-go-resolve-version)" >> "$GITHUB_ENV" + echo "PATH=$GO_INSTALL_DESTINATION/go/bin:$HOME/go/bin:$PATH" >> "$GITHUB_ENV" + - uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4.2.2 + id: cache-go with: - go-version: ${{ env.GO_VERSION }} - check-latest: true - - name: golangci-lint - uses: golangci/golangci-lint-action@2226d7cb06a077cd73e56eedd38eecad18e5d837 # v6.5.0 + path: /opt/go + key: golang-${{ env.GO_VERSION }} + - uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4.2.2 + id: cache-go-dev with: - args: --verbose - # See https://github.com/containerd/nerdctl/issues/3914 - verify: false + path: ~/go/bin + key: golang-dev-${{ env.GO_VERSION }}-${{ hashFiles('Makefile') }} + - if: ${{ steps.cache-go.outputs.cache-hit != 'true' }} + name: Install go + run: make install-go + - if: ${{ steps.cache-go-dev.outputs.cache-hit != 'true' }} + name: Install dev tools + run: make install-dev-tools + - name: make lint-imports + run: make lint-imports + - name: make lint-mod + run: make lint-mod + - name: make lint-go-all + run: make lint-go-all + # Debug + - name: go version + run: go version + other: timeout-minutes: 5 - name: yaml | shell | imports order + name: "yaml | shell" runs-on: ubuntu-24.04 steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 1 - - uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 - with: - go-version: ${{ env.GO_VERSION }} - check-latest: true - - name: install required linters and dev-tools - run: | - make install-dev-tools - - name: yaml + - name: make lint-yaml run: make lint-yaml - - name: shell + - name: make lint-shell run: make lint-shell - - name: go imports ordering - run: | - make lint-imports diff --git a/Makefile b/Makefile index c06d1449ef3..782bb278f58 100644 --- a/Makefile +++ b/Makefile @@ -51,6 +51,18 @@ GO_BUILD_FLAGS ?= ########################## # Helpers ########################## +ARCH := amd64 +ifeq ($(shell uname -m), aarch64) + ARCH = arm64 +endif +OS := linux +ifeq ($(shell uname -s), Darwin) + OS = darwin +endif +ifeq ($(shell uname -s), FreeBSD) + OS = freebsd +endif + ifdef VERBOSE VERBOSE_FLAG := -v VERBOSE_FLAG_LONG := --verbose @@ -233,6 +245,38 @@ install-dev-tools: @echo "Remember to add GOROOT/bin to your path" $(call footer, $@) + +GO_VERSION ?= stable +GO_VERSION_SELECTOR = +GO_VERSION_SELECTOR = .version | startswith("go$(GO_VERSION)") +ifeq ($(GO_VERSION),canary) + GO_VERSION_SELECTOR = .stable==false +endif +ifeq ($(GO_VERSION),stable) + GO_VERSION_SELECTOR = .stable==true +endif +ifeq ($(GO_VERSION),) + GO_VERSION_SELECTOR = .stable==true +endif + +GO_INSTALL_DESTINATION ?= /opt/$(BINARY)-dev-tools + +install-go: + $(call title, $@) + @mkdir -p $(GO_INSTALL_DESTINATION) + @if [ ! -e $(GO_INSTALL_DESTINATION)/go ]; then curl -fsSL --proto '=https' --tlsv1.2 https://go.dev/dl/$(shell curl -fsSL --proto "=https" --tlsv1.3 "https://go.dev/dl/?mode=json&include=all" | \ + jq -rc 'map(select($(GO_VERSION_SELECTOR)))[0].files | map(select(.os=="$(OS)" and .arch=="$(ARCH)"))[0].filename') | \ + tar xzC $(GO_INSTALL_DESTINATION) || exit; \ + else \ + echo "Install already detected, doing nothing."; \ + fi + @echo Remember to add to your profile: export PATH="$(GO_INSTALL_DESTINATION)/go/bin:\$$HOME/go/bin:\$$PATH" + $(call footer, $@) + +install-go-resolve-version: + @curl -fsSL --proto "=https" --tlsv1.2 "https://go.dev/dl/?mode=json&include=all" | \ + jq -rc 'map(select($(GO_VERSION_SELECTOR)))[0].version' | sed s/go// + ########################## # Testing tasks ##########################