Elasticsearch: GitHub Actions ir GitLab CI

Paleiskite tikrą Elasticsearch paslaugą iš savo GitHub Actions arba GitLab CI pipeline, vykdykite testus ir automatiškai viską uždarykite

👋 Sveiki atvykę į Stackhero dokumentaciją!

Stackhero siūlo paruoštą naudoti Elasticsearch cloud sprendimą, kuris suteikia daugybę privalumų, įskaitant:

  • Optimalų veikimą ir tvirtą saugumą, užtikrinamą privačios ir dedikuotos VM.
  • Pritaikomas domeno vardas, apsaugotas HTTPS šifravimo palaikymu.

Taupykite laiką ir supaprastinkite savo gyvenimą: tereikia 5 minučių, kad išbandytumėte Stackhero Elasticsearch cloud hosting sprendimą!

Šiame vadove rasite, kaip CI pipeline aplinkoje paleisti dedikuotą, realią Elasticsearch paslaugą naudojant GitHub Actions arba GitLab CI. Vadovaudamiesi šiais žingsniais, galėsite testuoti savo kodą prieš gyvą Elasticsearch instanciją, kuri veikia sąlygomis, artimomis produkcinei aplinkai – nebereikės naudoti jokių imitacijų ar simuliacijų. Elasticsearch is a distributed search and analytics engine that turns large volumes of data into fast, relevant answers.

Kiekvieno pipeline paleidimo metu bus sukurta nauja Elasticsearch instancija. Tai reiškia, kad jūsų testai bendraus su tokiu pačiu paslaugos tipu, kokį matys ir jūsų naudotojai produkcijoje. Darbo eiga automatiškai sukuria laikiną stack, prideda Elasticsearch, laukia, kol paslauga bus paruošta, paima sugeneruotus prisijungimo duomenis, atlieka smoke testą naudodama curl, o pabaigoje viską visada išvalo.

Naudosite Stackhero CLI – savarankišką komandų eilutės įrankį, kuris leidžia greitai ir paprastai paleisti bei valdyti Stackhero paslaugas.

Kad CLI galėtų veikti be interaktyvaus įsikišimo, jums reikės prieigos rakto (formatas: usr-xxxxxx:tokenId). Šį raktą reikia sukurti tik vieną kartą ir pridėti jį prie savo CI pipeline kaip saugų, užšifruotą slaptą kintamąjį.

  1. Sukurkite raktą: Savo Stackhero valdymo skydelyje spauskite profilio nuotrauką viršuje dešinėje, eikite į Your account, tada Access tokens ir spauskite Create token.
  2. GitHub Actions atveju: Savo repozitorijoje eikite į Settings > Secrets and variables > Actions > New repository secret ir įveskite raktą kaip STACKHERO_TOKEN.
  3. GitLab CI atveju: Projekte eikite į Settings > CI/CD > Variables > Add variable, nustatykite raktą kaip STACKHERO_TOKEN ir pažymėkite Masked (bei Protected, jei CI vykdomas tik protected šakose).

Niekada nedėkite savo prieigos rakto tiesiai į pipeline YAML failą. Jei raktas bus YAML faile, jis gali būti matomas visiems, turintiems prieigą prie repozitorijos, ir gali atsirasti build loguose. Laikant jį kaip CI slaptą kintamąjį, raktas išlieka užšifruotas ir paslėptas, todėl jūsų saugumas išlieka užtikrintas.

Žemiau pateiktas pilnas scenarijus, kuris valdo visą paslaugos gyvavimo ciklą. Matysite, kad reikia tik kelių komandų – galite kopijuoti paruoštą YAML savo platformai iš žemiau esančių skyrių.

#!/bin/bash
set -euo pipefail

# STACKHERO_TOKEN pateikiamas per CI slaptą kintamąjį, CLI jį automatiškai aptinka.

stackName="ci-elasticsearch-$$"          # Unikalus stack pavadinimas kiekvienam paleidimui
serviceStore="elasticsearch"             # Elasticsearch paslaugos store
instance="20G"        # Pakeiskite jei reikia (žr. 3 žingsnį)
region="europe"                         # Regiono pavadinimas (žr. stackhero regions-list)

# 1. Įdiekite CLI runner'yje
curl -fsSL https://www.stackhero.io/install.sh | sh

# 2. Įdiekite klientą, reikalingą smoke testui (jq + curl yra baziniai)
apt-get update && apt-get install -y --no-install-recommends jq curl

