Поднятие Docker контейнеров в тестах с Go и Dockertest
Поднятие Docker контейнеров в тестах с Go и Dockertest
Для запуска интеграционных тестов в Golang часто требуются внешние зависимости в виде базы данных, брокера сообщений либо еще каких-то сторонних компонентов.В итоге для поднятия внешних сервисов мы используем Docker и пишем docker-compose.yml файл который выглядит как-то так:
version: '3'
services:
db:
image: postgres:10.6-alpine
ports:
- '5432'
environment:
LC_ALL: C.UTF-8
POSTGRES_DB: test
POSTGRES_USER: test
POSTGRES_PASSWORD: pass
Далее до запуска go test мы делаем docker-compose up -d.
Получение обновленного kubeconfig в DigitalOcean
Получение обновленного kubeconfig в DigitalOcean
Доступ к Kubernetes в DigitalOcean лимитирован одной неделей, получается каждую неделю нужно получать новый пароль доступа к кластеру. Скачать обновленный kubeconfig можно через консоль в DigitalOcean либо можно воспользоваться командой ниже:
curl -X GET "https://api.digitalocean.com/v2/kubernetes/clusters/<cluster-id>/kubeconfig" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $DO_TOKEN" -o ~/.kube/config
Для работы требуется действующий DigitalOcean токен, который можно получить в разделе API.
Поднятие прокси-сервера Squid при помощи Docker за 3 минуты
Поднятие прокси-сервера Squid при помощи Docker за 3 минуты
Squid — это мощный кеширующий прокси-сервер для протоколов HTTP, HTTPS и FTP. Он помогает ускорить доступ к веб-ресурсам, снижает нагрузку на канал и может использоваться для фильтрации трафика.
В этой статье мы развернём Squid в Docker-контейнере и настроим его работу.
Шаг 1: Создание конфигурационного файла
Создадим файл squid.conf с базовыми настройками:
Скрипт парсинга курсов Bestchange
Скрипт парсинга курсов Bestchange
Скрипт проводит выборку курсов по заданным входным параметрам и может выдавать готовую json структуру по заданным направлениям. Выборка курсов производится через публичный API и содержит в себе всю необходимую информацию по лучшим курсам и параметрам обменных пунктов:
- Минимальная цена заявки
- Максимальная цена заявки
- Курс
- Резервы
- Отзывы (Положительные — Отрицательные)
- Название обменного пункта
Пример работы скрипта:
Golang — использование envconfig для environment variables
Golang — использование envconfig для environment variables
Для работы с переменными окружения в Golang без использования библиотеки envconfig просто не обойтись:
//AppConfig struct to manage configuration env vars
type AppConfig struct {
DBHost string `envconfig:"DB_HOST" required:"true"`
DBPort int `envconfig:"DB_PORT" required:"true"`
DBUser string `envconfig:"DB_USER" required:"true"`
DBName string `envconfig:"DB_NAME" required:"true"`
DBPassword string `envconfig:"DB_PASSWORD" required:"true"`
}
...
// and let's use it in our main func:
var cfg AppConfig
err := envconfig.Process("myApp", &cfg)
if err != nil {
return nil, err
}
// finally, let's use our app configuration
fmt.Println(cfg.DBHost)
Библиотека также поддерживает default значения, required флаги, custom декодеры и многое многое другое.
Golang sqlmock db tests — SELECT тесты
Golang sqlmock db tests — SELECT тесты
func TestFindAll(t *testing.T) {
dbMock, mock, err := sqlmock.New()
if err != nil {
t.Errorf("An error '%s' was not expected when opening a stub database connection", err)
}
defer dbMock.Close()
columns := []string{"id", "date", "name", "code"}
expectedData := Data{
Id: 1,
Date: time.Time{},
Name: "Name",
Code: "Code",
}
dbConn := sqlx.NewDb(dbMock, "")
mock.ExpectQuery(`SELECT id,date,name,code FROM datas ORDER BY name ASC`).
WillReturnRows(sqlmock.NewRows(columns).AddRow(expectedData.Id, expectedData.Date, expectedData.Name, expectedData.Code))
r := NewRepository(dbConn)
currencies, err := r.FindAll()
assert.NoError(t, err)
if err := mock.ExpectationsWereMet(); err != nil {
t.Error(err)
}
expectedListOfDatas := []*Currency{&expectedData}
assert.Equal(t, expectedListOfDatas, datas)
}
Docker — сохранить image в tar
Docker — сохранить image в tar
Для сохранения image в tar контейнер достаточно выполнить:
docker save my_image > my_image.tar
Теперь мы можем спокойно переносить docker image и далее «загружать» image:
docker load <input_path>/my_image.tar
Golang — Mock для sqlx драйвера базы данных
Golang — Mock для sqlx драйвера базы данных
Для написания юнит тестов часто требуется «мокать» часть зависимостей, одна из самых распространенных — соединение и операции с базой данных. Если нет возможности использовать внедрение зависимости и использовать интерфейсы типа ExecerContext на входе функции то в дело вступают не совсем чистые хаки в виде Monkey patching.
Полезные curl для Digital Ocean API
Полезные curl для Digital Ocean API
При автоматизации инфраструктуры под Terraform понадобилось найти id SSH ключей и типы дроплетов чтобы их было возможно использовать в конфигурации. Делюсь примерами curl запросов к Digital Ocean API (статья будет дополняться со временем).
- Вывод SSH id keys, привязанных к аккаунту:
curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $DIGITALOCEAN_TOKEN" "https://api.digitalocean.com/v2/account/keys" | jq
- Вывод всех типов дроплетов:
curl -X GET "https://api.digitalocean.com/v2/images?per_page=999" -H "Authorization: Bearer $DIGITALOCEAN_TOKEN" | jq
Поскольку вывод получается слишком большим можно воспользоваться сохранением ответа в файл:
GitHub API — пара полезных curl примеров
GitHub API — пара полезных curl примеров
Список команд в организации:
curl GET --url 'https://api.github.com/orgs/<organization-name>/teams?access_token=<TOKEN>’
Работа с GitHub Status API, установка badge для Pull Request:
curl -d '{"state": "success","target_url": "https://example.com/build/status","description": "The build succeeded!","context": "continuous-integration/jenkins"}' -H "Content-Type: application/json" -X POST "https://api.github.com/repos/<organization-name>/<project-name>/statuses/<sha-of-the-commit>?access_token=<github-token>”
Данный сниппет может быть использован для установки badges на определенном pull request.
При возникновении новых интересных запросов данный пост будет пополняться.