Echolot
명령줄과 CI

CI

푸시할 때마다 작업 공간의 검사를 실행합니다. JUnit 보고서, CI의 비밀 값, 명세, 스키마, MCP 서버에 대한 게이트를 다룹니다.

작업 공간은 텍스트 파일 폴더이므로 테스트 대상 API와 같은 저장소에 둘 수 있습니다. CI에서 명령줄 도구는 작업 공간을 확인하고, 요청을 검사와 함께 실행하고, CI 시스템이 보여 주는 보고서를 씁니다. 검사가 실패하면 작업이 실패합니다.

작업이 하는 일

echolot validate Alpenglow.echolot --env staging
echolot run Alpenglow.echolot --env staging \
  --reporter console --reporter junit --out echolot-results.xml
  1. echolot validate는 아무것도 보내기 전에 깨진 파일이나 빠진 변수를 잡아냅니다.
  2. echolot run은 요청을 보내고 검사와 스크립트를 실행합니다. console은 작업 로그에 실행 내용을 출력하고, junit은 CI가 테스트 결과로 읽는 파일을 씁니다.
  3. 요청이 실패하면 종료 코드가 1이므로 작업이 실패합니다.

작업 공간의 일부만 실행하려면 --folder를, 데이터 기반 실행에는 --data를, 처음 실패에서 멈추려면 --bail을, 불안정한 의존성에는 --retries를 추가합니다.

CI의 비밀 값

작업 공간 파일에는 비밀 값이 없으므로 CI가 제공해야 합니다. 각 값을 CI의 비밀 값에 저장하고, 변수 이름을 대문자로 한 ECHOLOT_SECRET_<NAME>이라는 환경 변수로 전달합니다(비밀 값 참조).

작업 공간의 비밀 변수CI의 환경 변수
passwordECHOLOT_SECRET_PASSWORD
tokenECHOLOT_SECRET_TOKEN
api-keyECHOLOT_SECRET_API_KEY

또는 파일에 써서 --secrets로 전달합니다. 한 줄에 NAME=value 하나입니다. 그 파일은 절대 커밋하지 마십시오.

대부분의 CI 시스템은 CI를 설정하며 이것이 키체인을 꺼서 작업이 확인 창을 기다리는 일이 없게 합니다. 보고서는 비밀 값을 가리므로 아티팩트로 보관해도 안전합니다.

  • OAuth를 쓰는 MCP 서버: Mac에서 echolot mcp sign-in <server> --print로 한 번 로그인하고, 출력된 ECHOLOT_SECRET_… 값을 CI의 비밀 값으로 저장합니다. echolot mcp를 참조하십시오.
  • 캡처한 비밀 값: 키체인이 없으면 비밀 변수로 캡처한 응답이 같은 실행의 다음 요청으로 이어지지 않습니다. 그런 변수에는 CI에서 값을 주거나, 비밀 값이 아닌 변수로 캡처하십시오.

GitHub Actions

macOS 러너에서 릴리스의 도구를 내려받아 실행합니다.

# .github/workflows/api-checks.yml
name: API checks
on: [push, pull_request]

jobs:
  echolot:
    runs-on: macos-15
    steps:
      - uses: actions/checkout@v4

      - name: Install the Echolot command-line tool
        env:
          GH_TOKEN: ${{ github.token }}
        run: |
          gh release download --repo staticdreams/echolot-public --pattern 'echolot-*-macos.zip'
          unzip -o echolot-*-macos.zip -d "$RUNNER_TEMP/echolot"
          echo "$RUNNER_TEMP/echolot" >> "$GITHUB_PATH"

      - name: Check the workspace
        run: echolot validate Alpenglow.echolot --env staging
        env:
          ECHOLOT_SECRET_PASSWORD: ${{ secrets.ALPENGLOW_STAGING_PASSWORD }}

      - name: Run the requests
        run: |
          echolot run Alpenglow.echolot --env staging \
            --reporter console --reporter junit --out echolot-results.xml
        env:
          ECHOLOT_SECRET_PASSWORD: ${{ secrets.ALPENGLOW_STAGING_PASSWORD }}

      - name: Keep the report
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: echolot-results
          path: echolot-results.xml

태그 없이 gh release download를 쓰면 최신 릴리스를 받습니다. 버전을 고정하려면 태그를 지정하십시오(gh release download v0.5.0 …).

Linux 러너

도구는 현재 macOS에서 실행됩니다. 위 작업은 macOS 러너를 사용합니다. Linux 빌드, Docker 이미지, 바로 쓸 수 있는 GitHub Action은 아직 공개되지 않았으며, 공개되면 이 페이지에서 보여 드립니다.

다른 CI

모든 것이 종료 코드가 있는 명령이므로 셸 명령을 실행하는 CI 시스템이라면 무엇이든 작동합니다. macOS 러너용 스크립트:

#!/bin/sh
set -e

echolot validate Alpenglow.echolot --env staging
echolot run Alpenglow.echolot --env staging \
  --reporter console \
  --reporter junit --out reports/echolot.xml \
  --reporter html --out reports/echolot.html

set -e는 실패한 첫 명령에서 스크립트를 멈춥니다. CI의 테스트 보고서 설정이 reports/echolot.xml을 가리키게 하고, reports/echolot.html은 사람이 열어 볼 수 있도록 아티팩트로 보관하십시오.

추가 게이트

검사명령실패하는 경우
OpenAPI 명세가 건전함echolot spec lint specs/alpenglow.yaml --strict오류나 경고가 있습니다.
요청이 명세를 따름echolot spec check -w Alpenglow.echolot <folder>명세가 바뀌었는데 폴더가 업데이트되지 않았습니다.
GraphQL 스키마가 호환성을 유지함echolot graphql diff before.graphql specs/shop.graphql호환되지 않는 변경이 있습니다(더 엄격하게 하려면 --fail-on dangerous).
모델이 MCP 서버를 쓸 수 있음echolot mcp check --url https://demo.echolot.dev/mcp --quality --strict모델이 도구에서 혼동할 수 있습니다.
플로가 여전히 작동함echolot flow run morning-stock-check -w Alpenglow.echolot --no-input플로나 플로의 테스트 중 하나가 실패합니다.
에이전트가 일을 해낼 수 있음echolot agent "…" -w Alpenglow.echolot --policy-file ci-policy.toml에이전트가 끝내지 못합니다.

API에 필요하지만 CI에 없는 서버는 먼저 모의 서버를 백그라운드에서 실행하십시오.

빈 저장소에서 시작하는 안내는 CI에서 API 테스트를 참조하십시오.

이 페이지에서