# 3. Sukurkite dedikuotą stack šiam paleidimui
stackId=$(stackhero --format=script stack-create --name="$stackName")
echo "Stack sukurtas: $stackId"

# 4. Pridėkite Elasticsearch ir gaukite jo service id
serviceId=$(stackhero --format=script service-add \
  --stack="$stackId" \
  --service-store="$serviceStore" \
  --instance="$instance" \
  --region="$region")
echo "Paslauga pridėta: $serviceId"

# 5. Palaukite, kol paslauga bus paleista (gali užtrukti kelias minutes)
stackhero service-wait-for --service="$serviceId"

# 6. Perskaitykite konfigūraciją (joje yra sugeneruoti prisijungimo duomenys)
config=$(stackhero service-configuration-get --service="$serviceId" --format=json)

# 7. Ištraukite reikiamus prisijungimo duomenis
host=$(echo "$config" | jq -r '.configuration.domain')
user=$(echo "$config" | jq -r '.configuration.credentials.login')
password=$(echo "$config" | jq -r '.configuration.credentials.password')

# 8. Smoke testas: Call the cluster health endpoint.
curl -fsS -u "$user:$password" "https://$host:9200/_cluster/health" | grep -q '"status"'

echo "✅ Elasticsearch pasiekiamas iš CI."

Teardown žingsnis, kuris ištrina paslaugą, laukia jos pašalinimo ir tada ištrina stack, aprašytas žemiau platformai skirtuose skyriuose. Tokiu būdu visada užtikrinamas išvalymas, net jei smoke testas nepavyksta.

Stack galima ištrinti tik tada, kai jis tuščias. Visada pirmiausia ištrinkite paslaugą ir palaukite jos pašalinimo, tada ištrinkite stack. Komanda service-wait-for užtikrina, kad paslauga būtų arba paleista, arba jau ištrinta prieš tęsiant, todėl ji tinkama ir laukimui ištrinant.

Žemiau pateiktuose pavyzdžiuose pagal nutylėjimą naudojama pradinio lygio 20G instancija Elasticsearch. Tai patikimas pasirinkimas daugumai užduočių, tačiau galite keisti pagal poreikį. Norėdami pamatyti visas galimas instancijų rūšis Elasticsearch, vykdykite:

# NAME stulpelyje matysite reikšmę, kurią reikia nurodyti --instance
stackhero instances-store-list --service-store=elasticsearch

Norėdami pradėti, išsaugokite žemiau pateiktą turinį kaip .github/workflows/ci.yml. Nuo šiol kiekvienas push ir pull request vykdys testus prieš tikrą Elasticsearch instanciją.

name: CI su Elasticsearch

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    env:
      STACKHERO_TOKEN: ${{ secrets.STACKHERO_TOKEN }}
      STACK_NAME: ci-elasticsearch-${{ github.run_id }}-${{ github.run_attempt }}
      INSTANCE: "20G"   # Pakeiskite jei reikia (žr. 3 žingsnį)
      REGION: europe
    steps:
      - uses: actions/checkout@v4

      - name: Įdiegti Stackhero CLI ir klientą
        run: |
          curl -fsSL https://www.stackhero.io/install.sh | sh
          apt-get update && apt-get install -y --no-install-recommends jq curl

      - name: Sukurti Elasticsearch paslaugą
        run: |
          set -euo pipefail
          STACK_ID=$(stackhero --format=script stack-create --name="$STACK_NAME")
          echo "STACK_ID=$STACK_ID" >> "$GITHUB_ENV"
          SERVICE_ID=$(stackhero --format=script service-add \
            --stack="$STACK_ID" \
            --service-store="elasticsearch" \
            --instance="$INSTANCE" \
            --region="$REGION")
          echo "SERVICE_ID=$SERVICE_ID" >> "$GITHUB_ENV"
          stackhero service-wait-for --service="$SERVICE_ID"

      - name: Vykdyti testus prieš Elasticsearch
        run: |
          set -euo pipefail
          config=$(stackhero service-configuration-get --service="$SERVICE_ID" --format=json)
          host=$(echo "$config" | jq -r '.configuration.domain')
