update ci; update deps (show all smtp connection errors); migrate from make to just
This commit is contained in:
@@ -6,23 +6,23 @@ lint:
|
|||||||
stage: test
|
stage: test
|
||||||
image: registry.gitlab.com/etke.cc/base/build
|
image: registry.gitlab.com/etke.cc/base/build
|
||||||
script:
|
script:
|
||||||
- make lint
|
- just lint
|
||||||
|
|
||||||
unit:
|
unit:
|
||||||
stage: test
|
stage: test
|
||||||
image: registry.gitlab.com/etke.cc/base/build
|
image: registry.gitlab.com/etke.cc/base/build
|
||||||
script:
|
script:
|
||||||
- make test
|
- just test
|
||||||
|
|
||||||
docker:
|
docker:
|
||||||
stage: release
|
stage: release
|
||||||
only: ['main', 'tags']
|
only: ['main', 'tags']
|
||||||
services:
|
services:
|
||||||
- docker:dind
|
- 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:
|
before_script:
|
||||||
- apk --no-cache add make
|
- apk --no-cache add just
|
||||||
script:
|
script:
|
||||||
- make login docker
|
- just login docker
|
||||||
tags:
|
tags:
|
||||||
- docker
|
- docker
|
||||||
|
|||||||
55
Makefile
55
Makefile
@@ -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
2
go.mod
@@ -20,7 +20,7 @@ require (
|
|||||||
gitlab.com/etke.cc/go/logger v1.1.0
|
gitlab.com/etke.cc/go/logger v1.1.0
|
||||||
gitlab.com/etke.cc/go/mxidwc v1.0.0
|
gitlab.com/etke.cc/go/mxidwc v1.0.0
|
||||||
gitlab.com/etke.cc/go/secgen v1.1.1
|
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/go/validator v1.0.6
|
||||||
gitlab.com/etke.cc/linkpearl v0.0.0-20221116205701-65547c5608e6
|
gitlab.com/etke.cc/linkpearl v0.0.0-20221116205701-65547c5608e6
|
||||||
maunium.net/go/mautrix v0.12.3
|
maunium.net/go/mautrix v0.12.3
|
||||||
|
|||||||
4
go.sum
4
go.sum
@@ -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/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 h1:RmKOki725HIhWJHzPtAc9X4YvBneczndchpMgoDkE8w=
|
||||||
gitlab.com/etke.cc/go/secgen v1.1.1/go.mod h1:3pJqRGeWApzx7qXjABqz2o2SMCNpKSZao/gXVdasqE8=
|
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.1.1 h1:4mbkfsfipidG2eO8/zSozJ78Vv/lRAcdznvjK0fMVuo=
|
||||||
gitlab.com/etke.cc/go/trysmtp v1.0.0/go.mod h1:KqRuIB2IPElEEbAxXmFyKtm7S5YiuEb4lxwWthccqyE=
|
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 h1:w0Muxf9Pqw7xvF7NaaswE6d7r9U3nB2t2l5PnFMrecQ=
|
||||||
gitlab.com/etke.cc/go/validator v1.0.6/go.mod h1:Id0SxRj0J3IPhiKlj0w1plxVLZfHlkwipn7HfRZsDts=
|
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=
|
gitlab.com/etke.cc/linkpearl v0.0.0-20221116205701-65547c5608e6 h1:+HDT2/bx3Hug++aeDE/PaoRRcnKdYzEm6i2RlOAzPXo=
|
||||||
|
|||||||
44
justfile
Normal file
44
justfile
Normal 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 }} .
|
||||||
58
vendor/gitlab.com/etke.cc/go/trysmtp/client.go
generated
vendored
58
vendor/gitlab.com/etke.cc/go/trysmtp/client.go
generated
vendored
@@ -35,17 +35,37 @@ func Connect(from, to string) (*smtp.Client, error) {
|
|||||||
return client, nil
|
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) {
|
func initClient(localname, hostname string) (*smtp.Client, error) {
|
||||||
mxs, err := net.LookupMX(hostname)
|
mxs, err := net.LookupMX(hostname)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cerrs := []error{}
|
||||||
|
var client *smtp.Client
|
||||||
for _, mx := range mxs {
|
for _, mx := range mxs {
|
||||||
for _, addr := range SMTPAddrs {
|
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 {
|
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.
|
// we're supposed to try talking directly to the host.
|
||||||
if len(mxs) == 0 {
|
if len(mxs) == 0 {
|
||||||
for _, addr := range SMTPAddrs {
|
for _, addr := range SMTPAddrs {
|
||||||
client := trySMTP(localname, hostname, addr)
|
client, err = trySMTP(localname, hostname, addr)
|
||||||
if client != nil {
|
|
||||||
return client, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, fmt.Errorf("target SMTP server not found")
|
|
||||||
}
|
|
||||||
|
|
||||||
func trySMTP(localname, mxhost, addr string) *smtp.Client {
|
|
||||||
conn, err := smtp.Dial(mxhost + addr)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
cerrs = append(cerrs, err)
|
||||||
|
}
|
||||||
|
if client != nil {
|
||||||
|
return client, unwrapErrors(cerrs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, unwrapErrors(cerrs)
|
||||||
|
}
|
||||||
|
|
||||||
|
func trySMTP(localname, mxhost, addr string) (*smtp.Client, error) {
|
||||||
|
target := mxhost + addr
|
||||||
|
conn, err := smtp.Dial(target)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("%s: %w", target, err)
|
||||||
}
|
}
|
||||||
err = conn.Hello(localname)
|
err = conn.Hello(localname)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil, fmt.Errorf("%s: %w", target, err)
|
||||||
}
|
}
|
||||||
if ok, _ := conn.Extension("STARTTLS"); ok {
|
if ok, _ := conn.Extension("STARTTLS"); ok {
|
||||||
config := &tls.Config{ServerName: mxhost}
|
config := &tls.Config{ServerName: mxhost}
|
||||||
conn.StartTLS(config) //nolint:errcheck // if it doesn't work - we can't do anything anyway
|
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
4
vendor/modules.txt
vendored
@@ -134,8 +134,8 @@ gitlab.com/etke.cc/go/mxidwc
|
|||||||
# gitlab.com/etke.cc/go/secgen v1.1.1
|
# gitlab.com/etke.cc/go/secgen v1.1.1
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
gitlab.com/etke.cc/go/secgen
|
gitlab.com/etke.cc/go/secgen
|
||||||
# gitlab.com/etke.cc/go/trysmtp v1.0.0
|
# gitlab.com/etke.cc/go/trysmtp v1.1.1
|
||||||
## explicit; go 1.18
|
## explicit; go 1.17
|
||||||
gitlab.com/etke.cc/go/trysmtp
|
gitlab.com/etke.cc/go/trysmtp
|
||||||
# gitlab.com/etke.cc/go/validator v1.0.6
|
# gitlab.com/etke.cc/go/validator v1.0.6
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
|
|||||||
Reference in New Issue
Block a user