CI/CD: рецепты
Коллекция Endpoint — это обычная папка в Git, поэтому её можно запускать в любом CI. Ниже готовые фрагменты для типичных схем: копируйте и меняйте пути, ветки и окружения. Описание всех флагов — в разделе CLI.
Установка CLI одной командой
Скрипт сам определяет ОС и архитектуру (x64, ARM64), скачивает endpoint-cli и проверяет SHA-256.
# Linux и macOS (нужен curl или wget)
curl -fsSL https://endpoint.ll.kg/install-cli.sh | sh
# зафиксировать версию (рекомендуется для CI) и/или папку установки
curl -fsSL https://endpoint.ll.kg/install-cli.sh | ENDPOINT_VERSION=0.5.0 ENDPOINT_INSTALL_DIR=. sh
# Windows (PowerShell)
irm https://endpoint.ll.kg/install-cli.ps1 | iex
По умолчанию CLI ставится в /usr/local/bin (или ~/.local/bin, если нет прав),
на Windows — в %LOCALAPPDATA%\endpoint-cli. Бинарник статический: работает в alpine,
debian, ubuntu и любом другом образе.
Без скрипта — прямые ссылки на последнюю версию:
curl -fsSL -o endpoint-cli https://endpoint-dl.ll.kg/latest/endpoint-cli-linux-amd64 # или linux-arm64, darwin-arm64…
chmod +x endpoint-cli
Как устроен запуск
endpoint-cli run <папка коллекции> -e <окружение> [--folder <папка>] [--var key=value] --junit report.xml
- Код выхода:
0— всё прошло,1— упали тесты или запросы (CI пометит задачу красной),2— ошибка запуска (нет окружения, неверный флаг). - Секреты не хранятся в Git. Передайте их переменными CI: переменная окружения коллекции
tokenберётся изENDPOINT_VAR_TOKEN,api-key— изENDPOINT_VAR_API_KEY. --varперекрывает значение из окружения, например адрес стенда:--var baseUrl=$API_URL.--folder usersзапускает только папку,--bailостанавливает прогон на первой ошибке.
1. Коллекция в том же репозитории и той же ветке
Самый простой вариант: папка api/ лежит рядом с кодом.
GitLab CI
api-tests:
image: alpine:3.22
variables:
ENDPOINT_VERSION: "0.5.0"
before_script:
- wget -qO- https://endpoint.ll.kg/install-cli.sh | sh
script:
- endpoint-cli run ./api -e staging --junit report.xml
artifacts:
when: always
reports:
junit: report.xml
Секрет ENDPOINT_VAR_TOKEN добавьте в Settings → CI/CD → Variables (Masked). Отчёт появится во вкладке
Tests пайплайна и в merge request.
GitHub Actions
jobs:
api-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- run: curl -fsSL https://endpoint.ll.kg/install-cli.sh | ENDPOINT_VERSION=0.5.0 sh
- run: endpoint-cli run ./api -e staging --junit report.xml
env:
ENDPOINT_VAR_TOKEN: ${{ secrets.API_TOKEN }}
- uses: actions/upload-artifact@v7
if: always()
with:
name: api-report
path: report.xml
2. Коллекция в другой ветке того же репозитория
Типичная схема Endpoint: код в master, запросы — в ветке endpoint (или api-tests).
Пайплайн кода забирает коллекцию из соседней ветки.
Любой CI (git): подтянуть только нужную ветку в отдельную папку, не трогая текущий checkout:
git fetch --depth 1 origin endpoint
git worktree add ../api-tests FETCH_HEAD
endpoint-cli run ../api-tests/api -e staging --junit report.xml
GitLab CI
api-tests:
image: alpine:3.22
variables:
COLLECTION_BRANCH: endpoint
before_script:
- apk add --no-cache git
- wget -qO- https://endpoint.ll.kg/install-cli.sh | sh
script:
- git fetch --depth 1 origin "$COLLECTION_BRANCH"
- git worktree add /tmp/api-tests FETCH_HEAD
- endpoint-cli run /tmp/api-tests/api -e staging --junit report.xml
artifacts:
when: always
reports:
junit: report.xml
GitHub Actions — второй checkout в отдельную папку:
steps:
- uses: actions/checkout@v7 # код
- uses: actions/checkout@v7 # коллекция из ветки endpoint
with:
ref: endpoint
path: api-tests
- run: curl -fsSL https://endpoint.ll.kg/install-cli.sh | sh
- run: endpoint-cli run ./api-tests/api -e staging --junit report.xml
env:
ENDPOINT_VAR_TOKEN: ${{ secrets.API_TOKEN }}
Чтобы проверять ту ветку коллекции, в которой вы сейчас работаете (например feature/orders),
передайте её переменной: в GitLab — Run pipeline → Variables → COLLECTION_BRANCH,
в GitHub — workflow_dispatch с параметром и ref: ${{ inputs.branch }}.
3. Коллекция в другом репозитории
Коллекция живёт отдельно (например qa/api-collection), а тесты запускаются из пайплайна сервиса.
GitLab CI — через CI_JOB_TOKEN, без отдельных паролей:
api-tests:
image: alpine:3.22
variables:
COLLECTION_REPO: qa/api-collection
COLLECTION_BRANCH: master
before_script:
- apk add --no-cache git
- wget -qO- https://endpoint.ll.kg/install-cli.sh | sh
script:
- git clone --depth 1 --branch "$COLLECTION_BRANCH" "https://gitlab-ci-token:${CI_JOB_TOKEN}@${CI_SERVER_HOST}/${COLLECTION_REPO}.git" /tmp/collection
- endpoint-cli run /tmp/collection -e staging --junit report.xml
artifacts:
when: always
reports:
junit: report.xml
В проекте с коллекцией разрешите доступ: Settings → CI/CD → Job token permissions → Add project
и укажите проект сервиса. Если так нельзя, создайте Deploy token (read_repository), положите
его в переменные CI и клонируйте по адресу https://<user>:${DEPLOY_TOKEN}@${CI_SERVER_HOST}/qa/api-collection.git.
GitHub Actions — нужен токен с правом чтения второго репозитория (fine-grained PAT с Contents: Read или токен GitHub App):
steps:
- uses: actions/checkout@v7
with:
repository: Keremet-DEV/api-collection
ref: master
token: ${{ secrets.COLLECTION_TOKEN }}
path: collection
- run: curl -fsSL https://endpoint.ll.kg/install-cli.sh | sh
- run: endpoint-cli run ./collection -e staging --junit report.xml
env:
ENDPOINT_VAR_TOKEN: ${{ secrets.API_TOKEN }}
Любой другой CI — токен передаётся заголовком и не попадает в адрес и логи:
git -c http.extraHeader="Authorization: Bearer $GIT_TOKEN" \
clone --depth 1 --branch master https://git.example.com/qa/api-collection.git collection
endpoint-cli run ./collection -e staging
4. Прогон после деплоя: сервис запускает тесты в репозитории коллекции
Сервис задеплоился → запускается пайплайн репозитория с коллекцией и проверяет свежий стенд. Результат виден в обоих пайплайнах.
GitLab CI — в .gitlab-ci.yml сервиса:
api-tests:
stage: verify # после deploy
trigger:
project: qa/api-collection
branch: master
strategy: depend # пайплайн сервиса ждёт результат тестов
variables:
API_URL: https://staging.example.com
В репозитории коллекции:
run:
image: alpine:3.22
before_script:
- wget -qO- https://endpoint.ll.kg/install-cli.sh | sh
script:
- endpoint-cli run . -e staging --var baseUrl="${API_URL:-https://staging.example.com}" --junit report.xml
artifacts:
when: always
reports:
junit: report.xml
GitHub Actions — сервис отправляет событие:
- name: Trigger API tests
env:
GH_TOKEN: ${{ secrets.COLLECTION_TOKEN }} # нужно право Contents: Read and write
run: gh api repos/Keremet-DEV/api-collection/dispatches -f event_type=deployed -F "client_payload[api_url]=https://staging.example.com"
а репозиторий коллекции его принимает:
on:
repository_dispatch:
types: [deployed]
jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- run: curl -fsSL https://endpoint.ll.kg/install-cli.sh | sh
- run: endpoint-cli run . -e staging --var "baseUrl=${{ github.event.client_payload.api_url }}" --junit report.xml
5. Проверка merge request в репозитории коллекции
Каждое изменение запросов и тестов проверяется до слияния в master:
api-tests:
image: alpine:3.22
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
before_script:
- wget -qO- https://endpoint.ll.kg/install-cli.sh | sh
script:
- endpoint-cli run . -e staging --junit report.xml
artifacts:
when: always
reports:
junit: report.xml
6. Несколько окружений и регулярные smoke-тесты
GitLab CI — матрица и расписание (Build → Pipeline schedules, например каждый час):
smoke:
image: alpine:3.22
parallel:
matrix:
- ENV: [dev, staging, prod]
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
before_script:
- wget -qO- https://endpoint.ll.kg/install-cli.sh | sh
script:
- endpoint-cli run . -e "$ENV" --folder smoke --bail --junit "report-$ENV.xml"
artifacts:
when: always
reports:
junit: report-*.xml
GitHub Actions:
on:
schedule:
- cron: "0 * * * *"
jobs:
smoke:
strategy:
fail-fast: false
matrix:
env: [dev, staging, prod]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- run: curl -fsSL https://endpoint.ll.kg/install-cli.sh | sh
- run: endpoint-cli run . -e ${{ matrix.env }} --folder smoke --bail
7. Корпоративная сеть: свой CA, прокси, mTLS
Сертификаты удобно хранить в CI-переменной типа File: GitLab подставит путь к файлу.
endpoint-cli run . -e staging \
--cacert "$CORP_CA" \
--proxy http://proxy.corp:3128 --no-proxy-for "localhost,.corp.lan" \
--pfx "$CLIENT_PFX" --pfx-pass "$CLIENT_PFX_PASS"
Если и Git-сервер использует внутренний CA, дайте его git: export GIT_SSL_CAINFO="$CORP_CA".
--insecure отключает проверку TLS — используйте его только на тестовых стендах.
8. Docker, Jenkins и другие CI
Без установки на хост — одноразовый контейнер:
docker run --rm -v "$PWD:/w" -w /w -e ENDPOINT_VAR_TOKEN alpine:3.22 \
sh -c "wget -qO- https://endpoint.ll.kg/install-cli.sh | sh && endpoint-cli run ./api -e staging --junit report.xml"
Jenkins (declarative pipeline):
stage('API tests') {
environment { ENDPOINT_VAR_TOKEN = credentials('api-token') }
steps {
sh 'curl -fsSL https://endpoint.ll.kg/install-cli.sh | ENDPOINT_INSTALL_DIR=. sh'
sh './endpoint-cli run ./api -e staging --junit report.xml'
}
post { always { junit 'report.xml' } }
}
Windows-раннер (PowerShell):
irm https://endpoint.ll.kg/install-cli.ps1 | iex
endpoint-cli run .\api -e staging --junit report.xml
Отчёты
| Флаг | Что получится |
|---|---|
--junit report.xml |
JUnit XML: вкладка Tests в GitLab, junit в Jenkins, test reporter в GitHub |
--json result.json |
все запросы, статусы, время и результаты тестов — для своих дашбордов |
-v |
вывод console.log из скриптов прямо в лог задачи |
--no-color |
лог без цветовых кодов (если CI их не поддерживает) |