|
1 | | -#!/bin/bash |
| 1 | +#!/usr/bin/env bash |
2 | 2 | # Copyright The Kubernetes Authors. |
3 | 3 | # |
4 | 4 | # Licensed under the Apache License, Version 2.0 (the "License"); |
|
17 | 17 | # |
18 | 18 | # Must be run from a kubernetes source checkout directory. |
19 | 19 | # Requires: LAMBDA_API_KEY_FILE, JOB_NAME, BUILD_ID, ARTIFACTS env vars. |
20 | | -# Optional: GPU_TYPE (default: gpu_1x_a100_sxm4) |
| 20 | +# Optional: GPU_TYPE (default: gpu_1x_a10, set empty to accept any available) |
21 | 21 | set -o errexit |
| 22 | +set -o nounset |
22 | 23 | set -o pipefail |
23 | 24 |
|
24 | 25 | SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" |
25 | | -SSH_OPTS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR" |
26 | | -GPU_TYPE="${GPU_TYPE:-gpu_1x_a10}" |
27 | | -SSH_KEY_NAME="prow-${JOB_NAME}-${BUILD_ID}" |
| 26 | +SSH_OPTS=(-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR) |
| 27 | +GPU_TYPE="${GPU_TYPE-gpu_1x_a10}" |
| 28 | +GPU_ARGS=() |
| 29 | +if [ -n "${GPU_TYPE}" ]; then |
| 30 | + GPU_ARGS=(--gpu "${GPU_TYPE}") |
| 31 | +fi |
| 32 | +SSH_KEY_NAME=$(echo -n "prow-${JOB_NAME}-${BUILD_ID}" | sha256sum | cut -c1-64) |
| 33 | +SSH_DIR=$(mktemp -d /tmp/lambda-ssh.XXXXXX) |
| 34 | +SSH_KEY="${SSH_DIR}/key" |
28 | 35 |
|
29 | 36 | # --- Install lambdactl --- |
30 | 37 | GOPROXY=direct go install github.com/dims/lambdactl@latest |
31 | 38 |
|
32 | 39 | # --- Generate ephemeral SSH key --- |
33 | | -rm -f /tmp/lambda-ssh /tmp/lambda-ssh.pub |
34 | | -ssh-keygen -t ed25519 -f /tmp/lambda-ssh -N "" -q |
35 | | -SSH_KEY_ID=$(lambdactl --json ssh-keys add "${SSH_KEY_NAME}" /tmp/lambda-ssh.pub | jq -r '.id') |
| 40 | +ssh-keygen -t ed25519 -f "${SSH_KEY}" -N "" -q |
| 41 | +SSH_KEY_ID=$(lambdactl --json ssh-keys add "${SSH_KEY_NAME}" "${SSH_KEY}.pub" | jq -r '.id') |
36 | 42 |
|
37 | 43 | cleanup() { |
38 | 44 | echo "Cleaning up..." |
39 | 45 | [ -n "${INSTANCE_ID:-}" ] && lambdactl stop "${INSTANCE_ID}" --yes 2>/dev/null || true |
40 | 46 | [ -n "${SSH_KEY_ID:-}" ] && lambdactl ssh-keys rm "${SSH_KEY_ID}" 2>/dev/null || true |
| 47 | + rm -rf "${SSH_DIR}" |
41 | 48 | } |
42 | 49 | trap cleanup EXIT |
43 | 50 |
|
44 | | -# --- Launch instance with retries --- |
45 | | -LAUNCH_OUTPUT=$(lambdactl --json start \ |
46 | | - --gpu "${GPU_TYPE}" \ |
| 51 | +# --- Launch instance (poll until capacity is available) --- |
| 52 | +LAUNCH_OUTPUT=$(lambdactl --json watch \ |
| 53 | + "${GPU_ARGS[@]}" \ |
47 | 54 | --ssh "${SSH_KEY_NAME}" \ |
48 | | - --name "prow-${BUILD_ID}" \ |
49 | | - --retries 4 \ |
50 | | - --retry-delay 60 \ |
| 55 | + --name "${SSH_KEY_NAME}" \ |
| 56 | + --interval 30 \ |
| 57 | + --timeout 900 \ |
51 | 58 | --wait-ssh) |
52 | 59 | INSTANCE_IP=$(echo "${LAUNCH_OUTPUT}" | jq -r '.ip') |
53 | 60 | INSTANCE_ID=$(echo "${LAUNCH_OUTPUT}" | jq -r '.id') |
54 | 61 |
|
55 | | -remote() { ssh ${SSH_OPTS} -i /tmp/lambda-ssh "ubuntu@${INSTANCE_IP}" "$@"; } |
56 | | -rsync_to() { rsync -e "ssh ${SSH_OPTS} -i /tmp/lambda-ssh" "$@"; } |
| 62 | +remote() { ssh "${SSH_OPTS[@]}" -i "${SSH_KEY}" "ubuntu@${INSTANCE_IP}" "$@"; } |
| 63 | +rsync_to() { rsync -e "ssh ${SSH_OPTS[*]} -i ${SSH_KEY}" "$@"; } |
57 | 64 |
|
58 | 65 | # --- Build k8s binaries --- |
59 | | -git fetch --tags --depth 1 origin 2>/dev/null || true |
60 | | -KUBE_GIT_VERSION=$(git describe --tags --match='v*' 2>/dev/null || echo "v1.35.0") |
61 | | -make KUBE_GIT_VERSION="${KUBE_GIT_VERSION}" \ |
| 66 | +git fetch --tags --depth 100 origin 2>/dev/null || true |
| 67 | +make \ |
62 | 68 | WHAT="cmd/kubeadm cmd/kubelet cmd/kubectl test/e2e/e2e.test vendor/github.com/onsi/ginkgo/v2/ginkgo" |
63 | 69 |
|
64 | 70 | # --- Transfer binaries to Lambda instance --- |
|
0 commit comments