WIP
This commit is contained in:
parent
791f0cd4fa
commit
545540cea9
9 changed files with 5 additions and 262 deletions
|
@ -11,8 +11,8 @@ check:
|
||||||
- golangci-lint run --build-tags private,solution ./...
|
- golangci-lint run --build-tags private,solution ./...
|
||||||
#- go test -v -tags private,solution ./...
|
#- go test -v -tags private,solution ./...
|
||||||
#- go test -v -race -tags private,solution ./...
|
#- go test -v -race -tags private,solution ./...
|
||||||
- sudo -u nobody HOME=/tmp PATH=$PATH /usr/local/go/bin/go test $(go list -tags private,solution ./... | grep -v /dockertest | grep -v /foolsday3) -tags private,solution -v ./...
|
- sudo -u nobody HOME=/tmp PATH=$PATH /usr/local/go/bin/go test -tags private,solution ./...
|
||||||
- sudo -u nobody HOME=/tmp PATH=$PATH /usr/local/go/bin/go test $(go list -tags private,solution ./... | grep -v /dockertest) -tags private,solution -v -race ./...
|
- sudo -u nobody HOME=/tmp PATH=$PATH /usr/local/go/bin/go test -tags private,solution -race ./...
|
||||||
|
|
||||||
rebuild-base-image:
|
rebuild-base-image:
|
||||||
tags:
|
tags:
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
package blowfish
|
package blowfish
|
||||||
|
|
||||||
// #cgo pkg-config: libcrypto
|
// #cgo pkg-config: libcrypto
|
||||||
|
// #cgo CFLAGS: -Wno-deprecated-declarations
|
||||||
// #include <openssl/blowfish.h>
|
// #include <openssl/blowfish.h>
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
FROM golang:1.18
|
FROM golang:1.20
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y \
|
RUN apt-get update && apt-get install -y \
|
||||||
rsync libssl-dev postgresql sudo redis-server \
|
rsync libssl-dev postgresql sudo redis-server \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.46.0
|
RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.46.0
|
||||||
RUN curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
|
||||||
RUN chmod +x /usr/local/bin/docker-compose
|
|
||||||
RUN curl -fsSL https://get.docker.com | sh
|
|
||||||
|
|
|
@ -1,106 +0,0 @@
|
||||||
## dockertest
|
|
||||||
|
|
||||||
Это не настоящая задача, а заготовка на будущее.
|
|
||||||
|
|
||||||
### Что нужно сделать?
|
|
||||||
|
|
||||||
Установить docker и добиться успешного **локального** запуска тестов
|
|
||||||
```
|
|
||||||
go test -v ./dockertest/... -count=1
|
|
||||||
```
|
|
||||||
|
|
||||||
### С чего начать?
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><b> Дополнительные шаги для Windows 10</b></summary>
|
|
||||||
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
1. Установить WSL2 по [инструкции от Microsoft](https://docs.microsoft.com/en-us/windows/wsl/install-win10). <br/>
|
|
||||||
**Важно:** нужна именно вторая версия **WSL2**, проверьте, что она совместима с вашей системой. <br/>
|
|
||||||
Если шаг 5 не работает, включите опцию `Windows Hypervisor Platform` (Settings -> Apps -> Apps & features -> Optional features -> More Windows Features -> включить чекбокс Windows Hypervisor Platform).
|
|
||||||
|
|
||||||
2. Установите Docker Desktop по [инструкции](https://docs.docker.com/docker-for-windows/wsl/#download). Вероятно, выполнять шаги по активации поддержки WSL не потребуется, все подключится автоматически.
|
|
||||||
|
|
||||||
3. Запустите Docker Desktop (никакие контейнеры запускать не надо, только если хотите убедиться в том, что все работает). <br/>
|
|
||||||
Запустите установленную в п.1 Linux OS через WSL2. <br/>
|
|
||||||
Далее используйте этот Linux для выполнения дальнейших шагов этого README.
|
|
||||||
|
|
||||||
_Замечание_: запущенный, но уже не использующийся Docker Desktop с бекэндом WSL занимает впустую много оперативной памяти, см [issue](https://github.com/microsoft/WSL/issues/4166) - можно ограничить максимальный доступный ему объем (см. [workaround](https://github.com/microsoft/WSL/issues/4166#issuecomment-526725261)), либо отключить автозапуск Docker Desktop и останавливать сервис, когда вы его не используете.
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
#### Установить docker
|
|
||||||
|
|
||||||
https://docs.docker.com/engine/install/
|
|
||||||
|
|
||||||
После стандартной процедуры установки на Linux будет создана группа `docker`.
|
|
||||||
Чтобы использовать docker cli без sudo, нужно добавить себя в эту группу:
|
|
||||||
```
|
|
||||||
sudo groupadd docker
|
|
||||||
sudo usermod -aG docker $USER
|
|
||||||
```
|
|
||||||
После этого разлогиньтесь из os и залогиньтесь заново (или перезапустите систему).
|
|
||||||
|
|
||||||
Для проверки можно запустить
|
|
||||||
```
|
|
||||||
docker run hello-world
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Установить docker-compose
|
|
||||||
|
|
||||||
https://docs.docker.com/compose/install/
|
|
||||||
|
|
||||||
#### Запустить контейнеры не через тесты
|
|
||||||
|
|
||||||
В директории `dockertest` выполнить
|
|
||||||
```
|
|
||||||
docker-compose up
|
|
||||||
```
|
|
||||||
|
|
||||||
### Что делать, если сразу не заработало?
|
|
||||||
|
|
||||||
Поискать решение проблемы в интернете.
|
|
||||||
|
|
||||||
Если решение найдено и проблема выглядит общей, сделать merge request с улучшением README.
|
|
||||||
|
|
||||||
Если интернет не помог, спросить в чате.
|
|
||||||
|
|
||||||
### docker-compose cheat sheet
|
|
||||||
|
|
||||||
Запустить все контейнеры в daemon режиме пересобрав образы:
|
|
||||||
```
|
|
||||||
docker-compose up -d --build
|
|
||||||
```
|
|
||||||
|
|
||||||
Остановить все контейнеры:
|
|
||||||
```
|
|
||||||
docker-compose down
|
|
||||||
```
|
|
||||||
|
|
||||||
### Docker cheat sheet
|
|
||||||
|
|
||||||
Получить список образов:
|
|
||||||
```
|
|
||||||
docker images
|
|
||||||
```
|
|
||||||
|
|
||||||
Список всех контейнеров:
|
|
||||||
```
|
|
||||||
docker ps -a
|
|
||||||
```
|
|
||||||
|
|
||||||
Остановить контейнер:
|
|
||||||
```
|
|
||||||
docker stop <NAME>
|
|
||||||
```
|
|
||||||
|
|
||||||
Удалить контейнер:
|
|
||||||
```
|
|
||||||
docker rm <NAME>
|
|
||||||
```
|
|
||||||
|
|
||||||
Удалить образ:
|
|
||||||
```
|
|
||||||
docker rmi <NAME>
|
|
||||||
```
|
|
|
@ -1,30 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
pg:
|
|
||||||
build: ./postgres/
|
|
||||||
environment:
|
|
||||||
POSTGRES_DB: test
|
|
||||||
POSTGRES_USER: gopher
|
|
||||||
POSTGRES_PASSWORD: pass
|
|
||||||
ports:
|
|
||||||
- 5432:5432
|
|
||||||
|
|
||||||
redis:
|
|
||||||
image: "redis:alpine"
|
|
||||||
hostname: redis
|
|
||||||
ports:
|
|
||||||
- "6379:6379"
|
|
||||||
|
|
||||||
prometheus:
|
|
||||||
image: prom/prometheus:latest
|
|
||||||
ports:
|
|
||||||
- 9090:9090
|
|
||||||
|
|
||||||
grafana:
|
|
||||||
image: grafana/grafana:latest
|
|
||||||
environment:
|
|
||||||
- GF_SECURITY_ADMIN_USER=gopher
|
|
||||||
- GF_SECURITY_ADMIN_PASSWORD=pass
|
|
||||||
- GF_USERS_ALLOW_SIGN_UP=false
|
|
||||||
ports:
|
|
||||||
- 3000:3000
|
|
|
@ -1,109 +0,0 @@
|
||||||
package dockertest
|
|
||||||
|
|
||||||
import (
|
|
||||||
"database/sql"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"net"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/cenkalti/backoff"
|
|
||||||
"github.com/go-redis/redis"
|
|
||||||
"github.com/google/uuid"
|
|
||||||
_ "github.com/lib/pq"
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
tc "github.com/testcontainers/testcontainers-go"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
postgresDB *sql.DB
|
|
||||||
redisDB *redis.Client
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestMain(m *testing.M) {
|
|
||||||
path := "./docker-compose.yaml"
|
|
||||||
compose, err := StartDockerCompose(path)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
host := os.Getenv("APP_HOST")
|
|
||||||
if err = Retry(func() error {
|
|
||||||
postgresDB, err = sql.Open("postgres", fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable", "gopher", "pass", host, "5432", "test"))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return postgresDB.Ping()
|
|
||||||
}); err != nil {
|
|
||||||
log.Fatalf("could not connect to postgres: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = Retry(func() error {
|
|
||||||
redisDB = redis.NewClient(&redis.Options{
|
|
||||||
Addr: net.JoinHostPort(host, "6379"),
|
|
||||||
})
|
|
||||||
|
|
||||||
return redisDB.Ping().Err()
|
|
||||||
}); err != nil {
|
|
||||||
log.Fatalf("could not connect to redis: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
code := m.Run()
|
|
||||||
|
|
||||||
if err := compose.Down().Error; err != nil {
|
|
||||||
log.Fatalf("could not stop containers from %v: %v", path, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
os.Exit(code)
|
|
||||||
}
|
|
||||||
|
|
||||||
func StartDockerCompose(paths ...string) (*tc.LocalDockerCompose, error) {
|
|
||||||
id := strings.ToLower(uuid.New().String())
|
|
||||||
|
|
||||||
compose := tc.NewLocalDockerCompose(paths, id)
|
|
||||||
execError := compose.
|
|
||||||
WithCommand([]string{"up", "-d"}).
|
|
||||||
Invoke()
|
|
||||||
|
|
||||||
err := execError.Error
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("could not start containers from %v: %v", paths, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return compose, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Retry(f func() error) error {
|
|
||||||
b := backoff.NewExponentialBackOff()
|
|
||||||
b.MaxInterval = time.Second * 5
|
|
||||||
b.MaxElapsedTime = time.Minute
|
|
||||||
|
|
||||||
return backoff.Retry(f, b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPostgres(t *testing.T) {
|
|
||||||
rows, err := postgresDB.Query(`SELECT table_name
|
|
||||||
FROM information_schema.tables
|
|
||||||
WHERE table_schema = 'public'
|
|
||||||
`)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
var table string
|
|
||||||
for rows.Next() {
|
|
||||||
err := rows.Scan(&table)
|
|
||||||
require.NoError(t, err)
|
|
||||||
t.Logf("table: %s", table)
|
|
||||||
}
|
|
||||||
|
|
||||||
require.NoError(t, rows.Err())
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestRedis(t *testing.T) {
|
|
||||||
cmd := redisDB.ClientList()
|
|
||||||
require.NoError(t, cmd.Err())
|
|
||||||
|
|
||||||
t.Logf("value: %v", cmd.Val())
|
|
||||||
}
|
|
|
@ -1,3 +0,0 @@
|
||||||
FROM postgres:latest
|
|
||||||
|
|
||||||
COPY init.sql /docker-entrypoint-initdb.d/10-init.sql
|
|
|
@ -1,7 +0,0 @@
|
||||||
create table Role(
|
|
||||||
RoleID SERIAL PRIMARY KEY,
|
|
||||||
RoleName varchar(50)
|
|
||||||
);
|
|
||||||
|
|
||||||
insert into Role(RoleName)
|
|
||||||
values ('Admin'),('User');
|
|
|
@ -15,5 +15,5 @@ func NoContext(ctx context.Context, db *sql.DB) {
|
||||||
defer c.Close()
|
defer c.Close()
|
||||||
|
|
||||||
// Потенциально вечный Ping
|
// Потенциально вечный Ping
|
||||||
_ = c.Ping()
|
_ = db.Ping()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue