Skip to content
This repository has been archived by the owner on Mar 24, 2024. It is now read-only.

Iter 23-24

Iter 23-24 #68

Workflow file for this run

name: autotests
on:
pull_request:
push:
branches:
- main
jobs:
devopstest:
runs-on: ubuntu-latest
container: golang:1.19
services:
postgres:
image: postgres
env:
POSTGRES_PASSWORD: postgres
POSTGRES_DB: praktikum
options: >-
--health-cmd pg_isready
--health-interval 5s
--health-timeout 5s
--health-retries 5
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Download autotests binaries
uses: robinraju/release-downloader@v1.2
with:
repository: Yandex-Practicum/go-autotests
latest: true
fileName: "*"
out-file-path: .tools
- name: Setup autotest binary
run: |
chmod -R +x $GITHUB_WORKSPACE/.tools
mv $GITHUB_WORKSPACE/.tools/devopstest /usr/local/bin/devopstest
mv $GITHUB_WORKSPACE/.tools/random /usr/local/bin/random
- name: Build agent binary
run: |
cd cmd/agent
go build -buildvcs=false -o agent
- name: Generate RSA keys
run: |
make keys
# Соглашение:
# Во всех заданиях, нужно обрабатывать все пограничные случаи и негатив-кейсы.
# По ходу продвижения по инкрементам, тесты становятся строже.
# Темплейты могут обновляться, добавляя все более строгие проверки.
# I. Задание к первому инкременту.
# Разработать агент по сбору рантайм метрик и их последующей отправке на сервер по протоколу http.
# Разработку необходимо вести с использованием шаблона https://github.com/yandex-praktikum/go-musthave-devops-tpl.git
# Агент должен собирать метрики двух типов:
# * gauge, тип float64
# * counter, тип int64
# В качестве источника метрик использовать пакет runtime. Собирать следующие метрики:
# * Имя метрики: "Alloc", тип: gauge
# * Имя метрики: "BuckHashSys", тип: gauge
# * Имя метрики: "Frees", тип: gauge
# * Имя метрики: "GCCPUFraction", тип: gauge
# * Имя метрики: "GCSys", тип: gauge
# * Имя метрики: "HeapAlloc", тип: gauge
# * Имя метрики: "HeapIdle", тип: gauge
# * Имя метрики: "HeapInuse", тип: gauge
# * Имя метрики: "HeapObjects", тип: gauge
# * Имя метрики: "HeapReleased", тип: gauge
# * Имя метрики: "HeapSys", тип: gauge
# * Имя метрики: "LastGC", тип: gauge
# * Имя метрики: "Lookups", тип: gauge
# * Имя метрики: "MCacheInuse", тип: gauge
# * Имя метрики: "MCacheSys", тип: gauge
# * Имя метрики: "MSpanInuse", тип: gauge
# * Имя метрики: "MSpanSys", тип: gauge
# * Имя метрики: "Mallocs", тип: gauge
# * Имя метрики: "NextGC", тип: gauge
# * Имя метрики: "NumForcedGC", тип: gauge
# * Имя метрики: "NumGC", тип: gauge
# * Имя метрики: "OtherSys", тип: gauge
# * Имя метрики: "PauseTotalNs", тип: gauge
# * Имя метрики: "StackInuse", тип: gauge
# * Имя метрики: "StackSys", тип: gauge
# * Имя метрики: "Sys", тип: gauge
# * Имя метрики: "TotalAlloc", тип: gauge
# К метрикам пакета runtime, добавить метрики:
# * Имя метрики: "PollCount", тип: counter - счетчик, увеличивающийся на 1, при каждом обновлении метрики из пакета runtime (на каждый pollInterval - см. ниже)
# * Имя метрики: "RandomValue", тип: gauge - обновляемое рандомное значение
# По умолчанию, приложение должно обновлять метрики из пакета runtime с заданной частотой:
# pollInterval - 2 секунды
# По умолчанию, приложение должно отправлять метрики на сервер с заданной частотой:
# reportInterval - 10 секунд
# Метрики отправлять по протоколу http, методом POST:
# * по умолчанию на адрес: 127.0.0.1, порт: 8080
# * в формате: "http://<АДРЕС_СЕРВЕРА>/update/<ТИП_МЕТРИКИ>/<ИМЯ_МЕТРИКИ>/<ЗНАЧЕНИЕ_МЕТРИКИ>"
# * application-type: "text/plain"
# Агент должен штатно завершаться по сигналам: syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT
- name: "Code increment #1"
if: |
github.ref == 'refs/heads/main' ||
github.head_ref == 'iter1' ||
github.head_ref == 'iter2' ||
github.head_ref == 'iter3' ||
github.head_ref == 'iter4' ||
github.head_ref == 'iter5' ||
github.head_ref == 'iter6' ||
github.head_ref == 'iter7' ||
github.head_ref == 'iter8' ||
github.head_ref == 'iter9' ||
github.head_ref == 'iter10' ||
github.head_ref == 'iter11' ||
github.head_ref == 'iter12' ||
github.head_ref == 'iter13' ||
github.head_ref == 'iter14' ||
github.head_ref == 'iter15' ||
github.head_ref == 'iter16' ||
github.head_ref == 'iter17' ||
github.head_ref == 'iter18' ||
github.head_ref == 'iter19' ||
github.head_ref == 'iter20' ||
github.head_ref == 'iter21' ||
github.head_ref == 'iter22' ||
github.head_ref == 'iter23' ||
github.head_ref == 'iter24'
run: |
devopstest -test.v -test.run=^TestIteration1$ \
-agent-binary-path=cmd/agent/agent
- name: Build server binary
run: |
cd cmd/server
go build -buildvcs=false -o server
# II. Задание ко второму инкременту.
# Разработать сервер по сбору рантайм метрик, который собирает репорты от агентов по протоколу http.
# Разработку следует продолжать в ранее используемом репозитории (с предыдущими инкрементами), однако сервер стоит размещать по своему пути: cmd/server/
# Сервер должен собирать и хранить произвольные метрики двух типов:
# * gauge, тип float64, новое значение должно замещать предыдущее.
# * counter, тип int64, новое значение должно добавляться к предыдущему (если оно ранее уже было известно серверу).
# Метрики принимаются сервером по протоколу http, методом POST:
# * по умолчанию открывать порт: 8080, на адресе: 127.0.0.1
# * в формате: "http://<АДРЕС_СЕРВЕРА>/update/<ТИП_МЕТРИКИ>/<ИМЯ_МЕТРИКИ>/<ЗНАЧЕНИЕ_МЕТРИКИ>"
# * application-type: "text/plain"
# * при успешном приеме, возвращать статус: http.StatusOK
# Сервер должен штатно завершаться по сигналам: syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT
# Покройте код агента и сервера юнит тестами
- name: "Code increment #2"
if: |
github.ref == 'refs/heads/main' ||
github.head_ref == 'iter2' ||
github.head_ref == 'iter3' ||
github.head_ref == 'iter4' ||
github.head_ref == 'iter5' ||
github.head_ref == 'iter6' ||
github.head_ref == 'iter7' ||
github.head_ref == 'iter8' ||
github.head_ref == 'iter9' ||
github.head_ref == 'iter10' ||
github.head_ref == 'iter11' ||
github.head_ref == 'iter12' ||
github.head_ref == 'iter13' ||
github.head_ref == 'iter14' ||
github.head_ref == 'iter15' ||
github.head_ref == 'iter16' ||
github.head_ref == 'iter17' ||
github.head_ref == 'iter18' ||
github.head_ref == 'iter19' ||
github.head_ref == 'iter20' ||
github.head_ref == 'iter21' ||
github.head_ref == 'iter22' ||
github.head_ref == 'iter23' ||
github.head_ref == 'iter24'
run: |
devopstest -test.v -test.run=^TestIteration2[b]*$ \
-source-path=. \
-binary-path=cmd/server/server
# III. Задание к третьему инкременту.
# Переписать код с использованием одного из распространенных web-фреймворков. Например: github.com/go-chi/chi
# Сервер должен возвращать текущее значение запрашиваемой метрики в текстовом виде по запросу GET http://<АДРЕС_СЕРВЕРА>/value/<ТИП_МЕТРИКИ>/<ИМЯ_МЕТРИКИ> со статусом http.StatusOK
# При попытке запроса неизвестной серверу метрики, сервер должен возвращать http.StatusNotFound
# По запросу GET http://<АДРЕС_СЕРВЕРА>/ сервер должен отдавать html-страничку, со списком имен и значений всех известных ему на текущий момент метрик.
- name: "Code increment #3"
if: |
github.ref == 'refs/heads/main' ||
github.head_ref == 'iter3' ||
github.head_ref == 'iter4' ||
github.head_ref == 'iter5' ||
github.head_ref == 'iter6' ||
github.head_ref == 'iter7' ||
github.head_ref == 'iter8' ||
github.head_ref == 'iter9' ||
github.head_ref == 'iter10' ||
github.head_ref == 'iter11' ||
github.head_ref == 'iter12' ||
github.head_ref == 'iter13' ||
github.head_ref == 'iter14' ||
github.head_ref == 'iter15' ||
github.head_ref == 'iter16' ||
github.head_ref == 'iter17' ||
github.head_ref == 'iter18' ||
github.head_ref == 'iter19' ||
github.head_ref == 'iter20' ||
github.head_ref == 'iter21' ||
github.head_ref == 'iter22' ||
github.head_ref == 'iter23' ||
github.head_ref == 'iter24'
run: |
devopstest -test.v -test.run=^TestIteration3[b]*$ \
-source-path=. \
-binary-path=cmd/server/server
# IV. Задание к четвертому инкременту.
# Дополнить(!) API сервера, которое позволяет принимать метрики в формате JSON.
# При реализации задействовать одну из распространенных библиотек. Например: encoding/json
# * Обмен с сервером организовать с использованием следующей структуры:
# type Metrics struct {
# ID string `json:"id"` // Имя метрики
# MType string `json:"type"` // Параметр принимающий значение gauge или counter
# Delta *int64 `json:"delta,omitempty"` // Значение метрики в случае передачи counter
# Value *float64 `json:"value,omitempty"` // Значение метрики в случае передачи gauge
# }
# * Для передачи метрик на сервер использовать Content-Type: "application/json",
# в теле запроса описанный выше JSON, передача через: POST update/
# * Для получения метрик с сервера использовать Content-Type: "application/json",
# в теле запроса описанный выше JSON (заполняем только ID и MType),
# в ответ получаем такой же JSON, но уже с заполненными значениями метрик. Запрос через: POST value/
# Перевести Агента на новое API
# Тесты проверяют, что агент экспортирует и обновляет метрики на сервере, описанные в первом инкременте.
- name: "Code increment #4"
if: |
github.ref == 'refs/heads/main' ||
github.head_ref == 'iter4' ||
github.head_ref == 'iter5' ||
github.head_ref == 'iter6' ||
github.head_ref == 'iter7' ||
github.head_ref == 'iter8' ||
github.head_ref == 'iter9' ||
github.head_ref == 'iter10' ||
github.head_ref == 'iter11' ||
github.head_ref == 'iter12' ||
github.head_ref == 'iter13' ||
github.head_ref == 'iter14' ||
github.head_ref == 'iter15' ||
github.head_ref == 'iter16' ||
github.head_ref == 'iter17' ||
github.head_ref == 'iter18' ||
github.head_ref == 'iter19' ||
github.head_ref == 'iter20' ||
github.head_ref == 'iter21' ||
github.head_ref == 'iter22' ||
github.head_ref == 'iter23' ||
github.head_ref == 'iter24'
run: |
devopstest -test.v -test.run=^TestIteration4$ \
-source-path=. \
-binary-path=cmd/server/server \
-agent-binary-path=cmd/agent/agent
# V. Задание к пятому инкременту.
# Доработать агента, что бы он мог изменять свои параметры запуска по умолчанию, через переменные окружения:
# ADDRESS (по умолчанию: "127.0.0.1:8080" или "localhost:8080")
# REPORT_INTERVAL (по умолчанию: 10 секунд)
# POLL_INTERVAL (по умолчанию: 2 секунды)
# Значения интервалов времени должно задаваться в секундах.
# Доработать сервер, что бы он мог изменять свои параметры запуска по умолчанию, через переменные окружения:
# ADDRESS (по умолчанию: "127.0.0.1:8080" или "localhost:8080")
- name: "Code increment #5"
if: |
github.ref == 'refs/heads/main' ||
github.head_ref == 'iter5' ||
github.head_ref == 'iter6' ||
github.head_ref == 'iter7' ||
github.head_ref == 'iter8' ||
github.head_ref == 'iter9' ||
github.head_ref == 'iter10' ||
github.head_ref == 'iter11' ||
github.head_ref == 'iter12' ||
github.head_ref == 'iter13' ||
github.head_ref == 'iter14' ||
github.head_ref == 'iter15' ||
github.head_ref == 'iter16' ||
github.head_ref == 'iter17' ||
github.head_ref == 'iter18' ||
github.head_ref == 'iter19' ||
github.head_ref == 'iter20' ||
github.head_ref == 'iter21' ||
github.head_ref == 'iter22' ||
github.head_ref == 'iter23' ||
github.head_ref == 'iter24'
run: |
SERVER_PORT=$(random unused-port)
ADDRESS="localhost:${SERVER_PORT}"
devopstest -test.v -test.run=^TestIteration5$ \
-source-path=. \
-agent-binary-path=cmd/agent/agent \
-binary-path=cmd/server/server \
-server-port=$SERVER_PORT
# VI. Задание к шестому инкременту.
# Доработать сервер, что бы он с заданной периодичностью сохранял текущие значения метрик на диск в указанный файл.
# На старте опционально мог загружать сохраненные ранее значения.
# При штатном завершении сервера, все накопленные данные должны сохраняться.
# Сервер должен принимать конфигурацию, через переменные окружения:
# STORE_INTERVAL (по умолчанию 300) - интервал времени в секундах, по истечении которого текущие показания сервера сбрасываются на диск. (значение 0 - делает запись синхронной)
# STORE_FILE по умолчанию ("/tmp/devops-metrics-db.json") - строка - имя файла, где хранятся значения (пустое значение - отключает функцию записи на диск)
# RESTORE по умолчанию (true) - булево значение (true|false), определяющее загружать или нет начальные значения из указанного файла при старте сервера.
- name: "Code increment #6"
if: |
github.ref == 'refs/heads/main' ||
github.head_ref == 'iter6' ||
github.head_ref == 'iter7' ||
github.head_ref == 'iter8' ||
github.head_ref == 'iter9' ||
github.head_ref == 'iter10' ||
github.head_ref == 'iter11' ||
github.head_ref == 'iter12' ||
github.head_ref == 'iter13' ||
github.head_ref == 'iter14' ||
github.head_ref == 'iter15' ||
github.head_ref == 'iter16' ||
github.head_ref == 'iter17' ||
github.head_ref == 'iter18' ||
github.head_ref == 'iter19' ||
github.head_ref == 'iter20' ||
github.head_ref == 'iter21' ||
github.head_ref == 'iter22' ||
github.head_ref == 'iter23' ||
github.head_ref == 'iter24'
run: |
SERVER_PORT=$(random unused-port)
ADDRESS="localhost:${SERVER_PORT}"
TEMP_FILE=$(random tempfile)
devopstest -test.v -test.run=^TestIteration6$ \
-source-path=. \
-agent-binary-path=cmd/agent/agent \
-binary-path=cmd/server/server \
-server-port=$SERVER_PORT \
-database-dsn='postgres://postgres:postgres@postgres:5432/praktikum?sslmode=disable' \
-file-storage-path=$TEMP_FILE
# VII. Задание к седьмому инкременту.
# Доработать код, что бы он умел принимать аргументы с использованием флагов.
# * Аргументы Сервера
# ADDRESS, через флаг "-a=<ЗНАЧЕНИЕ>"
# RESTORE, через флаг "-r=<ЗНАЧЕНИЕ>"
# STORE_INTERVAL, через флаг "-i=<ЗНАЧЕНИЕ>"
# STORE_FILE, через флаг "-f=<ЗНАЧЕНИЕ>"
# * Аргументы Агента
# ADDRESS, через флаг: "-a=<ЗНАЧЕНИЕ>"
# REPORT_INTERVAL, через флаг: "-r=<ЗНАЧЕНИЕ>"
# POLL_INTERVAL, через флаг: "-p=<ЗНАЧЕНИЕ>"
# Во всех случаях иметь значения по умолчанию и реализовать приоритет значений полученных через ENV, перед значениями задаваемые посредством флагов.
- name: "Code increment #7"
if: |
github.ref == 'refs/heads/main' ||
github.head_ref == 'iter7' ||
github.head_ref == 'iter8' ||
github.head_ref == 'iter9' ||
github.head_ref == 'iter10' ||
github.head_ref == 'iter11' ||
github.head_ref == 'iter12' ||
github.head_ref == 'iter13' ||
github.head_ref == 'iter14' ||
github.head_ref == 'iter15' ||
github.head_ref == 'iter16' ||
github.head_ref == 'iter17' ||
github.head_ref == 'iter18' ||
github.head_ref == 'iter19' ||
github.head_ref == 'iter20' ||
github.head_ref == 'iter21' ||
github.head_ref == 'iter22' ||
github.head_ref == 'iter23' ||
github.head_ref == 'iter24'
run: |
SERVER_PORT=$(random unused-port)
ADDRESS="localhost:${SERVER_PORT}"
TEMP_FILE=$(random tempfile)
devopstest -test.v -test.run=^TestIteration7$ \
-source-path=. \
-agent-binary-path=cmd/agent/agent \
-binary-path=cmd/server/server \
-server-port=$SERVER_PORT \
-database-dsn='postgres://postgres:postgres@postgres:5432/praktikum?sslmode=disable' \
-file-storage-path=$TEMP_FILE
# VIII. Задание к восьмому инкременту.
# Доработать код сервера, для реализации механизма cжатия данных сервером в формате gzip
# для контента с типом: application/json и text/html
- name: "Code increment #8"
if: |
github.ref == 'refs/heads/main' ||
github.head_ref == 'iter8' ||
github.head_ref == 'iter9' ||
github.head_ref == 'iter10' ||
github.head_ref == 'iter11' ||
github.head_ref == 'iter12' ||
github.head_ref == 'iter13' ||
github.head_ref == 'iter14' ||
github.head_ref == 'iter15' ||
github.head_ref == 'iter16' ||
github.head_ref == 'iter17' ||
github.head_ref == 'iter18' ||
github.head_ref == 'iter19' ||
github.head_ref == 'iter20' ||
github.head_ref == 'iter21' ||
github.head_ref == 'iter22' ||
github.head_ref == 'iter23' ||
github.head_ref == 'iter24'
run: |
SERVER_PORT=$(random unused-port)
ADDRESS="localhost:${SERVER_PORT}"
TEMP_FILE=$(random tempfile)
devopstest -test.v -test.run=^TestIteration8 \
-source-path=. \
-agent-binary-path=cmd/agent/agent \
-binary-path=cmd/server/server \
-server-port=$SERVER_PORT \
-database-dsn='postgres://postgres:postgres@postgres:5432/praktikum?sslmode=disable' \
-file-storage-path=$TEMP_FILE
# IX. Задание к девятому инкременту.
# Внимание: это учебный пример, в котором сделан акцент на закреплении пройденной темы,
# а не на безопасности. В реальной жизни использовать подпись таким образом не следует.
# Например остается возможность передать серверу перехваченные ранее данные с корректным хешом.
# (старое значение счетчика)
# Реализовать механизм подписывания передаваемых данных по алгоритму sha256
# Для этого расширим структуру
# type Metrics struct {
# ID string `json:"id"` // Имя метрики
# MType string `json:"type"` // Параметр принимающий значение gauge или counter
# Delta *int64 `json:"delta,omitempty"` // Значение метрики в случае передачи counter
# Value *float64 `json:"value,omitempty"` // Значение метрики в случае передачи gauge
# Hash string `json:"hash,omitempty"` // Значение hash-функции
# }
# Хеш необходимо считать от строки, с учетом ключа, который предан агенту/серверу на старте.
# ** для counter - hash(fmt.Sprintf("%s:counter:%d", id, delta), key)
# ** для gauge - hash(fmt.Sprintf("%s:gauge:%f", id, value), key)
# Агент:
# * добавить поддержку аргумента через флаг "-k=<КЛЮЧ>"
# * добавить поддержку аргумента через переменную окружения "KEY=<КЛЮЧ>"
# * при наличии ключа, агент должен вычислять хеш и передавать в поле hash запроса.
# Сервер:
# * добавить поддержку аргумента через флаг "-k=<КЛЮЧ>"
# * добавить поддержку аргумента через переменную окружения "KEY=<КЛЮЧ>"
# * при наличии ключа, во время обработки запроса, сервер должен проверять соответствие полученного и вычисленного хеша.
# при не совпадении отбрасывать полученные данные и возвращать http.StatusBadRequest
# * при наличии ключа, на этапе формирования ответа, сервер должен
# вычислять хеш и передавать его в соответствующем поле hash ответа.
- name: "Code increment #9"
if: |
github.ref == 'refs/heads/main' ||
github.head_ref == 'iter9' ||
github.head_ref == 'iter10' ||
github.head_ref == 'iter11' ||
github.head_ref == 'iter12' ||
github.head_ref == 'iter13' ||
github.head_ref == 'iter14' ||
github.head_ref == 'iter15' ||
github.head_ref == 'iter16' ||
github.head_ref == 'iter17' ||
github.head_ref == 'iter18' ||
github.head_ref == 'iter19' ||
github.head_ref == 'iter20' ||
github.head_ref == 'iter21' ||
github.head_ref == 'iter22' ||
github.head_ref == 'iter23' ||
github.head_ref == 'iter24'
run: |
SERVER_PORT=$(random unused-port)
ADDRESS="localhost:${SERVER_PORT}"
TEMP_FILE=$(random tempfile)
devopstest -test.v -test.run=^TestIteration9$ \
-source-path=. \
-agent-binary-path=cmd/agent/agent \
-binary-path=cmd/server/server \
-server-port=$SERVER_PORT \
-file-storage-path=$TEMP_FILE \
-database-dsn='postgres://postgres:postgres@postgres:5432/praktikum?sslmode=disable' \
-key="${TEMP_FILE}"
# X. Задание к десятому инкременту.
# Сервер:
# * Добавьте функциональность подключения к базе данных. В качестве СУБД используйте PostgreSQL версии не ниже 10.
# * Добавьте хендлер GET /ping, который при запросе проверяет соединение с базой данных.
# При успешной проверке хендлер должен вернуть HTTP-статус 200 OK, при неуспешной — 500 Internal Server Error.
# * Строка с адресом подключения к БД должна получаться из переменной окружения DATABASE_DSN или флага командной строки -d.
# Использование этого параметра имеет приоритет над параметром -file-storage-path и автоматически задействует функциональность сервера БД
# NOTE: Для хранения значений gauge рекомендуется использовать тип: double precision
- name: "Code increment #10"
if: |
github.ref == 'refs/heads/main' ||
github.head_ref == 'iter10' ||
github.head_ref == 'iter11' ||
github.head_ref == 'iter12' ||
github.head_ref == 'iter13' ||
github.head_ref == 'iter14' ||
github.head_ref == 'iter15' ||
github.head_ref == 'iter16' ||
github.head_ref == 'iter17' ||
github.head_ref == 'iter18' ||
github.head_ref == 'iter19' ||
github.head_ref == 'iter20' ||
github.head_ref == 'iter21' ||
github.head_ref == 'iter22' ||
github.head_ref == 'iter23' ||
github.head_ref == 'iter24'
run: |
SERVER_PORT=$(random unused-port)
ADDRESS="localhost:${SERVER_PORT}"
TEMP_FILE=$(random tempfile)
devopstest -test.v -test.run=^TestIteration10[b]*$ \
-source-path=. \
-agent-binary-path=cmd/agent/agent \
-binary-path=cmd/server/server \
-server-port=$SERVER_PORT \
-database-dsn='postgres://postgres:postgres@postgres:5432/praktikum?sslmode=disable' \
-key="${TEMP_FILE}"
# XI. Задание к одиннадцатому инкременту.
# Сервер:
# * Перепишите сервер так, чтобы СУБД PostgresSQL стала хранилищем метрик вместо текущей реализации.
# Сервису необходимо самостоятельно создать все необходимые таблицы в базе данных,
# схема и формат хранения остаются на ваше усмотрение.
- name: "Code increment #11"
if: |
github.ref == 'refs/heads/main' ||
github.head_ref == 'iter11' ||
github.head_ref == 'iter12' ||
github.head_ref == 'iter13' ||
github.head_ref == 'iter14' ||
github.head_ref == 'iter15' ||
github.head_ref == 'iter16' ||
github.head_ref == 'iter17' ||
github.head_ref == 'iter18' ||
github.head_ref == 'iter19' ||
github.head_ref == 'iter20' ||
github.head_ref == 'iter21' ||
github.head_ref == 'iter22' ||
github.head_ref == 'iter23' ||
github.head_ref == 'iter24'
run: |
SERVER_PORT=$(random unused-port)
ADDRESS="localhost:${SERVER_PORT}"
TEMP_FILE=$(random tempfile)
devopstest -test.v -test.run=^TestIteration11$ \
-source-path=. \
-agent-binary-path=cmd/agent/agent \
-binary-path=cmd/server/server \
-server-port=$SERVER_PORT \
-database-dsn='postgres://postgres:postgres@postgres:5432/praktikum?sslmode=disable' \
-key="${TEMP_FILE}"
# XII. Задание к двенадцатому инкременту.
# Сервер:
# * Добавьте новый хендлер POST /updates/ принимающий в теле запроса множество метрик в формате: []Metrics (списка метрик)
# Агент:
# * Научите агента работать с использованием нового API (отправлять метрики батчами)
# Стоит помнить:
# * Необходимо соблюдать обратную совместимость
# * Отправлять пустые батчи не нужно
# * Мы умеем сжимать контент по алгоритму gzip
# * Изменение в базе можно выполнять в рамках одной транзакции/одного запроса
- name: "Code increment #12"
if: |
github.ref == 'refs/heads/main' ||
github.head_ref == 'iter12' ||
github.head_ref == 'iter13' ||
github.head_ref == 'iter14' ||
github.head_ref == 'iter15' ||
github.head_ref == 'iter16' ||
github.head_ref == 'iter17' ||
github.head_ref == 'iter18' ||
github.head_ref == 'iter19' ||
github.head_ref == 'iter20' ||
github.head_ref == 'iter21' ||
github.head_ref == 'iter22' ||
github.head_ref == 'iter23' ||
github.head_ref == 'iter24'
run: |
SERVER_PORT=$(random unused-port)
ADDRESS="localhost:${SERVER_PORT}"
TEMP_FILE=$(random tempfile)
devopstest -test.v -test.run=^TestIteration12$ \
-source-path=. \
-agent-binary-path=cmd/agent/agent \
-binary-path=cmd/server/server \
-server-port=$SERVER_PORT \
-database-dsn='postgres://postgres:postgres@postgres:5432/praktikum?sslmode=disable' \
-key="${TEMP_FILE}"
# XIII. Задание к тринадцатому инкременту.
# Измените весь свой код в соответствии со знаниями, полученными в данной главе.
# * Добавьте механизмы обработки ошибок (там где это уместно)
# * Для формирования отладочных сообщений, используйте стандартный логгер или одну из популярных библиотек логгирования.
# * Не используйте функции fmt.Print* для вывода отладочной информации в коде сервера и агента
- name: "Code increment #13"
if: |
github.ref == 'refs/heads/main' ||
github.head_ref == 'iter13' ||
github.head_ref == 'iter14' ||
github.head_ref == 'iter15' ||
github.head_ref == 'iter16' ||
github.head_ref == 'iter17' ||
github.head_ref == 'iter18' ||
github.head_ref == 'iter19' ||
github.head_ref == 'iter20' ||
github.head_ref == 'iter21' ||
github.head_ref == 'iter22' ||
github.head_ref == 'iter23' ||
github.head_ref == 'iter24'
run: |
devopstest -test.v -test.run=^TestIteration13$ \
-source-path=.
# XIV. Задание к четыринадцатому инкременту.
# Агент:
# Перепланируйте архитектуру агента таким образом,
# что бы сбор метрик (опрос runtime) и их отправка осуществлялись в разных горутинах.
# Добавьте еще одну горутину которая бы собирала дополнительные метрики
# (с использованием пакета https://github.com/shirou/gopsutil)
# * Имя метрики: "TotalMemory", тип: gauge - общее количество памяти
# * Имя метрики: "FreeMemory", тип: gauge - общее количество свободной памяти
# * Имя метрики: "CPUutilization1", тип: gauge - загрузка ядра в процентах за 10 секунд (точное количество - по числу CPU определяемое во время исполнения)
- name: "Code increment #14"
if: |
github.ref == 'refs/heads/main' ||
github.head_ref == 'iter14' ||
github.head_ref == 'iter15' ||
github.head_ref == 'iter16' ||
github.head_ref == 'iter17' ||
github.head_ref == 'iter18' ||
github.head_ref == 'iter19' ||
github.head_ref == 'iter20' ||
github.head_ref == 'iter21' ||
github.head_ref == 'iter22' ||
github.head_ref == 'iter23' ||
github.head_ref == 'iter24'
run: |
SERVER_PORT=$(random unused-port)
ADDRESS="localhost:${SERVER_PORT}"
TEMP_FILE=$(random tempfile)
devopstest -test.v -test.run=^TestIteration14$ \
-source-path=. \
-agent-binary-path=cmd/agent/agent \
-binary-path=cmd/server/server \
-server-port=$SERVER_PORT \
-file-storage-path=$TEMP_FILE \
-database-dsn='postgres://postgres:postgres@postgres:5432/praktikum?sslmode=disable' \
-key="${TEMP_FILE}"
- name: "Code increment #14 (race detection)"
if: always()
run: |
go test -v -race ./...