user=$(echo "$config" | jq -r '.configuration.credentials.login')
password=$(echo "$config" | jq -r '.configuration.credentials.password')
          # Call the cluster health endpoint.
          curl -fsS -u "$user:$password" "https://$host:9200/_cluster/health" | grep -q '"status"'
          echo "✅ Elasticsearch pasiekiamas iš CI."
          # Čia galite paleisti savo testų rinkinį naudodami aukščiau gautus prisijungimo duomenis ...

      - name: Išvalymas (visada, net jei įvyksta klaida)
        if: always()
        run: |
          if [ -n "${SERVICE_ID:-}" ]; then
            stackhero service-delete --service="$SERVICE_ID" --confirm
            stackhero service-wait-for --service="$SERVICE_ID"
          fi
          if [ -n "${STACK_ID:-}" ]; then
            stackhero stack-delete --stack="$STACK_ID" --confirm
          fi

Teardown žingsnis naudoja if: always(), todėl jis bus vykdomas visada, užtikrinant, kad jūsų Elasticsearch instancija bus ištrinta ir jums nebus skaičiuojami mokesčiai už nenaudojamus resursus.

Šią konfigūraciją galite išsaugoti kaip .gitlab-ci.yml. Su šiuo nustatymu kiekvienas pipeline paleidimas sukurs naują tikrą Elasticsearch instanciją jūsų testams.

test:
  image: ubuntu:24.04
  variables:
    STACK_NAME: "ci-elasticsearch-$CI_PIPELINE_ID-$CI_JOB_ID"
    INSTANCE: "20G"   # Pakeiskite jei reikia (žr. 3 žingsnį)
    REGION: "europe"
    SERVICE_STORE: "elasticsearch"
  # STACKHERO_TOKEN gaunamas iš CI/CD kintamojo, kurį sukūrėte 1 žingsnyje.
  script:
    - set -euo pipefail
    - curl -fsSL https://www.stackhero.io/install.sh | sh
    - apt-get update && apt-get install -y --no-install-recommends jq curl
    - STACK_ID=$(stackhero --format=script stack-create --name="$STACK_NAME")
    - echo "STACK_ID=$STACK_ID" >> deploy.env
    - SERVICE_ID=$(stackhero --format=script service-add --stack="$STACK_ID" --service-store="$SERVICE_STORE" --instance="$INSTANCE" --region="$REGION")
    - echo "SERVICE_ID=$SERVICE_ID" >> deploy.env
    - stackhero service-wait-for --service="$SERVICE_ID"
    - config=$(stackhero service-configuration-get --service="$SERVICE_ID" --format=json)
    - host=$(echo "$config" | jq -r '.configuration.domain')
user=$(echo "$config" | jq -r '.configuration.credentials.login')
password=$(echo "$config" | jq -r '.configuration.credentials.password')
    # Call the cluster health endpoint.
    - curl -fsS -u "$user:$password" "https://$host:9200/_cluster/health" | grep -q '"status"'
    - echo "✅ Elasticsearch pasiekiamas iš CI."
    # Čia galite paleisti savo testų rinkinį naudodami aukščiau gautus prisijungimo duomenis ...
  after_script:
    - test -f deploy.env && . ./deploy.env || true
    - >
      if [ -n "${SERVICE_ID:-}" ]; then
        stackhero service-delete --service="$SERVICE_ID" --confirm
        stackhero service-wait-for --service="$SERVICE_ID"
      fi
    - >
      if [ -n "${STACK_ID:-}" ]; then
        stackhero stack-delete --stack="$STACK_ID" --confirm
      fi

GitLab aplinkoje išvalymas vykdomas after_script sekcijoje. Ši dalis visada bus vykdoma, net jei job'as nepavyks, todėl jūsų Elasticsearch resursai bus pašalinti ir jums nebus skaičiuojami mokesčiai už nenaudojamus resursus.

GitLab aplinkoje after_script vykdomas naujoje shell sesijoje. Todėl scenarijus job'o metu įrašo paslaugos ir stack ID į deploy.env ir prieš išvalymą juos įkelia iš naujo. Taip užtikrinama, kad net jei job'as nutrūktų, jūsų resursai vis tiek bus išvalyti.

Tai visas CI gyvavimo ciklas su Elasticsearch: sukurkite stack, pridėkite paslaugą, palaukite, gaukite prisijungimo duomenis, atlikite smoke testą ir visada išvalykite. Kiekvienas pipeline paleidimas gauna realią, izoliuotą paslaugą, o pabaigus niekas nelieka veikti. Daugiau informacijos apie galimas komandas ir neinteraktyvų STACKHERO_TOKEN autentifikavimą rasite pilnoje CLI dokumentacijoje.