update ci; update deps (show all smtp connection errors); migrate from make to just

This commit is contained in:
Aine
2023-02-11 20:49:45 +02:00
parent 12d2fee2d4
commit dc82d97aaa
7 changed files with 88 additions and 75 deletions

View File

@@ -6,23 +6,23 @@ lint:
stage: test
image: registry.gitlab.com/etke.cc/base/build
script:
- make lint
- just lint
unit:
stage: test
image: registry.gitlab.com/etke.cc/base/build
script:
- make test
- just test
docker:
stage: release
only: ['main', 'tags']
services:
- docker:dind
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/jdrouet/docker-with-buildx:stable
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/jdrouet/docker-with-buildx:latest
before_script:
- apk --no-cache add make
- apk --no-cache add just
script:
- make login docker
- just login docker
tags:
- docker

View File

@@ -1,55 +0,0 @@
### CI vars
CI_LOGIN_COMMAND = @echo "Not a CI, skip login"
CI_REGISTRY_IMAGE ?= registry.gitlab.com/etke.cc/postmoogle
REGISTRY_IMAGE ?= registry.etke.cc/etke.cc/postmoogle
CI_COMMIT_TAG ?= latest
# for main branch it must be set explicitly
ifeq ($(CI_COMMIT_TAG), main)
CI_COMMIT_TAG = latest
endif
# login command
ifdef CI_JOB_TOKEN
CI_LOGIN_COMMAND = @docker login -u gitlab-ci-token -p $(CI_JOB_TOKEN) $(CI_REGISTRY)
endif
# update go dependencies
update:
go get ./cmd
go mod tidy
go mod verify
go mod vendor
mock:
-@rm -rf mocks
@mockery --all
# run linter
lint:
golangci-lint run ./...
# run linter and fix issues if possible
lintfix:
golangci-lint run --fix ./...
# run unit tests
test:
@go test -coverprofile=cover.out ./...
@go tool cover -func=cover.out
-@rm -f cover.out
# note: make doesn't understand exit code 130 and sets it == 1
run:
@go run ./cmd || exit 0
build:
go build -v -o postmoogle ./cmd
# CI: docker login
login:
@echo "trying to login to docker registry..."
$(CI_LOGIN_COMMAND)
# docker build
docker:
docker buildx create --use
docker buildx build --platform linux/arm64/v8,linux/amd64 --push -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG} -t ${REGISTRY_IMAGE}:${CI_COMMIT_TAG} .

2
go.mod
View File

