From d7a81a1fe34e9a35c069752a5da5464fdafbae9b Mon Sep 17 00:00:00 2001 From: ffranr Date: Mon, 20 Nov 2023 18:13:01 +0000 Subject: [PATCH 1/3] multi: use Go version 1.22.5 throughout --- .golangci.yml | 2 +- docker/btcd/Dockerfile | 2 +- docs/INSTALL.md | 16 ++++++++-------- lnrpc/Dockerfile | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 2d6f539c5a..f1b4ea3df5 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -57,7 +57,7 @@ linters-settings: - G306 # Poor file permissions used when writing to a new file. staticcheck: - go: "1.21" + go: "1.22.5" checks: ["-SA1019"] lll: diff --git a/docker/btcd/Dockerfile b/docker/btcd/Dockerfile index bbea92a543..0a54540c8e 100644 --- a/docker/btcd/Dockerfile +++ b/docker/btcd/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.21.0-alpine as builder +FROM golang:1.22.5-alpine as builder LABEL maintainer="Olaoluwa Osuntokun " diff --git a/docs/INSTALL.md b/docs/INSTALL.md index 819e5708a6..3090835f3d 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -100,16 +100,16 @@ the following commands for your OS: Linux (x86-64) ``` - wget https://dl.google.com/go/go1.22.4.linux-amd64.tar.gz - sha256sum go1.22.4.linux-amd64.tar.gz | awk -F " " '{ print $1 }' + wget https://dl.google.com/go/go1.22.5.linux-amd64.tar.gz + sha256sum go1.22.5.linux-amd64.tar.gz | awk -F " " '{ print $1 }' ``` The final output of the command above should be - `ba79d4526102575196273416239cca418a651e049c2b099f3159db85e7bade7d`. If it + `904b924d435eaea086515bc63235b192ea441bd8c9b198c507e85009e6e4c7f0`. If it isn't, then the target REPO HAS BEEN MODIFIED, and you shouldn't install this version of Go. If it matches, then proceed to install Go: ``` - sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.22.4.linux-amd64.tar.gz + sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz export PATH=$PATH:/usr/local/go/bin ``` @@ -118,16 +118,16 @@ the following commands for your OS: Linux (ARMv6) ``` - wget https://dl.google.com/go/go1.22.4.linux-armv6l.tar.gz - sha256sum go1.22.4.linux-armv6l.tar.gz | awk -F " " '{ print $1 }' + wget https://dl.google.com/go/go1.22.5.linux-armv6l.tar.gz + sha256sum go1.22.5.linux-armv6l.tar.gz | awk -F " " '{ print $1 }' ``` The final output of the command above should be - `e2b143fbacbc9cbd448e9ef41ac3981f0488ce849af1cf37e2341d09670661de`. If it + `8c4587cf3e63c9aefbcafa92818c4d9d51683af93ea687bf6c7508d6fa36f85e`. If it isn't, then the target REPO HAS BEEN MODIFIED, and you shouldn't install this version of Go. If it matches, then proceed to install Go: ``` - sudo rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.4.linux-armv6l.tar.gz + sudo rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.5.linux-armv6l.tar.gz export PATH=$PATH:/usr/local/go/bin ``` diff --git a/lnrpc/Dockerfile b/lnrpc/Dockerfile index f779cc95cc..207ae694f9 100644 --- a/lnrpc/Dockerfile +++ b/lnrpc/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.21.0-bookworm +FROM golang:1.22.5-bookworm RUN apt-get update && apt-get install -y \ git \ From 077e6682fa96f16912f6b650ed54d3d74c4c349d Mon Sep 17 00:00:00 2001 From: ffranr Date: Tue, 30 Jul 2024 00:44:47 +0100 Subject: [PATCH 2/3] Makefile: rename variable to `ACTIVE_GO_VERSION` Renamed the Makefile variable `GO_VERSION` to `ACTIVE_GO_VERSION` for improved clarity. This change also frees up the name `GO_VERSION` to be used for defining the global Go version for reproducible binaries in a subsequent commit. --- Makefile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 5ea087892e..cb5d43e02c 100644 --- a/Makefile +++ b/Makefile @@ -23,11 +23,12 @@ ANDROID_BUILD := $(ANDROID_BUILD_DIR)/Lndmobile.aar COMMIT := $(shell git describe --tags --dirty) -GO_VERSION := $(shell go version | sed -nre 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p') -GO_VERSION_MINOR := $(shell echo $(GO_VERSION) | cut -d. -f2) +# Determine the minor version of the active Go installation. +ACTIVE_GO_VERSION := $(shell go version | sed -nre 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p') +ACTIVE_GO_VERSION_MINOR := $(shell echo $(ACTIVE_GO_VERSION) | cut -d. -f2) LOOPVARFIX := -ifeq ($(shell expr $(GO_VERSION_MINOR) \>= 21), 1) +ifeq ($(shell expr $(ACTIVE_GO_VERSION_MINOR) \>= 21), 1) LOOPVARFIX := GOEXPERIMENT=loopvar endif From 2a6e54016f6e97bf99eaa08f98e2746f93d48a68 Mon Sep 17 00:00:00 2001 From: ffranr Date: Mon, 20 Nov 2023 18:19:43 +0000 Subject: [PATCH 3/3] Makefile: add lint check for Go version in Dockerfile and YAML Implemented linter scripts to ensure consistency of the Go version specified in Dockerfiles and YAML files. These scripts verify that the Go version used across these files is uniform, enhancing maintainability and reducing configuration errors. This commit also introduces a `GO_VERSION` Makefile variable to control the Go version used throughout the project. --- Makefile | 25 ++++++++- scripts/check-go-version-dockerfile.sh | 64 ++++++++++++++++++++++ scripts/check-go-version-yaml.sh | 75 ++++++++++++++++++++++++++ 3 files changed, 162 insertions(+), 2 deletions(-) create mode 100755 scripts/check-go-version-dockerfile.sh create mode 100755 scripts/check-go-version-yaml.sh diff --git a/Makefile b/Makefile index cb5d43e02c..d7e726df1f 100644 --- a/Makefile +++ b/Makefile @@ -32,6 +32,11 @@ ifeq ($(shell expr $(ACTIVE_GO_VERSION_MINOR) \>= 21), 1) LOOPVARFIX := GOEXPERIMENT=loopvar endif +# GO_VERSION is the Go version used for the release build, docker files, and +# GitHub Actions. This is the reference version for the project. All other Go +# versions are checked against this version. +GO_VERSION = 1.22.5 + GOBUILD := $(LOOPVARFIX) go build -v GOINSTALL := $(LOOPVARFIX) go install -v GOTEST := $(LOOPVARFIX) go test @@ -298,11 +303,27 @@ fmt-check: fmt @$(call print, "Checking fmt results.") if test -n "$$(git status --porcelain)"; then echo "code not formatted correctly, please run `make fmt` again!"; git status; git diff; exit 1; fi -#? lint: Run static code analysis -lint: docker-tools +#? check-go-version-yaml: Verify that the Go version is correct in all YAML files +check-go-version-yaml: + @$(call print, "Checking for target Go version (v$(GO_VERSION)) in YAML files (*.yaml, *.yml)") + ./scripts/check-go-version-yaml.sh $(GO_VERSION) + +#? check-go-version-dockerfile: Verify that the Go version is correct in all Dockerfile files +check-go-version-dockerfile: + @$(call print, "Checking for target Go version (v$(GO_VERSION)) in Dockerfile files (*Dockerfile)") + ./scripts/check-go-version-dockerfile.sh $(GO_VERSION) + +#? check-go-version: Verify that the Go version is correct in all project files +check-go-version: check-go-version-dockerfile check-go-version-yaml + +#? lint-source: Run static code analysis +lint-source: docker-tools @$(call print, "Linting source.") $(DOCKER_TOOLS) golangci-lint run -v $(LINT_WORKERS) +#? lint: Run static code analysis +lint: check-go-version lint-source + #? protolint: Lint proto files using protolint protolint: @$(call print, "Linting proto files.") diff --git a/scripts/check-go-version-dockerfile.sh b/scripts/check-go-version-dockerfile.sh new file mode 100755 index 0000000000..303ee42ede --- /dev/null +++ b/scripts/check-go-version-dockerfile.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +# Function to check if the Dockerfile contains only the specified Go version. +check_go_version() { + local dockerfile="$1" + local required_go_version="$2" + + # Use grep to find lines with 'FROM golang:' + local go_lines=$(grep -i '^FROM golang:' "$dockerfile") + + # Check if all lines have the required Go version. + if [ -z "$go_lines" ]; then + # No Go version found in the file. Skip the check. + return + elif echo "$go_lines" | grep -q -v "$required_go_version"; then + echo "$go_lines" + echo "Error: $dockerfile does not use Go version $required_go_version exclusively." + exit 1 + else + echo "$dockerfile is using Go version $required_go_version." + fi +} + +# Check if the target Go version argument is provided. +if [ $# -eq 0 ]; then + echo "Usage: $0 " + exit 1 +fi + +target_go_version="$1" + +# File paths to be excluded from the check. +exception_list=( + # Exclude the tools Dockerfile as otherwise the linter may need to be + # considered every time the Go version is updated. + "./tools/Dockerfile" +) + +# is_exception checks if a file is in the exception list. +is_exception() { + local file="$1" + for exception in "${exception_list[@]}"; do + if [ "$file" == "$exception" ]; then + return 0 + fi + done + return 1 +} + +# Search for Dockerfiles in the current directory and its subdirectories. +dockerfiles=$(find . -type f -name "*.Dockerfile" -o -name "Dockerfile") + +# Check each Dockerfile +for file in $dockerfiles; do + # Skip the file if it is in the exception list. + if is_exception "$file"; then + echo "Skipping $file" + continue + fi + + check_go_version "$file" "$target_go_version" +done + +echo "All Dockerfiles pass the Go version check for Go version $target_go_version." diff --git a/scripts/check-go-version-yaml.sh b/scripts/check-go-version-yaml.sh new file mode 100755 index 0000000000..bd65ffa01e --- /dev/null +++ b/scripts/check-go-version-yaml.sh @@ -0,0 +1,75 @@ +#!/bin/bash + +# Function to check if the YAML file contains the specified Go version after +# field 'go:'. +check_go_version_yaml() { + local yamlfile="$1" + local required_go_version="$2" + + # Use grep to find lines with 'go:'. The grep exist status is ignored. + local go_lines=$(grep -i '^\s*go:\s*"[0-9]\+\.[0-9]\+\(\.[0-9]\+\)\?"' "$yamlfile" || true) + + # Check if any lines specify the Go version. + if [ -n "$go_lines" ]; then + # Extract the Go version from the file's lines. Example matching strings: + # go: "1.21.0" + local extracted_go_version=$(echo "$go_lines" | sed -n 's/.*go: "\([^"]*\)".*/\1/p') + + # Check if the extracted Go version matches the required version. + if [ "$extracted_go_version" != "$required_go_version" ]; then + echo "Error finding pattern 'go:': $yamlfile specifies Go version '$extracted_go_version', but required version is '$required_go_version'." + exit 1 + else + echo "$yamlfile specifies Go version $required_go_version." + fi + fi +} + +# Function to check if the YAML file contains the specified Go version after +# environment variable 'GO_VERSION:'. +check_go_version_env_variable() { + local yamlfile="$1" + local required_go_version="$2" + + # Use grep to find lines with 'GO_VERSION:'. The grep exist status is + # ignored. + local go_lines=$(grep -i 'GO_VERSION:' "$yamlfile" || true) + + # Check if any lines specify the Go version. + if [ -n "$go_lines" ]; then + # Extract the Go version from the file's lines. Example matching strings: + # GO_VERSION: "1.21.0" + # GO_VERSION: '1.21.0' + # GO_VERSION: 1.21.0 + # GO_VERSION:1.21.0 + # GO_VERSION:1.21.0 + local extracted_go_version=$(echo "$go_lines" | sed -n 's/.*GO_VERSION[: ]*["'\'']*\([0-9.]*\).*/\1/p') + + # Check if the extracted Go version matches the required version. + if [ "$extracted_go_version" != "$required_go_version" ]; then + echo "Error finding pattern 'GO_VERSION:': $yamlfile specifies Go version '$extracted_go_version', but required version is '$required_go_version'." + exit 1 + else + echo "$yamlfile specifies Go version $required_go_version." + fi + fi +} + +# Check if the target Go version argument is provided. +if [ $# -eq 0 ]; then + echo "Usage: $0 " + exit 1 +fi + +target_go_version="$1" + +# Search for YAML files in the current directory and its subdirectories. +yaml_files=$(find . -type f \( -name "*.yaml" -o -name "*.yml" \)) + +# Check each YAML file. +for file in $yaml_files; do + check_go_version_yaml "$file" "$target_go_version" + check_go_version_env_variable "$file" "$target_go_version" +done + +echo "All YAML files pass the Go version check for Go version $target_go_version."