የኮዲንግ ወኪል ባህሪው እንደሚሠራ ይናገራል። ምናልባትም እውነት ነው። የጻፋቸው ሙከራዎች ያልፋሉ፣ ይህም ሁሉም ከሚፈልገው ያነሰ ነገር ያረጋግጣል። በእርግጥ የሚፈልጉት ተጠቃሚዎች ጋር ከመቅረቡ በፊት በአሳሽ ከፍተው ማየት ነው፣ ያውም ወኪሉ ምርትን እንዲነካ ሳይጠይቁ።
የቅድመ እይታ አካባቢዎች ይህን ይፈታሉ፣ ለዚህም መድረክ አያስፈልግም። የራሱ IPv4 ያለው አንድ VPS፣ Docker፣ Caddy እና ሁለት አጫጭር ስክሪፕቶች ለእያንዳንዱ ቅርንጫፍ እንደ https://feature-login-form.preview.example.com ያለ የራሱን URL ይሰጣሉ፤ ከይለፍ ቃል ጀርባ፣ በእያንዳንዱ push እንደገና ይገነባል። ወኪሉ ቅድመ እይታዎችን ማስጀመርና ማቆም የሚችል፣ ሌላ ምንም የማይችል SSH ቁልፍ ያገኛል።
ይህን በሙከራ ሰርቨር ላይ ገንብተን ከመጻፋችን በፊት ሙሉውን ዑደት አስኬደነዋል፦ መፍጠር፣ መክፈት፣ እንደገና push ማድረግ፣ ማፍረስ፣ ቁልፉን አላግባብ ለመጠቀም መሞከር።
የሚያስፈልግዎ
- ሕዝባዊ IPv4 ያለው VPS። AI-Agent-IP በአንድ ጊዜ ለበርካታ ቅድመ እይታዎች ቦታ አለው።
- የwildcard DNS መዝገብ፦
*.preview.example.com→ የሰርቨሩ IP። - በፖርት 8080 የሚያገለግል
Dockerfileያለው የመተግበሪያዎ ማከማቻ። ማንኛውም ቋንቋ ይሠራል። apt install -y docker.io caddy gitየተጫነበት Ubuntu 24.04 ወይም Debian 12/13።
ማከማቻውን ለማንበብ ብቻ በሚያገለግል የdeploy ቁልፍ አንድ ጊዜ ወደ /srv/app ይቅዱት።
ሁለቱ ስክሪፕቶች
/usr/local/bin/preview-up አንድን ቅርንጫፍ ገንብቶ በመስመር ላይ ያወጣዋል፦
#!/usr/bin/env bash
# preview-up <branch> — build the branch and open it at https://<name>.preview.example.com
set -euo pipefail
BRANCH="$1"
NAME=$(printf '%s' "$BRANCH" | tr '[:upper:]' '[:lower:]' | tr -c 'a-z0-9' '-' | sed 's/--*/-/g; s/^-//; s/-$//' | cut -c1-40)
DIR=/srv/previews/$NAME
git -C /srv/app fetch --quiet origin "$BRANCH"
rm -rf "$DIR"; git -C /srv/app worktree prune
git -C /srv/app worktree add --quiet --force --detach "$DIR" FETCH_HEAD
docker build --quiet -t "preview-$NAME" "$DIR" >/dev/null
docker rm -f "preview-$NAME" >/dev/null 2>&1 || true
docker run -d --name "preview-$NAME" --restart unless-stopped --memory 512m -p 127.0.0.1::8080 "preview-$NAME" >/dev/null
PORT=$(docker port "preview-$NAME" 8080/tcp | head -1 | awk -F: '{print $NF}')
cat > "/etc/caddy/previews/$NAME.caddy" <<CADDY
$NAME.preview.example.com {
import preview_common
reverse_proxy 127.0.0.1:$PORT
}
CADDY
systemctl reload caddy
echo "https://$NAME.preview.example.com"
/usr/local/bin/preview-down ያስወግደዋል፦
#!/usr/bin/env bash
# preview-down <branch> — remove the branch preview
set -euo pipefail
NAME=$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]' | tr -c 'a-z0-9' '-' | sed 's/--*/-/g; s/^-//; s/-$//' | cut -c1-40)
docker rm -f "preview-$NAME" >/dev/null 2>&1 || true
docker image rm "preview-$NAME" >/dev/null 2>&1 || true
rm -f "/etc/caddy/previews/$NAME.caddy"; rm -rf "/srv/previews/$NAME"; git -C /srv/app worktree prune
systemctl reload caddy
እዚያ ውስጥ ያሉ አንዳንድ ምርጫዎች ሆን ተብለው የተደረጉ ናቸው። ኮንቴይነሮቹ የሚታተሙት በ127.0.0.1 ላይ በዘፈቀደ ፖርት ብቻ ነው፣ ስለዚህ ከCaddy በስተቀር ምንም አይደርስባቸውም። ይህ አስፈላጊ ነው፣ ምክንያቱም Docker የሚያትማቸው ፖርቶች ufwን ያልፋሉ። እያንዳንዱ ቅድመ እይታ 512 MB የማህደረ ትውስታ ገደብ አለው፣ ስለዚህ ከቁጥጥር የወጣ አንድ ቅርንጫፍ ሌሎቹን አይጥልም። ያንኑ ቅርንጫፍ እንደገና ማስኬድ በቦታው እንደገና ይገነባዋል፦ push፣ up ማስኬድ፣ ማደስ።
Caddy፦ ለእያንዳንዱ ቅድመ እይታ አንድ ፋይል፣ ለሁሉም አንድ የይለፍ ቃል
mkdir -p /etc/caddy/previews /srv/previews
chmod +x /usr/local/bin/preview-up /usr/local/bin/preview-down
caddy hash-password --plaintext 'choose-a-review-password'
hashን በ/etc/caddy/Caddyfile ውስጥ ያስገቡ፦
(preview_common) {
basicauth {
reviewer PASTE-THE-HASH-HERE
}
}
import /etc/caddy/previews/*.caddy
ከዚያ systemctl reload caddy። አሁን እያንዳንዱ ቅድመ እይታ ከአንድ የመግቢያ ጀርባ ነው፣ ስለዚህ የስሕተት ማረሚያ ውጤት ያለው ግማሽ የተጠናቀቀ ቅርንጫፍ በክፍት ኢንተርኔት ላይ አይቀመጥም። በአዳዲስ የCaddy ስሪቶች ይህ መመሪያ basic_auth ተብሎም ይጻፋል፤ basicauth በሁለቱም አሁንም ይሠራል።
የወኪሉ ቁልፍ፦ up እና down፣ ሌላ ምንም
ወኪሉ ቅድመ እይታዎችን ማስነሳት ነው የሚያስፈልገው፣ ሰርቨሩን መያዝ አይደለም። deploy ተጠቃሚና በትክክል ሁለት ትዕዛዞችን የሚቀበል የበር ስክሪፕት ይፍጠሩ፦
#!/usr/bin/env bash
# /usr/local/bin/preview-gate — the only thing the agent's key may run
set -euo pipefail
read -r ACTION BRANCH EXTRA <<< "${SSH_ORIGINAL_COMMAND:-}"
[[ -z "${EXTRA:-}" && "${BRANCH:-}" =~ ^[A-Za-z0-9][A-Za-z0-9._/-]{0,99}$ && "$BRANCH" != *..* ]] || { echo "usage: up|down <branch>" >&2; exit 2; }
case "$ACTION" in
up) exec sudo /usr/local/bin/preview-up "$BRANCH" ;;
down) exec sudo /usr/local/bin/preview-down "$BRANCH" ;;
*) echo "usage: up|down <branch>" >&2; exit 2 ;;
esac
useradd -m -s /bin/bash deploy
echo 'deploy ALL=(root) NOPASSWD: /usr/local/bin/preview-up, /usr/local/bin/preview-down' > /etc/sudoers.d/preview
chmod 440 /etc/sudoers.d/preview && visudo -cf /etc/sudoers.d/preview
chmod 755 /usr/local/bin/preview-gate
በ/home/deploy/.ssh/authorized_keys ውስጥ የወኪሉን ሕዝባዊ ቁልፍ ከዚያ ስክሪፕት ጋር ያስሩ፦
restrict,command="/usr/local/bin/preview-gate" ssh-ed25519 AAAA... coding-agent
ወኪሉ ከሚሠራበት ማሽን፦
ssh deploy@preview.example.com up feature/login-form
# https://feature-login-form.preview.example.com
ssh deploy@preview.example.com down feature/login-form
በሙከራችን up ቅርንጫፉን ገንብቶ አሳተመ፣ ከአዲስ commit በኋላ ሁለተኛው up አዲሱን ስሪት አቀረበ፣ down ደግሞ ኮንቴይነሩንና ጣቢያውን አስወገደ። በዚያ ቁልፍ cat /etc/shadow፣ up x; id፣ እንደ -x ወይም a/../b ያሉ የቅርንጫፍ ስሞች ወይም በይነተገናኝ መግቢያ የተደረጉ ሙከራዎች ሁሉ ያገኙት usage: up|down <branch> ብቻ ነው። የቅርንጫፍ ስም በፊደል ወይም በአሃዝ መጀመር አለበት፣ .. ሊይዝም አይችልም።
ከወኪሉ ጋር ማገናኘት
በClaude Code ወይም በCodex፣ በፕሮጀክቱ የመመሪያ ፋይል ውስጥ አንድ መስመር በቂ ነው፦
ቅርንጫፍ push ካደረግክ በኋላ
ssh deploy@preview.example.com up <branch>አስኪድና የታተመውን URL በማጠቃለያህ ውስጥ አስገባ። ቅርንጫፉ ሲዋሃድ ወይም ሲተውdownአስኪድ።
CIዎ አስቀድሞ በእያንዳንዱ push የሚሠራ ከሆነ፣ ያንኑ ትዕዛዝ ከዚያ ይጥሩ፣ ቁልፉንም ከወኪሉ አካባቢ ሙሉ በሙሉ ያርቁ። ይህ ይበልጥ ጥብቅ አማራጭ ነው፣ ከግል ፕሮጀክት ላለፈ ማንኛውም ነገር እኛ ይህን እንመርጣለን።
መከታተል ያለብዎ
- ዲስክ። እያንዳንዱ ግንባታ የምስል ንብርብሮችን ይተዋል። ሳምንታዊ cron በ
docker image prune -fይህን ይቆጣጠራል፤downየቅድመ እይታውን የራሱን ምስል አስቀድሞ ይሰርዛል። - ማንም የማይዘጋቸው ቅርንጫፎች። ወኪሎች ከሰዎች ይበልጥ ብዙ ቅርንጫፎችን ይከፍታሉ። ከአንድ ሳምንት በላይ የቆዩ
preview-*ኮንቴይነሮችን ዘርዝሮ በእነሱ ላይpreview-downየሚያስኬድ cron ሃያ የተረሱ ቅድመ እይታዎችን ከማግኘት ያድንዎታል። - ሚስጥሮች። ቅድመ እይታዎች በሙከራ ምስክርነቶች መሥራት አለባቸው። የbasic auth የይለፍ ቃል የማያውቋቸውን ያርቃል፣ ነገር ግን ቅድመ እይታን ከምርት የመረጃ ቋት ጋር ማገናኘትን ትክክል አያደርገውም።
- የግንባታ ጊዜ። ምስሎች በሰርቨሩ ላይ ይገነባሉ፣ ስለዚህ ከባድ ግንባታ ከሚሠሩ ቅድመ እይታዎች ጋር ለCPU ይወዳደራል። ግንባታዎች ደቂቃዎችን ከወሰዱ፣ በCI ውስጥ ገንብተው ምስሉን ይጎትቱ።
ወኪሉ ራሱ በዚህ ሰርቨር ላይ መኖር የለበትም። የሚኖር ከሆነ፣ ለClaude Code VPS ይመልከቱ፣ ያንን ሰርቨር ራሱ አዝዞ እንዲንከባከብ ደግሞ ከEQVPS MCP ሰርቨር ጋር ያገናኙት። ያው ማሽን የቡድንዎን MCP መግቢያ በር ማስተናገድም ይችላል። ያለ ምንም ሰርቨር የማይታመን ኮድ ለማስኬድ ሳንድቦክሶች አሉ፣ የራሳቸው IPv4 ያላቸው እቅዶች ደግሞ በወር ከ$8 ይጀምራሉ።
አስተያየቶች
እስካሁን አስተያየቶች የሉም። መጀመሪያ ይሁኑ።