@@ -20,7 +20,7 @@ require (
gitlab.com/etke.cc/go/logger v1.1.0
gitlab.com/etke.cc/go/mxidwc v1.0.0
gitlab.com/etke.cc/go/secgen v1.1.1
gitlab.com/etke.cc/go/trysmtp v1.0.0
gitlab.com/etke.cc/go/trysmtp v1.1.1
gitlab.com/etke.cc/go/validator v1.0.6
gitlab.com/etke.cc/linkpearl v0.0.0-20221116205701-65547c5608e6
maunium.net/go/mautrix v0.12.3

4
go.sum
View File

@@ -103,8 +103,8 @@ gitlab.com/etke.cc/go/mxidwc v1.0.0 h1:6EAlJXvs3nU4RaMegYq6iFlyVvLw7JZYnZmNCGMYQ
gitlab.com/etke.cc/go/mxidwc v1.0.0/go.mod h1:E/0kh45SAN9+ntTG0cwkAEKdaPxzvxVmnjwivm9nmz8=
gitlab.com/etke.cc/go/secgen v1.1.1 h1:RmKOki725HIhWJHzPtAc9X4YvBneczndchpMgoDkE8w=
gitlab.com/etke.cc/go/secgen v1.1.1/go.mod h1:3pJqRGeWApzx7qXjABqz2o2SMCNpKSZao/gXVdasqE8=
gitlab.com/etke.cc/go/trysmtp v1.0.0 h1:f/7gSmzohKniVeLSLevI+ZsySYcPUGkT9cRlOTwjOr8=
gitlab.com/etke.cc/go/trysmtp v1.0.0/go.mod h1:KqRuIB2IPElEEbAxXmFyKtm7S5YiuEb4lxwWthccqyE=
gitlab.com/etke.cc/go/trysmtp v1.1.1 h1:4mbkfsfipidG2eO8/zSozJ78Vv/lRAcdznvjK0fMVuo=
gitlab.com/etke.cc/go/trysmtp v1.1.1/go.mod h1:lOO7tTdAE0a3ETV3wN3GJ7I1Tqewu7YTpPWaOmTteV0=
gitlab.com/etke.cc/go/validator v1.0.6 h1:w0Muxf9Pqw7xvF7NaaswE6d7r9U3nB2t2l5PnFMrecQ=
gitlab.com/etke.cc/go/validator v1.0.6/go.mod h1:Id0SxRj0J3IPhiKlj0w1plxVLZfHlkwipn7HfRZsDts=
gitlab.com/etke.cc/linkpearl v0.0.0-20221116205701-65547c5608e6 h1:+HDT2/bx3Hug++aeDE/PaoRRcnKdYzEm6i2RlOAzPXo=

44
justfile Normal file
View File

@@ -0,0 +1,44 @@
CI_REGISTRY_IMAGE := env_var_or_default("CI_REGISTRY_IMAGE", "registry.gitlab.com/etke.cc/postmoogle")
REGISTRY_IMAGE := env_var_or_default("REGISTRY_IMAGE", "registry.etke.cc/etke.cc/postmoogle")
CI_COMMIT_TAG := if env_var_or_default("CI_COMMIT_TAG", "main") == "main" { "latest" } else { env_var_or_default("CI_COMMIT_TAG", "latest") }
# show help by default
default:
@just --list --justfile {{ justfile() }}
# update go deps
update:
go get ./cmd
go mod tidy
go mod vendor
# run linter
lint:
golangci-lint run ./...
# automatically fix liter issues
lintfix:
golangci-lint run --fix ./...
# run unit tests
test:
@go test -coverprofile=cover.out ./...
@go tool cover -func=cover.out
-@rm -f cover.out
# run app
run:
@go run ./cmd
# build app
build:
go build -v -o postmoogle ./cmd
# docker login
login:
@docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
# docker build
docker:
docker buildx create --use
docker buildx build --platform linux/arm64/v8,linux/amd64 --push -t {{ CI_REGISTRY_IMAGE }}:{{ CI_COMMIT_TAG }} -t {{ REGISTRY_IMAGE }}:{{ CI_COMMIT_TAG }} .

View File

@@ -35,17 +35,37 @@ func Connect(from, to string) (*smtp.Client, error) {
return client, nil
}
func unwrapErrors(errs []error) error {
if len(errs) == 0 {
return nil
}
tokens := strings.Repeat("%v; ", len(errs))
// make it compatible with < 1.18
ierrs := make([]interface{}, len(errs))
for _, err := range errs {
ierrs = append(ierrs, err)
}
return fmt.Errorf(tokens, ierrs...)
}
func initClient(localname, hostname string) (*smtp.Client, error) {
mxs, err := net.LookupMX(hostname)
if err != nil {
return nil, err
}
cerrs := []error{}
var client *smtp.Client
for _, mx := range mxs {
for _, addr := range SMTPAddrs {
client := trySMTP(localname, strings.TrimSuffix(mx.Host, "."), addr)
client, err = trySMTP(localname, strings.TrimSuffix(mx.Host, "."), addr)
if err != nil {
cerrs = append(cerrs, err)
}
if client != nil {
return client, nil
return client, unwrapErrors(cerrs)
}
}
}
@@ -54,29 +74,33 @@ func initClient(localname, hostname string) (*smtp.Client, error) {
// we're supposed to try talking directly to the host.
if len(mxs) == 0 {
for _, addr := range SMTPAddrs {
client := trySMTP(localname, hostname, addr)
client, err = trySMTP(localname, hostname, addr)
if err != nil {
cerrs = append(cerrs, err)
}
if client != nil {
return client, nil
return client, unwrapErrors(cerrs)
}
}
}
return nil, fmt.Errorf("target SMTP server not found")
return nil, unwrapErrors(cerrs)
}
func trySMTP(localname, mxhost, addr string) *smtp.Client {
conn, err := smtp.Dial(mxhost + addr)
func trySMTP(localname, mxhost, addr string) (*smtp.Client, error) {
target := mxhost + addr
conn, err := smtp.Dial(target)
if err != nil {
return nil
return nil, fmt.Errorf("%s: %w", target, err)
}
err = conn.Hello(localname)
if err != nil {
return nil
return nil, fmt.Errorf("%s: %w", target, err)
}
if ok, _ := conn.Extension("STARTTLS"); ok {
config := &tls.Config{ServerName: mxhost}
conn.StartTLS(config) //nolint:errcheck // if it doesn't work - we can't do anything anyway
}
return conn
return conn, nil
}

4
vendor/modules.txt vendored
View File

@@ -134,8 +134,8 @@ gitlab.com/etke.cc/go/mxidwc
# gitlab.com/etke.cc/go/secgen v1.1.1
## explicit; go 1.19
gitlab.com/etke.cc/go/secgen
# gitlab.com/etke.cc/go/trysmtp v1.0.0
## explicit; go 1.18
# gitlab.com/etke.cc/go/trysmtp v1.1.1
## explicit; go 1.17
gitlab.com/etke.cc/go/trysmtp
# gitlab.com/etke.cc/go/validator v1.0.6
## explicit; go 1.18