From 5434a2b0224d58ba8ed3650399c8a7dba83a6cfa Mon Sep 17 00:00:00 2001 From: Yoshifumi Nakamura Date: Tue, 2 Jun 2026 22:53:39 +0900 Subject: [PATCH] Add site runner preflight setup scripts Signed-off-by: Yoshifumi Nakamura --- docs/guides/add-site.md | 53 ++- scripts/site/preflight_runner.sh | 370 ++++++++++++++++++ .../setup_runner.sh} | 44 ++- 3 files changed, 452 insertions(+), 15 deletions(-) create mode 100755 scripts/site/preflight_runner.sh rename scripts/{setup_site_runner.sh => site/setup_runner.sh} (92%) diff --git a/docs/guides/add-site.md b/docs/guides/add-site.md index 8340d07..e8cc101 100644 --- a/docs/guides/add-site.md +++ b/docs/guides/add-site.md @@ -33,7 +33,7 @@ GitLab Runner と Jacamar-CI をユーザ権限でセットアップし、CI/CD ## クイックセットアップ(推奨) -通常は `scripts/setup_site_runner.sh` を使えば、GitLab Runner の取得、Jacamar-CI のビルド、frontend runner と Jacamar runner の登録、`custom-config.toml` / `config.toml` 相当の設定、systemd user service の作成までまとめて実行できます。 +通常は `scripts/site/setup_runner.sh` を使えば、GitLab Runner の取得、Jacamar-CI のビルド、frontend runner と Jacamar runner の登録、`custom-config.toml` / `config.toml` 相当の設定、systemd user service の作成までまとめて実行できます。 `--login-token` と `--jacamar-token` には、GitLab で作成した各 runner の authentication token を指定します。URL は両 runner で共通です。 @@ -41,6 +41,29 @@ GitLab Runner と Jacamar-CI をユーザ権限でセットアップし、CI/CD セットアップ前に、対象ログインノードから GitLab サーバへ到達できるか確認します。GitLab Runner は GitLab 側から接続されるのではなく、ログインノード上の常駐プロセスが GitLab へ job を取りに行きます。 +まず軽量な preflight script を実行します。この script は scheduler job を投入せず、ログインノード上で `gitlab.com`、`github.com`、CI 用 GitLab への direct/proxy 接続、proxy 候補探索、`systemctl --user`、`loginctl` の状態を確認します。proxy 候補は現在の環境変数、shell profile、system profile、既存 runner の systemd unit、`config.toml` から探索し、疎通した候補を `setup_runner.sh --proxy` の推奨値として表示します。 + +```bash +GITLAB_URL="https://YOUR_GITLAB_SERVER" + +scripts/site/preflight_runner.sh \ + --site your_site \ + --gitlab-url "$GITLAB_URL" +``` + +benchkit リポジトリをまだ clone していない場合: + +```bash +GITLAB_URL="https://YOUR_GITLAB_SERVER" + +curl -fsSL https://raw.githubusercontent.com/RIKEN-RCCS/benchkit/main/scripts/site/preflight_runner.sh \ + | bash -s -- \ + --site your_site \ + --gitlab-url "$GITLAB_URL" +``` + +preflight が `Suggested setup option: --proxy ...` を表示した場合は、その値を `setup_runner.sh --proxy` に渡します。以下は手動で同じ観点を確認したい場合のコマンドです。 + ```bash GITLAB_URL="https://YOUR_GITLAB_SERVER" @@ -62,12 +85,12 @@ RUNNER_PROXY="http://PROXY_HOST:PORT" curl -I --connect-timeout 5 -x "$RUNNER_PROXY" "$GITLAB_URL" ``` -proxy 経由でだけ成功する場合は、`setup_site_runner.sh` 実行時に `--proxy "$RUNNER_PROXY"` を指定します。`systemd --user` のサービスはログインシェルの proxy 環境変数を継承しないことがあるため、proxy は runner の systemd unit に明示しておくのが安全です。 +proxy 経由でだけ成功する場合は、`setup_runner.sh` 実行時に `--proxy "$RUNNER_PROXY"` を指定します。スクリプトは安全のため、proxy を runner の `config.toml` の `environment` と `systemd --user` unit の `Environment=` の両方に設定します。`systemd --user` のサービスはログインシェルの proxy 環境変数を継承しないことがあり、Jacamar から `qsub -v http_proxy,...` で計算ノードへ渡す変数は `config.toml` の runner environment を継承元にする必要があるためです。 AMD64 ログインノードの例: ```bash -curl -fsSL https://raw.githubusercontent.com/RIKEN-RCCS/benchkit/main/scripts/setup_site_runner.sh \ +curl -fsSL https://raw.githubusercontent.com/RIKEN-RCCS/benchkit/main/scripts/site/setup_runner.sh \ | bash -s -- \ --arch amd64 \ --site your_site \ @@ -103,15 +126,15 @@ ARM64 ログインノードでは `--arch arm64` を指定します。 - `--unrestricted-cmd-line` - Jacamar の `GIT_ASKPASS` credential helper が効かず、`get_sources` で `fatal: unable to get password from user` になる場合の回避策です。runner generated command line に job token が現れる可能性があるため、単一ユーザ運用や `/proc` の閲覧制限がある環境で使ってください - `--proxy http://PROXY_HOST:PORT` - - runner の systemd user service に `http_proxy` / `https_proxy` / `HTTP_PROXY` / `HTTPS_PROXY` を設定します。`http://` または `https://` を省略した場合は `http://` を補います + - runner の `config.toml` の `environment` と systemd user service の両方に `http_proxy` / `https_proxy` / `HTTP_PROXY` / `HTTPS_PROXY` を設定します。`http://` または `https://` を省略した場合は `http://` を補います - `--no-proxy LIST` - - runner の systemd user service に `no_proxy` / `NO_PROXY` を設定します + - runner の `config.toml` の `environment` と systemd user service の両方に `no_proxy` / `NO_PROXY` を設定します - `--no-systemd` / `--no-start` - systemd user service を作らない、または作るだけで起動しない場合に使います Jacamar-CI のビルドは、ログインノードのプロセス数・メモリ制限に当たりにくいよう、既定で `make -j1`、`GOMAXPROCS=1`、`GOFLAGS="-p=1 -gcflags=all=-dwarf=false"` を使います。余裕のある環境では `JACAMAR_BUILD_MAKE_JOBS`、`JACAMAR_BUILD_GOMAXPROCS`、`JACAMAR_BUILD_GOFLAGS` で上書きできます。 -このスクリプトは `config.toml` の `environment` に `PATH=$BASE_DIR/bin:...` を登録時点で入れるため、アーティファクト保存時に `gitlab-runner` が見つからない問題も避けられます。以下の手動手順は、スクリプトが失敗した場合の切り分けや、サイト固有に調整したい場合の参照として使ってください。 +このスクリプトは `config.toml` の `environment` に `PATH=$BASE_DIR/bin:...` を登録時点で入れるため、アーティファクト保存時に `gitlab-runner` が見つからない問題も避けられます。`--proxy` / `--no-proxy` を指定した場合は proxy / no_proxy も `config.toml` に入れるため、Jacamar が投入する計算ノードジョブで `qsub -v http_proxy,...` を使う場合の継承元にもなります。以下の手動手順は、スクリプトが失敗した場合の切り分けや、サイト固有に調整したい場合の参照として使ってください。 --- @@ -485,10 +508,16 @@ command_delay = "30s" ```toml [[runners]] environment = [ - "PATH=/path/to/gitlab-runner_jacamar-ci_amd/bin:/usr/local/bin:/usr/bin:/bin" + "PATH=/path/to/gitlab-runner_jacamar-ci_amd/bin:/usr/local/bin:/usr/bin:/bin", + "http_proxy=http://PROXY_HOST:PORT", + "https_proxy=http://PROXY_HOST:PORT", + "HTTP_PROXY=http://PROXY_HOST:PORT", + "HTTPS_PROXY=http://PROXY_HOST:PORT" ] ``` +`qsub -v http_proxy,https_proxy,HTTP_PROXY,HTTPS_PROXY` は qsub 実行プロセスの環境変数を計算ノードへ継承します。Jacamar の custom executor では systemd unit の `Environment=` だけでは計算ノードジョブの継承元として不足することがあるため、proxy が必要な拠点では `config.toml` の runner `environment` にも同じ値を入れてください。`setup_runner.sh --proxy` はこの二重設定を自動で行います。 + ### Jacamar 用ランナーの `[runners.custom]` セクション ```toml @@ -736,7 +765,7 @@ environment = ["PATH=/path/to/gitlab-runner_jacamar-ci_amd/bin:..."] ### ランナーが GitLab に接続できない - ログインノードから GitLab サーバへの HTTPS 通信が可能か確認 -- プロキシ設定が必要な場合は `setup_site_runner.sh --proxy` で systemd user service に proxy を明示 +- プロキシ設定が必要な場合は `setup_runner.sh --proxy` で `config.toml` と systemd user service の両方に proxy を明示 ログインシェルでは `curl -I https://gitlab.swc.r-ccs.riken.jp` が成功するのに、常駐ランナーが `Checking for jobs... failed` や `lookup gitlab.swc.r-ccs.riken.jp on [::1]:53` で失敗する場合は、 @@ -768,6 +797,14 @@ systemctl --user restart gitlab-runner--amd.service systemctl --user show gitlab-runner--amd.service -p Environment ``` +一方で、計算ノード上の `git clone` や `curl` が GitHub などへ直結して timeout する場合は、`config.toml` の該当 runner の `environment` に proxy が入っているか確認します。NQSV などで `qsub -v http_proxy,...` を使う場合、変数名だけを指定した proxy は qsub 実行時の runner/Jacamar 環境から継承されます。 + +```bash +grep -nA8 -B2 'environment = ' /path/to/gitlab-runner_jacamar-ci_amd/config.toml +``` + +手動で修正する場合は、該当する `[[runners]]` に systemd unit と同じ proxy を追加してから runner を再起動します。 + ### 計算ノードに `git` がない場合 一部の計算ノードでは、ログインノードやフロントエンドランナーでは `git` が使えても、バッチジョブ内では `git: コマンドが見つかりません` になることがあります。アプリの `run.sh` が実行時に外部ソースを clone する場合は、計算ノード側でも `git` 相当のコマンドが必要です。 diff --git a/scripts/site/preflight_runner.sh b/scripts/site/preflight_runner.sh new file mode 100755 index 0000000..b712c46 --- /dev/null +++ b/scripts/site/preflight_runner.sh @@ -0,0 +1,370 @@ +#!/usr/bin/env bash +set -euo pipefail + +site="" +arch="" +gitlab_url="" +base_dir="" +service_host="" +explicit_proxy="" +connect_timeout=5 +max_time=12 + +usage() { + cat <<'EOF' +Usage: + preflight_runner.sh --gitlab-url URL [options] + +Options: + --site SITE Site prefix used for runner service lookup. + --arch amd64|arm64 Target architecture. Default: auto-detect. + --gitlab-url URL CI GitLab URL to test in addition to gitlab.com/github.com. + --base-dir DIR Default: $HOME/gitlab-runner_jacamar-ci_{amd,arm} + --service-host HOST Default: hostname -s. + --proxy URL Add an explicit proxy candidate to test. + If URL has no scheme, http:// is prepended. + --connect-timeout SEC curl connect timeout. Default: 5. + --max-time SEC curl total timeout. Default: 12. + -h, --help Show this help. + +This script performs only login-node checks. It does not submit scheduler jobs. +It discovers proxy candidates from the current environment, shell profiles, +system profiles, existing runner systemd units, and runner config.toml files. +EOF +} + +info() { + echo "[preflight] $*" +} + +ok() { + echo "[OK] $*" +} + +warn() { + echo "[WARN] $*" +} + +ng() { + echo "[NG] $*" +} + +die() { + echo "ERROR: $*" >&2 + exit 1 +} + +normalize_url() { + local value="$1" + case "$value" in + http://*|https://*) printf '%s' "$value" ;; + *) printf 'https://%s' "$value" ;; + esac +} + +normalize_proxy() { + local value="$1" + value="${value#\"}" + value="${value%\"}" + value="${value#\'}" + value="${value%\'}" + value="${value%,}" + value="${value%;}" + [[ -n "$value" ]] || return 0 + case "$value" in + http://*|https://*) printf '%s' "$value" ;; + *) printf 'http://%s' "$value" ;; + esac +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --site) site="${2:-}"; shift 2 ;; + --arch) arch="${2:-}"; shift 2 ;; + --gitlab-url) gitlab_url="${2:-}"; shift 2 ;; + --base-dir) base_dir="${2:-}"; shift 2 ;; + --service-host) service_host="${2:-}"; shift 2 ;; + --proxy) explicit_proxy="${2:-}"; shift 2 ;; + --connect-timeout) connect_timeout="${2:-}"; shift 2 ;; + --max-time) max_time="${2:-}"; shift 2 ;; + -h|--help) usage; exit 0 ;; + *) die "Unknown option: $1" ;; + esac +done + +[[ -n "$gitlab_url" ]] || die "--gitlab-url is required" +gitlab_url="$(normalize_url "$gitlab_url")" + +if [[ -z "$arch" ]]; then + case "$(uname -m)" in + x86_64|amd64) arch="amd64" ;; + aarch64|arm64) arch="arm64" ;; + *) die "Cannot auto-detect arch from uname -m=$(uname -m); pass --arch" ;; + esac +fi + +case "$arch" in + amd64) arch_suffix="amd" ;; + arm64) arch_suffix="arm" ;; + *) die "--arch must be amd64 or arm64" ;; +esac + +if [[ -z "$base_dir" ]]; then + base_dir="${HOME}/gitlab-runner_jacamar-ci_${arch_suffix}" +fi + +if [[ -z "$service_host" ]]; then + service_host="$(hostname -s 2>/dev/null || hostname)" +fi + +declare -a proxy_candidates=() +declare -A seen_proxy=() +declare -A proxy_sources=() + +add_proxy_candidate() { + local raw="$1" + local source="$2" + local proxy + proxy="$(normalize_proxy "$raw")" + [[ -n "$proxy" ]] || return 0 + case "$proxy" in + http://*|https://*) ;; + *) return 0 ;; + esac + if [[ -z "${seen_proxy[$proxy]+_}" ]]; then + proxy_candidates+=("$proxy") + seen_proxy[$proxy]=1 + proxy_sources[$proxy]="$source" + else + proxy_sources[$proxy]="${proxy_sources[$proxy]}, $source" + fi +} + +collect_proxy_from_env() { + local name value + for name in http_proxy https_proxy HTTP_PROXY HTTPS_PROXY; do + value="${!name:-}" + [[ -n "$value" ]] && add_proxy_candidate "$value" "env:$name" + done + return 0 +} + +collect_proxy_from_file() { + local file="$1" + [[ -r "$file" ]] || return 0 + local line url + while IFS= read -r line; do + [[ "$line" =~ [Pp][Rr][Oo][Xx][Yy] ]] || continue + while IFS= read -r url; do + add_proxy_candidate "$url" "$file" + done < <(printf '%s\n' "$line" | grep -Eo 'https?://[^[:space:]"'\'',;<>]+' || true) + done < "$file" + return 0 +} + +collect_proxy_candidates() { + collect_proxy_from_env + + if [[ -n "$explicit_proxy" ]]; then + add_proxy_candidate "$explicit_proxy" "argument:--proxy" + fi + + local files=( + "${HOME}/.bashrc" + "${HOME}/.bash_profile" + "${HOME}/.profile" + "${HOME}/.zshrc" + "/etc/profile" + "/etc/environment" + ) + + shopt -s nullglob + files+=(/etc/profile.d/*.sh) + files+=("${HOME}/.config/systemd/user"/gitlab-runner-*.service) + files+=("${base_dir}/config.toml") + files+=("${HOME}"/gitlab-runner_jacamar-ci_*/config.toml) + shopt -u nullglob + + local file + for file in "${files[@]}"; do + collect_proxy_from_file "$file" + done + return 0 +} + +curl_probe() { + local url="$1" + local proxy="${2:-}" + local output status + if [[ -n "$proxy" ]]; then + output=$(env -u http_proxy -u https_proxy -u HTTP_PROXY -u HTTPS_PROXY \ + curl -I -L -sS -o /dev/null -w '%{http_code}' \ + --connect-timeout "$connect_timeout" --max-time "$max_time" \ + -x "$proxy" "$url" 2>&1) || { + printf 'FAIL %s' "$output" + return 1 + } + else + output=$(env -u http_proxy -u https_proxy -u HTTP_PROXY -u HTTPS_PROXY \ + curl -I -L -sS -o /dev/null -w '%{http_code}' \ + --connect-timeout "$connect_timeout" --max-time "$max_time" \ + "$url" 2>&1) || { + printf 'FAIL %s' "$output" + return 1 + } + fi + + status="$output" + case "$status" in + 2*|3*) printf 'HTTP %s' "$status"; return 0 ;; + *) printf 'HTTP %s' "$status"; return 1 ;; + esac +} + +check_commands() { + info "Checking local tool availability" + local cmd + for cmd in curl git tar make gcc g++ systemctl loginctl; do + if command -v "$cmd" >/dev/null 2>&1; then + ok "command found: $cmd ($(command -v "$cmd"))" + else + warn "command not found: $cmd" + fi + done +} + +check_systemd_user() { + info "Checking systemd user and linger" + if ! command -v systemctl >/dev/null 2>&1; then + warn "systemctl not found" + elif systemctl --user status >/dev/null 2>&1; then + ok "systemctl --user is usable" + systemctl --user is-system-running 2>/dev/null || true + systemctl --user show-environment 2>/dev/null | grep -Ei '^(http_proxy|https_proxy|HTTP_PROXY|HTTPS_PROXY|no_proxy|NO_PROXY)=' || true + else + ng "systemctl --user is not usable" + fi + + if command -v loginctl >/dev/null 2>&1; then + loginctl show-user "${USER:-}" -p Linger 2>/dev/null || warn "loginctl show-user failed" + else + warn "loginctl not found" + fi + + if [[ -n "$site" ]]; then + local service_name unit_path + service_name="gitlab-runner-${site}-${arch_suffix}.service" + unit_path="${HOME}/.config/systemd/user/${service_name}" + if [[ -f "$unit_path" ]]; then + ok "runner service file exists: $unit_path" + systemctl --user show "$service_name" -p Environment 2>/dev/null || true + else + warn "runner service file not found yet: $unit_path" + fi + fi +} + +check_runner_configs() { + info "Checking runner config candidates" + local config + shopt -s nullglob + for config in "${base_dir}/config.toml" "${HOME}"/gitlab-runner_jacamar-ci_*/config.toml; do + [[ -r "$config" ]] || continue + ok "runner config found: $config" + grep -nA3 -B1 'environment = ' "$config" || true + done + shopt -u nullglob +} + +print_proxy_candidates() { + info "Discovered proxy candidates" + if [[ "${#proxy_candidates[@]}" -eq 0 ]]; then + warn "no proxy candidates found" + return 0 + fi + local proxy + for proxy in "${proxy_candidates[@]}"; do + echo " - ${proxy} (${proxy_sources[$proxy]})" + done +} + +test_connectivity() { + local urls=("https://gitlab.com" "https://github.com" "$gitlab_url") + declare -A seen_url=() + declare -a unique_urls=() + local url + for url in "${urls[@]}"; do + [[ -z "${seen_url[$url]+_}" ]] || continue + seen_url[$url]=1 + unique_urls+=("$url") + done + + info "Testing direct connectivity" + local result direct_fail=0 + for url in "${unique_urls[@]}"; do + if result="$(curl_probe "$url")"; then + ok "direct ${url}: ${result}" + else + ng "direct ${url}: ${result}" + direct_fail=1 + fi + done + + declare -A proxy_ok_count=() + local proxy best_proxy="" best_count=0 count + if [[ "${#proxy_candidates[@]}" -gt 0 ]]; then + info "Testing proxy candidates" + for proxy in "${proxy_candidates[@]}"; do + proxy_ok_count[$proxy]=0 + for url in "${unique_urls[@]}"; do + if result="$(curl_probe "$url" "$proxy")"; then + ok "proxy ${proxy} -> ${url}: ${result}" + proxy_ok_count[$proxy]=$((proxy_ok_count[$proxy] + 1)) + else + ng "proxy ${proxy} -> ${url}: ${result}" + fi + done + count="${proxy_ok_count[$proxy]}" + if (( count > best_count )); then + best_count="$count" + best_proxy="$proxy" + fi + done + fi + + info "Summary" + if [[ -n "$best_proxy" && "$best_count" -gt 0 ]]; then + if (( best_count == ${#unique_urls[@]} )); then + ok "recommended proxy covers all tested URLs: ${best_proxy}" + else + warn "best proxy covers ${best_count}/${#unique_urls[@]} URLs: ${best_proxy}" + fi + echo "Suggested setup option:" + echo " --proxy ${best_proxy}" + elif [[ "$direct_fail" -eq 0 ]]; then + ok "all tested URLs are reachable without proxy" + else + warn "no working proxy candidate found; inspect site proxy settings manually" + fi +} + +info "Site runner preflight" +echo " site=${site:-}" +echo " arch=${arch}" +echo " service_host=${service_host}" +echo " base_dir=${base_dir}" +echo " gitlab_url=${gitlab_url}" +echo + +check_commands +echo +collect_proxy_candidates +print_proxy_candidates +echo +test_connectivity +echo +check_systemd_user +echo +check_runner_configs +echo +info "Done. No scheduler jobs were submitted." diff --git a/scripts/setup_site_runner.sh b/scripts/site/setup_runner.sh similarity index 92% rename from scripts/setup_site_runner.sh rename to scripts/site/setup_runner.sh index 2458750..76ceca2 100755 --- a/scripts/setup_site_runner.sh +++ b/scripts/site/setup_runner.sh @@ -30,7 +30,7 @@ runner_no_proxy="" usage() { cat <<'EOF' Usage: - setup_site_runner.sh --site SITE --gitlab-url URL --login-token TOKEN --jacamar-token TOKEN [options] + setup_runner.sh --site SITE --gitlab-url URL --login-token TOKEN --jacamar-token TOKEN [options] Required: --site SITE Site prefix used for tags if tags are omitted. @@ -56,9 +56,11 @@ Options: --jacamar-pbs-tools PATH Copy PATH to jacamar-ci/internal/executors/pbs/tools.go before build. --unrestricted-cmd-line Allow Jacamar to keep runner generated Git/token commands on the command line. Useful when GIT_ASKPASS fails. - --proxy URL Set http_proxy/https_proxy for the runner systemd service. + --proxy URL Set http_proxy/https_proxy in both the runner + config.toml environment and systemd user service. If URL has no scheme, http:// is prepended. - --no-proxy LIST Set no_proxy/NO_PROXY for the runner systemd service. + --no-proxy LIST Set no_proxy/NO_PROXY in both the runner + config.toml environment and systemd user service. --libseccomp auto|system|local|none Default: auto. Use system libseccomp if available, build local gperf/libseccomp if missing. @@ -75,7 +77,7 @@ Environment overrides: Default: -p=1 -gcflags=all=-dwarf=false. Example: - curl -fsSL https://raw.githubusercontent.com/RIKEN-RCCS/benchkit/main/scripts/setup_site_runner.sh \ + curl -fsSL https://raw.githubusercontent.com/RIKEN-RCCS/benchkit/main/scripts/site/setup_runner.sh \ | bash -s -- --arch amd64 --site genkai \ --gitlab-url https://gitlab.example.jp \ --login-token "$LOGIN_TOKEN" --jacamar-token "$JACAMAR_TOKEN" \ @@ -99,6 +101,13 @@ systemd_env_escape() { printf '%s' "$value" } +toml_string_escape() { + local value="$1" + value="${value//\\/\\\\}" + value="${value//\"/\\\"}" + printf '%s' "$value" +} + write_systemd_env() { local unit_path="$1" local name="$2" @@ -107,6 +116,13 @@ write_systemd_env() { printf 'Environment="%s=%s"\n' "$name" "$(systemd_env_escape "$value")" >> "$unit_path" } +append_runner_env() { + local name="$1" + local value="$2" + [[ -n "$value" ]] || return 0 + runner_env_entries+=", \"${name}=$(toml_string_escape "$value")\"" +} + while [[ $# -gt 0 ]]; do case "$1" in --arch) arch="${2:-}"; shift 2 ;; @@ -438,13 +454,24 @@ command_delay = "${command_delay}" EOF runner_path_env="PATH=${base_dir}/bin:/usr/local/bin:/usr/bin:/bin" +runner_env_entries="\"$(toml_string_escape "$runner_path_env")\"" +if [[ -n "$runner_proxy" ]]; then + append_runner_env "http_proxy" "$runner_proxy" + append_runner_env "https_proxy" "$runner_proxy" + append_runner_env "HTTP_PROXY" "$runner_proxy" + append_runner_env "HTTPS_PROXY" "$runner_proxy" +fi +if [[ -n "$runner_no_proxy" ]]; then + append_runner_env "no_proxy" "$runner_no_proxy" + append_runner_env "NO_PROXY" "$runner_no_proxy" +fi login_template="${base_dir}/login-runner.template.toml" jacamar_template="${base_dir}/jacamar-runner.template.toml" cat > "$login_template" < "$jacamar_template" <