834595df6b
Единый workspace.local.env для адресов и паролей, init-machine, Set-GitRemotes, push-safe и check-no-secrets для политики kalinamall/github.
145 lines
4.0 KiB
Bash
145 lines
4.0 KiB
Bash
#!/usr/bin/env bash
|
|
# Общие функции workspace-bootstrap
|
|
set -Eeuo pipefail
|
|
|
|
BOOTSTRAP_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
|
|
die() { echo "workspace-bootstrap: error: $*" >&2; exit 1; }
|
|
log() { echo "[bootstrap] $*"; }
|
|
|
|
load_workspace_env() {
|
|
local env_file="${WORKSPACE_ENV:-$BOOTSTRAP_ROOT/config/workspace.local.env}"
|
|
[[ -f $env_file ]] || die "нет $env_file — скопируйте config/workspace.local.env.example и заполните"
|
|
# shellcheck source=/dev/null
|
|
set -a
|
|
source "$env_file"
|
|
set +a
|
|
}
|
|
|
|
detect_os() {
|
|
case "$(uname -s)" in
|
|
Darwin) echo mac ;;
|
|
MINGW* | MSYS* | CYGWIN*) echo win ;;
|
|
*) echo linux ;;
|
|
esac
|
|
}
|
|
|
|
ssh_home() {
|
|
if [[ $(detect_os) == win ]]; then
|
|
if [[ -n ${HOME:-} ]]; then printf '%s/.ssh' "$HOME"
|
|
else printf '%s/.ssh' "$USERPROFILE"
|
|
fi
|
|
else
|
|
printf '%s/.ssh' "$HOME"
|
|
fi
|
|
}
|
|
|
|
projects_dir() {
|
|
local os
|
|
os=$(detect_os)
|
|
if [[ $os == mac ]]; then
|
|
# shellcheck disable=SC2086
|
|
eval echo "${PROJECTS_DIR_MAC:-$HOME/Documents/Cursor/Projects}"
|
|
elif [[ $os == win ]]; then
|
|
echo "${PROJECTS_DIR_WIN:-$HOME/Projects}"
|
|
else
|
|
eval echo "${PROJECTS_DIR_MAC:-$HOME/projects}"
|
|
fi
|
|
}
|
|
|
|
ssh_key_path() {
|
|
printf '%s/%s' "$(ssh_home)" "${SSH_KEY_BASENAME:-id_ed25519_kalinamall}"
|
|
}
|
|
|
|
expand_path() {
|
|
local p=$1
|
|
if [[ $p == ~* ]]; then
|
|
p="${p/#\~/$HOME}"
|
|
fi
|
|
printf '%s' "$p"
|
|
}
|
|
|
|
render_template() {
|
|
local template=$1 dest=$2
|
|
local key_path
|
|
key_path=$(ssh_key_path)
|
|
[[ -f $key_path ]] || key_path="${key_path}.example"
|
|
sed \
|
|
-e "s|__SSH_KEY_PATH__|$key_path|g" \
|
|
-e "s|__GITEA_KALINAMALL_HOST__|${GITEA_KALINAMALL_HOST}|g" \
|
|
-e "s|__GITEA_KALINAMALL_HOST_PUBLIC__|${GITEA_KALINAMALL_HOST_PUBLIC}|g" \
|
|
-e "s|__GITEA_KALINAMALL_SSH_PORT__|${GITEA_KALINAMALL_SSH_PORT}|g" \
|
|
-e "s|__GITEA_HOME_HOST__|${GITEA_HOME_HOST}|g" \
|
|
-e "s|__GITEA_HOME_HOST_PUBLIC__|${GITEA_HOME_HOST_PUBLIC}|g" \
|
|
-e "s|__GITEA_HOME_SSH_PORT__|${GITEA_HOME_SSH_PORT}|g" \
|
|
-e "s|__SSH_HAPROXY_IP__|${SSH_HAPROXY_IP}|g" \
|
|
-e "s|__SSH_HAPROXY_USER__|${SSH_HAPROXY_USER}|g" \
|
|
"$template" >"$dest"
|
|
}
|
|
|
|
merge_ssh_config() {
|
|
local block_file=$1
|
|
local ssh_config
|
|
ssh_config="$(ssh_home)/config"
|
|
mkdir -p "$(ssh_home)"
|
|
touch "$ssh_config"
|
|
if grep -q 'BEGIN WORKSPACE-BOOTSTRAP' "$ssh_config" 2>/dev/null; then
|
|
local tmp
|
|
tmp=$(mktemp)
|
|
awk '/# BEGIN WORKSPACE-BOOTSTRAP/{skip=1} !skip{print} /# END WORKSPACE-BOOTSTRAP/{skip=0}' "$ssh_config" >"$tmp"
|
|
mv "$tmp" "$ssh_config"
|
|
fi
|
|
{
|
|
echo ""
|
|
echo "# BEGIN WORKSPACE-BOOTSTRAP"
|
|
cat "$block_file"
|
|
echo "# END WORKSPACE-BOOTSTRAP"
|
|
} >>"$ssh_config"
|
|
chmod 600 "$ssh_config" 2>/dev/null || true
|
|
}
|
|
|
|
each_repo() {
|
|
local repos_file="$BOOTSTRAP_ROOT/config/repos.yaml"
|
|
[[ -f $repos_file ]] || die "missing $repos_file"
|
|
awk '
|
|
/^ - name:/ { if (n != "") print n, gh; n = $3; gh = 0 }
|
|
/github: true/ { gh = 1 }
|
|
/github: false/ { gh = 0 }
|
|
END { if (n != "") print n, gh }
|
|
' "$repos_file"
|
|
}
|
|
|
|
github_repo_name() {
|
|
local name=$1
|
|
local repos_file="$BOOTSTRAP_ROOT/config/repos.yaml"
|
|
local custom
|
|
custom=$(awk -v repo="$name" '
|
|
$0 ~ "- name: " repo { found=1; next }
|
|
found && /github_name:/ { print $2; exit }
|
|
' "$repos_file")
|
|
if [[ -n $custom ]]; then
|
|
echo "$custom"
|
|
else
|
|
echo "$name"
|
|
fi
|
|
}
|
|
|
|
kalinamall_remote_url() {
|
|
local repo=$1
|
|
printf 'ssh://git@%s:%s/%s/%s.git' \
|
|
"$GITEA_KALINAMALL_HOST" "$GITEA_KALINAMALL_SSH_PORT" "$GITEA_KALINAMALL_ORG" "$repo"
|
|
}
|
|
|
|
home_remote_url() {
|
|
local repo=$1
|
|
printf 'ssh://git@%s:%s/%s/%s.git' \
|
|
"$GITEA_HOME_HOST" "$GITEA_HOME_SSH_PORT" "$GITEA_HOME_ORG" "$repo"
|
|
}
|
|
|
|
github_remote_url() {
|
|
local repo=$1
|
|
local gh_name
|
|
gh_name=$(github_repo_name "$repo")
|
|
printf 'git@%s:%s/%s.git' 'github.com' "$GITHUB_USER" "$gh_name"
|
|
}
|