GitHub Actions ma jilħaqx lill-VPN tiegħek: runner tiegħek jew mina
Runner ospitat huwa VM ġdid barra n-network tiegħek. Jew poġġi runner ġewwa dak in-network, jew agħmel mina mill-job u stenna rotta vera.
Il-pass tad-deploy tiegħek jiddendel fuq hostname intern waqt li l-istess kmand iwieġeb mill-ewwel mil-laptop tiegħek, u l-build tal-client fuq iż-żewġ magni huwa identiku. Il-job qed jaħdem fuq runner ospitat minn GitHub: magna virtwali maħluqa għal dak il-job wieħed fil-cloud ta' GitHub, mingħajr rotta lejn l-ispazju tal-indirizzi privat tiegħek, mingħajr entrata resolver għaż-żona interna u mingħajr ċertifikat li l-endpoint privat se jaċċetta. Żewġ disinji biss jaqblu ma' dan il-limitazzjoni, u l-ebda wieħed minnhom ma jista' jinxtegħel aktar tard mingħajr ma jerġa' jinbena l-workflow. Agħżel bejniethom qabel l-ewwel linja YAML, għax il-migrazzjoni wara tiswa aktar mill-ewwel tentattiv.
L-għażla hija bejn runner imqiegħed fejn in-network diġà jispiċċa u mina li tgħix eżattament job wieħed. It-tnejn ilhom iġorru deploy tal-produzzjoni għal snin, u jonqsu b'modi differenti.
Fejn tassew tinsab il-fruntiera
Kull ma tinstalla fuq il-laptop jieqaf fil-laptop, u kull ma tinstalla waqt job jisparixxi mar-runner. M'hemmx namespace tan-network permanenti li client jibqa' mqabbad miegħu bejn ġirjiet, għalhekk kull ġirja tibda mill-istess stat mhux aċċessibbli. Azure tiddokumenta din il-fruntiera għall-aġenti ospitati minn Microsoft, fejn il-konnessjonijiet VPN u ExpressRoute f'netwerks privati mhumiex appoġġjati, u r-runners ospitati minn GitHub iġorru l-istess forma ta' restrizzjoni minflok mekkaniżmu separat. Aqrah bħala propjetà tal-prodott, mhux bħala difett li għandu jiġi evitat.
L-ebda setting tar-repository ma jallax dan. It-tikketta tal-job tiddeċiedi liema pool jieħu x-xogħol, u tikketta ospitata tfisser magna barra mill-perimetru tiegħek għall-ġirja kollha.
Għalhekk l-aċċessibilità privata trid tiġi minn xi ħaġa li hija tiegħek. Runner imqiegħed fejn in-network diġà jispiċċa, jew mina li tgħix job wieħed. Il-bqija tal-artiklu jitratta l-ħlas b'mod intenzjonat għal waħda minn dawn, minflok ma tiskopri l-kont fil-produzzjoni.
Iddeċiedi skont il-frekwenza tal-ġirjiet, mhux skont il-familjarità
Uża runner tiegħek fil-VPC jew fin-network tal-uffiċċju meta d-deploys jaslu diversi darbiet kuljum, meta l-job imiss aktar minn port privat wieħed, jew meta tim tal-pjattaforma diġà jieħu ħsieb il-patching u r-rotazzjoni tal-kredenzjali. Job fuq dik il-magna jsolvi u jirrotta bħal kull host ieħor wara l-firewall. Ix-xogħol tan-network isir darba, fl-installazzjoni, mhux f'kull ġirja.
Ibni l-mina fil-job meta l-aċċess ikun okkażjonali u ma tridx aġent ta' ħajja twila li jżomm kredenzjali fin-network tiegħek. Il-job isir il-client tan-network tiegħu stess għal ftit minuti u ma jħalli xejn warajh, li spiss huwa l-punt kollu.
Stenna l-ispiża tal-mina qabel tagħżilha. Kull ġirja tħallas għall-materjalizzazzjoni tal-profil, it-tnedija tal-client, l-istat lest u t-tneħħija. Mina li titla' imma qatt ma tiġi verifikata tipproduċi deploy li jonqos nofs triq u jħalli stat privat f'forma li ħadd ma pplanaha. It-tentattiv mill-ġdid wara dan rari jkun nadif, u t-tieni falliment normalment jiġi attribwit lill-verżjoni tal-client.
Tikteb il-profil biex il-pass ma jistax jitwaqqaf
Żomm il-profiles u l-kredenzjali barra mir-repository u materjalizzahom minn secret fil-pass li għandu bżonnhom. L-ordni tiddeċiedi jekk il-job jgħixx: fajl maħluq taħt sudo jappartjeni lir-root, u l-shell tal-pass mingħajr privileġġi ma jistax jibqa' jikteb fih.
- name: Bring up OpenVPN
run: |
umask 077
profile="$RUNNER_TEMP/client.ovpn"
printf '%s\n' "$VPN_PROFILE" > "$profile"
: > "$RUNNER_TEMP/openvpn.log"
printf '%s\n' "$VPN_CREDENTIALS" > "$RUNNER_TEMP/credentials.txt"
sudo openvpn --daemon openvpn-job \
--config "$profile" \
--auth-user-pass "$RUNNER_TEMP/credentials.txt" \
--writepid "$RUNNER_TEMP/openvpn.pid" \
--log "$RUNNER_TEMP/openvpn.log"Iż-żewġ dettalji f'dak il-blokk huma għall-passi li ġejjin. Permezz ta' umask 077, il-profil jinżel fil-modalità 0600 u jappartjeni lill-utent tar-runner, sudo xorta jista' jaqrah, u l-client jikteb il-log tiegħu fi fajl li r-runner diġà għandu, għalhekk il-linja tal-istat lest tista' taqra dak il-log mingħajr sudo ieħor. --writepid jirreġistra l-PID li t-tneħħija se timmira lejh.
Profil li jawtentika b'ċertifikat tal-client jeħtieġlu ċ-ċavetta miktuba bl-istess mod, u profil static-challenge jeħtieġlu l-modalità tal-auth li taqbel. Profiles li jimbottaw għażliet DNS jeħtieġulhom openvpn-systemd-resolved fuq Ubuntu u Debian, għax il-botthat waħdu ma jbiddel xejn fuq immaġni bażi.
L-istat lest huwa sonda, mhux pawża
Sleep fiss jiflaħ eżatt sal-mument li l-konċentratur jonqos, u mbagħad il-pass tad-deploy jaħdem qabel ma teżisti r-rotta. Il-falliment imbagħad joħroġ ġewwa l-għodda tad-deploy bħala timeout lejn il-host privat, li ma jgħid xejn dwar il-mina.
- name: Await private endpoint
run: |
for attempt in $(seq 1 30); do
if getent hosts private.example.internal > /dev/null && \
timeout 3 bash -c 'exec 3<>/dev/tcp/private.example.internal/8443' 2>/dev/null; then
echo "endpoint answered after $attempt attempts"
exit 0
fi
sleep 2
done
grep -Ei 'error|verify|auth' "$RUNNER_TEMP/openvpn.log" | tail -40
exit 1Il-linja tosserva żewġ affarijiet għax kwalunkwe minnhom tista' tkun in-nofs miksur. getent hosts jipprova li r-resolver imbotthat iwieġeb għal dak l-isem, u l-ftuħ tas-socket jipprova li xi ħaġa qed tisma' fuq il-port li se juża d-deploy; profil b'rotta biss jeħtieġ l-indirizz litterali u l-linja getent imħassra.
Meta l-linja tiskadi, il-log huwa l-unika ħaġa li tifred tliet fallimenti differenti: ċertifikat miċħud, modalità auth ħażina u rotta li qatt ma waslet. L-ifflitrar qabel it-tail iżomm dak l-output qasir biżżejjed biex jinqara waqt li l-job għadu jonqos. Aqra l-ewwel error mhux l-aħħar linja, għax client li ma jistax jawtentika jirrepeti ruħu sakemm il-linja tagħti. ip -4 route show dev tun0 iwieġeb il-mistoqsija aktar sempliċi jekk rotta ġietx imbuttata xorta, u jiswa linja waħda fl-istess linja.
Tneħħija u l-kwistjoni tal-artifact
Agħlaq il-job b'pass protett minn if: always() li jwettaq sudo kill "$(sudo cat "$RUNNER_TEMP/openvpn.pid")" u xejn aktar. Fuq runner tiegħek maqsum qatt toqtolx bl-isem tal-proċess: job ieħor jista' jkollu client bl-istess binary u argumenti simili. Il-falliment imbagħad jaqa' fuq il-job li ġera t-tieni, u l-log tiegħu jindika workflow li ma għamel xejn ħażin.
Il-protezzjoni hija importanti għax deploy li jonqos xorta jħalli mina ħajja. Mingħajr always() il-pass tat-tindif jiġi skippjat eżattament meta jkun meħtieġ, u l-ġirja li jmiss tibda kontra client li diġà huwa konness.
Tifdal mistoqsija waħda qabel ma tadotta kwalunkwe disinn: il-fażi tal-build tassew teħtieġ rotta privata? Aġent tad-deployment li diġà jinsab fin-network jista' jiġbed artifact approvat, u dan iżomm il-builds ordinarji 'l bogħod mill-mogħdija privata. Inqas jobs li jżommu mina jfisser inqas postijiet fejn rotta antika tista' tinħeba.