GitHub Actions kò dé VPN rẹ: runner tirẹ tabi tunnel
Runner tí a gbàlejò jẹ VM tuntun ní ita nẹtiwọọki rẹ. Fi runner sínú nẹtiwọọki yẹn, tabi ṣe tunnel láti inú job kí o sì dúró de ọ̀nà gidi.
Ìgbésẹ̀ deploy rẹ dúró lórí hostname inú, nígbà tí ọ̀rọ̀ kan náà ń dáhùn lẹ́sẹ̀kẹsẹ̀ láti kọ̀mpútà rẹ, àti client build lórí ẹ̀rọ méjèèjì jẹ́ ọ̀kan náà. Job ń ṣiṣẹ́ lórí runner tí GitHub gbàlejò: ẹ̀rọ ṣíṣe tuntun tí a ṣe fún job yẹn gan-an nínú àwọsánmà GitHub, láìsí ọ̀nà sí àyè àdírẹ́sì aládàáni rẹ, láìsí àkọsílẹ̀ resolver fún agbègbè inú àti láìsí ẹ̀rí tí endpoint aládàáni yóò gbà. Àwọn ẹ̀rọ-orí méjì péré ló bá ìdíwọ́ yẹn mu, kò sì sí ọ̀kan tí a lè tan lẹ́yìn náà láìtún workflow kọ. Yan láàárín wọn kí ó tó di ìlà YAML àkọ́kọ́, nítorí gbígbé lẹ́yìn náà ná owó ju ìgbìyànjú àkọ́kọ́ lọ.
Yíyàn náà wà láàárín runner tí a gbé sí ibi tí nẹtiwọọki ti parí àti tunnel tí ó wà nígbà job kan péré. Àwọn méjèèjì ti ru deploy ìṣelọ́pọ̀ fún ọ̀pọ̀lọpọ̀ ọdún, wọ́n sì ń kùnà ní ọ̀nà ọ̀tọ̀ọ̀tọ̀.
Ibi tí ààlà wà ní ti gidi
Ohunkóhun tí o fi sórí kọ̀mpútà máa dúró ní kọ̀mpútà, ohunkóhun tí o fi sórí nígbà job máa pòórá pẹ̀lú runner. Kò sí namespace nẹtiwọọki tí ó dúró pẹ́ tí client lè rọ̀ mọ́ láàárín àwọn ìṣísẹ̀, nítorí náà ìṣísẹ̀ kọ̀ọ̀kan bẹ̀rẹ̀ ní ipò kan náà tí kò ṣe é dé. Azure ṣe àkọsílẹ̀ ààlà yìí fún àwọn agent tí Microsoft gbàlejò, níbi tí a kò ti ṣe àtìlẹ́yìn fún ìsopọ̀ VPN àti ExpressRoute sínú nẹtiwọọki aládàáni, àwọn runner tí GitHub gbàlejò sì ru irú ìdíwọ́ kan náà dípò ẹ̀rọ-orí ọ̀tọ̀. Ka èyí gẹ́gẹ́ bí ẹ̀yà ọjà, kì í ṣe àbùkù tí a gbọ́dọ̀ yẹ̀ sílẹ̀.
Kò sí ètò repository tí ó máa mú èyí rọrùn. Àmì job ló ń pinnu irú pool tí yóò gbé iṣẹ́ náà, àmì gbígbàlejò sì túmọ̀ sí ẹ̀rọ tí ó wà ní ita ààlà rẹ fún gbogbo ìṣísẹ̀.
Nítorí náà ìdèésí aládàáni gbọ́dọ̀ wá láti inú ohun tí o ní. Runner tí a gbé sí ibi tí nẹtiwọọki ti parí, tàbí tunnel tí ó ń gbé job kan. Ìyókù àpilẹ̀kọ náà jẹ́ nípa sísan fún ọ̀kan lára àwọn méjèèjì pẹ̀lú ìmọ̀, dípò kí o ṣàwárí bílì ní ìṣelọ́pọ̀.
Pinnu nípa ìgbà ìṣísẹ̀, kì í ṣe nípa ìmọ̀ràn
Lo runner tirẹ nínú VPC tàbí nẹtiwọọki ọ́fíìsì nígbà tí deploy bá ń dé lọ́pọ̀ ìgbà lójúmọ́, nígbà tí job bá kan ju port aládàáni kan lọ, tàbí nígbà tí ẹgbẹ́ pẹpẹ ti ń ṣe àtúnṣe àti yíyí ẹ̀rí. Job lórí ẹ̀rọ yẹn yóò yanjú àti darí bíi gbogbo host mìíràn lẹ́yìn firewall. Iṣẹ́ nẹtiwọọki ṣẹlẹ̀ lẹ́ẹ̀kan, nígbà fífi sórí, kì í ṣe ní gbogbo ìṣísẹ̀.
Kọ tunnel nínú job nígbà tí ààyè jẹ́ lẹ́ẹ̀kọ̀ọ̀kan tí o kò sì fẹ́ agent alẹ́mìí gbé ẹ̀rí sínú nẹtiwọọki rẹ. Job yóò di client nẹtiwọọki tirẹ̀ fún ìṣẹ́jú díẹ̀ kò sì fi ohunkóhun sílẹ̀, èyí tí ó sábà jẹ́ gbogbo ète.
Ṣe àfojúsùn iye tunnel kí o tó yàn án. Ìṣísẹ̀ kọ̀ọ̀kan san fún ṣíṣe profile, ìbẹ̀rẹ̀ client, ìṣetán àti wíwó. Tunnel tí ó gbé sókè ṣùgbọ́n tí a kò gbà wò rárá máa ń mú deploy tí ó kùnà ní àárín àti fi ipò aládàáni sílẹ̀ ní irú tí kò sí ẹnikẹ́ni tí ó gbèrò. Ìgbìyànjú tún náà lẹ́yìn náà kì í sábà mọ́, a sì máa ń fi ìkùnà kejì sí ẹrù version client.
Kíkọ profile kí ìgbésẹ̀ má baà dáwọ́
Pa profile àti ẹ̀rí mọ́ ní ita repository kí o sì ṣe wọ́n láti inú secret ní ìgbésẹ̀ tí ó nílò wọn. Ìtòlẹ́sẹẹsẹ ló ń pinnu bóyá job yóò là á: fáìlì tí a ṣe lábẹ́ sudo jẹ́ ti root, shell ìgbésẹ̀ tí kò ní àṣẹ kò sì lè kọ sínú rẹ̀ mọ́.
- 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"Àwọn àlàyé méjèèjì nínú blọ́ọ̀kì yẹn wà fún àwọn ìgbésẹ̀ tó ń bọ̀. Pẹ̀lú umask 077 profile yóò balẹ̀ ní ipò 0600 tí ó jẹ́ ti olùlò runner, sudo ṣì lè kà á, client sì kọ log rẹ̀ sínú fáìlì tí runner ti ní, nítorí náà ìyípo ìṣetán lè ka log yẹn láìsí sudo kejì. --writepid forúkọ PID tí wíwó yóò dojú kọ.
Profile tí ó ń fi ẹ̀rí client jẹ́rìí nílò ìfọkàn rẹ̀ ní ọ̀nà kan náà, profile static-challenge sì nílò ipò auth tí ó bá mu. Àwọn profile tí ń ti àwọn àṣàyàn DNS jáde nílò openvpn-systemd-resolved lórí Ubuntu àti Debian, nítorí títì náà nìkan kò yí ohunkóhun padà lórí àwòrán ìpìlẹ̀.
Ìṣetán jẹ́ ìwádìí, kì í ṣe ìdádúró
Sleep àìyẹsẹ̀ máa ń dúró gan títí di ìgbà tí concentrator bá lọ́ra, lẹ́yìn náà ìgbésẹ̀ deploy máa ṣiṣẹ́ kí ọ̀nà tó wà. Ìkùnà yóò wá farahàn nínú irinṣẹ́ deploy gẹ́gẹ́ bí timeout sí host aládàáni, èyí tí kò sọ ohunkóhun nípa tunnel.
- 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Ìyípo náà ń wo ohun méjì nítorí ọ̀kọ̀ọ̀kan wọn lè jẹ́ ìdajì tí ó já. getent hosts fi hàn pé resolver tí a tì ń dáhùn fún orúkọ yẹn, ṣíṣí socket sì fi hàn pé ohun kan ń gbọ́ lórí port tí deploy yóò lò; profile tí ó ní ọ̀nà nìkan nílò àdírẹ́sì gidi àti kíkúrò ìlà getent.
Nígbà tí ìyípo bá tán, log ni ohun kan ṣoṣo tí ó ya àwọn ìkùnà mẹ́ta sọ́tọ̀: ẹ̀rí tí a kọ̀, ipò auth tí kò tọ́ àti ọ̀nà tí kò dé rárá. Sísẹ́ ṣáájú tail máa ń jẹ́ kí àbájáde yẹn kúrú tó láti kà nígbà tí job ṣì ń kùnà. Ka àṣìṣe àkọ́kọ́ dípò ìlà ìkẹyìn, nítorí client tí kò lè jẹ́rìí máa ń tún ara rẹ̀ ṣe títí ìyípo yóò fi juwọ́ sílẹ̀. ip -4 route show dev tun0 dáhùn ìbéèrè tí ó rọrùn jù pé bóyá a tì ọ̀nà kan rárá, ó sì ná ìlà kan nínú ìyípo kan náà.
Wíwó àti ìbéèrè artifact
Pa job mọ́ pẹ̀lú ìgbésẹ̀ tí if: always() ń dáàbò bò tí ó ń ṣiṣẹ́ sudo kill "$(sudo cat "$RUNNER_TEMP/openvpn.pid")" kò sì ṣe ohunkóhun mìíràn. Lórí runner tirẹ̀ tí a pín má ṣe pa á rárá nípa orúkọ ìlànà: job mìíràn lè ní client pẹ̀lú binary kan náà àti àwọn àríyànjiyàn tí ó jọra. Ìkùnà yóò wá jábọ̀ lórí job tí ó ṣiṣẹ́ kejì, log rẹ̀ sì tọ́ka sí workflow tí kò ṣe àṣìṣe kankan.
Ìdáàbòbò ṣe pàtàkì nítorí deploy tí ó kùnà ṣì fi tunnel alààyè sílẹ̀. Láìsí always() a máa fi ìgbésẹ̀ ìmúdọ́tọ́ sílẹ̀ gan ní àkókò tí a nílò rẹ̀, ìṣísẹ̀ tó ń bọ̀ sì bẹ̀rẹ̀ lòdì sí client tí ó ti so mọ́.
Ìbéèrè kan ṣì kù kí o tó gba ọ̀kan nínú àwọn ẹ̀rọ-orí méjèèjì: ṣé ìgbésẹ̀ build nílò ọ̀nà aládàáni gan? Agent deployment tí ó ti jókòó nínú nẹtiwọọki lè fa artifact tí a fọwọ́ sí, èyí sì máa ń mú àwọn build lasan kúrò ní ọ̀nà aládàáni. Job tí ó kéré tí ń di tunnel mú túmọ̀ sí ibi tí ó kéré tí ọ̀nà àtijọ́ lè fi ara pamọ́.