BusDK Update

UpCloud-runner saa erillisen SSH-transportin

bus-integration-ssh-runner tuo Bus-integraatioille yhteisen tavan ajaa callerin antama skripti SSH:n yli. Moduuli hoitaa private key -latauksen, known_hosts-tarkistuksen, osoite- ja käyttäjäehdokkaat, timeoutit sekä stdout/stderr-rajauksen.

bus-integration-upcloud ei kutsu SSH-runnerin toteutusta prosessin sisällä. Se julkaisee bootstrap- ja Podman-skriptit bus.ssh.script.run.request -eventeinä ja odottaa korreloidun vastauksen bus-integration-runtime-kirjaston kautta.

26.4.2026bus-integration-ssh-runnerbus-integration-upcloudSSH

Tiiviisti

TL;DR

  • bus-integration-ssh-runner on geneerinen Go-paketti ja event-worker SSH-skriptien ajamiseen Bus-integraatioista.
  • Runner tallentaa ensiksi nähdyn host keyn määritettyyn known_hosts-tiedostoon ja hylkää puuttuvat avain-, osoite- tai käyttäjämääritykset selkeällä virheellä.
  • UpCloud-integraatio voi luoda tai käynnistää container runnerin, lähettää bootstrap-/Podman-skriptin SSH-runnerille eventtinä ja palauttaa stdout/stderr-vastauksen alkuperäiseen container requestiin.
  • Ennen bootstrapia tai container-ajoa UpCloud-worker odottaa sekä providerin started-tilaa että SSH TCP -yhteyden avautumista.

SSH-runnerin raja on tarkoituksella kapea. Sille annetaan target, käyttäjäehdokkaat ja ajettava skripti; se ei tiedä, ajaako caller bootstrapia, diagnostiikkaa vai container-komentoa:

payload := sshrunner.ScriptRequest{
    Target: sshrunner.Target{
        Addresses: []sshrunner.Address{{Host: runnerHost, HostKeyAlias: runnerID}},
        Users: []string{"root", "ubuntu"},
    },
    Script: "set -euo pipefail\nhostname\n",
}
response, err := requester.Request(
    ctx,
    sshrunner.EventScriptRunRequest,
    sshrunner.EventScriptRunResponse,
    payload,
    30*time.Minute,
)

SSH-runnerin omat virheet ovat deployment-asetuksiin sidottuja ja näkyvät ennen etäyhteyden yritystä. Puuttuva avainpolku palauttaa SSH private key path is required, tyhjä target palauttaa SSH target has no addresses ja käyttäjien puuttuminen palauttaa SSH target has no users. Pitkä stdout tai stderr katkaistaan määrityksen mukaiseen rajaan, ja tulosteeseen lisätään tunniste:

[output truncated]

UpCloudin worker-puolella provider voi käyttää jo olemassa olevaa runneria muodossa UPCLOUD_CONTAINER_SSH_TARGET=user@host, tai se voi luoda ja käynnistää konfiguroidun runnerin UpCloud API:n kautta. Ennen bootstrap- tai container-run-eventtiä worker tarkistaa, että runner näkyy providerissa käynnissä ja että jokin kohdeosoite avaa SSH:n portin 22. Odotusta voi rajata asetuksilla BUS_RUNNER_SSH_READY_TIMEOUT ja BUS_RUNNER_SSH_READY_POLL_INTERVAL; connection refused, timeout ja no route ovat retryttäviä readiness-tiloja.

Bootstrap kulkee SSH-runnerille event-payloadina, ja varsinainen container-ajo palauttaa korreloituun response-eventiin stdoutin, stderrin ja exit-koodin.

$ bus-integration-upcloud \
  --provider upcloud \
  --events-url "$BUS_EVENTS_API_URL" \
  --api-token "$BUS_API_TOKEN" \
  --upcloud-token "$UPCLOUD_TOKEN" \
  --vm-name "$UPCLOUD_VM_NAME" \
  --container-runner-name "$UPCLOUD_CONTAINER_RUNNER_NAME"

Hermettinen e2e tarkistaa runner-paketin ilman oikeaa SSH-kohdetta. Real SSH -ajo pysyy opt-in-polussa, jotta julkiset testit eivät tarvitse avaimia tai pilviresursseja:

SKIP bus-integration-ssh-runner real ssh e2e: set BUS_SSH_RUNNER_REAL_E2E=1 with SSH target/key configuration to opt in
e2e OK (bus-integration-ssh-runner: passed 1, skipped 1)

Nykyinen moduuliraja löytyy bus-integration-ssh-runner-dokumentaatiosta. UpCloud-workerin VM- ja container-käyttö on kuvattu bus-integration-upcloud-dokumentaatiossa.