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 1

Il-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.

Artikli relatati