Socraíonn do chéim deploy ar óstainm inmheánach agus an t-ordú céanna ag freagairt láithreach ó do ríomhaire glúine, agus an client build ar an dá mheaisín comhionann. Ritheann an job ar runner óstáilte ag GitHub: meaisín fíorúil a cruthaíodh don job aonair sin i scamall GitHub, gan mhórbhealach isteach i do spás seoltaí príobháideach, gan iontráil resolver don chrios inmheánach agus gan teastas a nglacfadh an endpoint príobháideach. Ní oireann ach dhá dhearadh don srian sin, agus ní féidir ceachtar acu a chur ar siúl níos déanaí gan an workflow a atógáil. Roghnaigh eatarthu roimh an gcéad líne YAML, mar go gcosnaíonn aistriú ina dhiaidh sin níos mó ná an chéad iarracht.

Tá an rogha idir runner a chuirtear san áit a gcríochnaíonn an líonra cheana agus tollán nach maireann ach aon job amháin. Tá deploy táirgthe á n-iompar acu araon le blianta, agus teipeann orthu ar bhealaí éagsúla.

Cá bhfuil an teorainn i ndáiríre

Stopann gach rud a shuiteáil tú ar do ríomhaire glúine ag an ríomhaire glúine, agus imíonn gach rud a shuiteáil tú le linn job leis an runner. Níl aon spás ainmneacha líonra buan a bhféadfadh client cloí leis idir ritheanna, mar sin tosaíonn gach rith ón staid dhoshroichte chéanna. Déanann Azure an teorainn seo a dhoiciméadú do ghníomhairí óstáilte ag Microsoft, áit nach dtacaítear le naisc VPN agus ExpressRoute isteach i líonraí príobháideacha, agus iompraíonn runners óstáilte ag GitHub an cineál céanna srianta seachas meicníocht ar leith. Léigh é seo mar airí táirge, ní mar locht ar cheart dul timpeall air.

Ní scaoileann aon socrú stórtha é sin. Cinneann lipéad an job cén pool a thógann an obair, agus ciallaíonn lipéad óstáilte meaisín lasmuigh de do imlíne le linn an rith iomlán.

Mar sin caithfidh inrochtaineacht phríobháideach teacht ó rud éigin atá agat féin. Runner a chuirtear san áit a gcríochnaíonn an líonra cheana, nó tollán a mhaireann aon job amháin. Pléann an chuid eile den alt íoc go comhfhiosach as ceann amháin díobh seo in ionad an bhille a aimsiú i dtáirgeadh.

Cinneadh de réir mhinicíocht na ritheanna, ní de réir eolais

Úsáid do runner féin laistigh den VPC nó de líonra na hoifige nuair a thagann deployanna arís agus arís eile in aghaidh an lae, nuair a théann an job i dteagmháil le níos mó ná port príobháideach amháin, nó nuair atá sé de chúram ar fhoireann ardáin cheana féin paistí agus rothlú dintiúirí a láimhseáil. Réitíonn agus seolann job ar an meaisín sin mar aon óstach eile taobh thiar den bhalla dóiteáin. Tarlaíonn an obair líonra uair amháin, ag an suiteáil, ní ag gach rith.

Tóg an tollán laistigh den job nuair atá rochtain ann go hannamh agus nach dteastaíonn uait gníomhaire fadsaolach a choinníonn dintiúr isteach i do líonra. Éiríonn an job ina client líonra dá chuid féin ar feadh roinnt nóiméad agus ní fhágann sé aon rud ina dhiaidh, rud arb é an pointe iomlán go minic.

Meabhraigh costas an tolláin sula roghnaíonn tú é. Íocann gach rith as an bpróifíl a ábharthú, as tosú an client, as an ullmhacht agus as an mbaint anuas. Táirgeann tollán a éiríonn ach nach bhfíoraítear choíche deploy a theipeann leathbhealach agus a fhágann staid phríobháideach i gcruth nár phleanáil éinne. Is annamh a bhíonn an t-athiarracht ina dhiaidh sin glan, agus cuirtear an dara teip i leith leagan an client de ghnáth.

An phróifíl a scríobh ionas nach féidir leis an gcéim stad

Coinnigh próifílí agus dintiúirí lasmuigh den stór agus ábhartaigh iad ó secret sa chéim a dteastaíonn siad uaithi. Cinneann an t-ordú an maireann an job: baineann comhad a cruthaíodh faoi sudo le root, agus ní féidir le shell gan phribhléid na céime scríobh ann a thuilleadh.

- 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"

Tá an dá shonraí sa bhloc sin ann do chéimeanna níos déanaí. Le umask 077 tagann an phróifíl i móid 0600 faoi úinéireacht úsáideora an runner, is féidir le sudo í a léamh fós, agus scríobhann an client a log i gcomhad atá ag an runner cheana, mar sin is féidir leis an lúb ullmhachta an log sin a léamh gan dara sudo. Taifeadann --writepid an PID a ndíreoidh an bhaint anuas air.

Teastaíonn a eochair scríofa ar an mbealach céanna ó phróifíl a fhíordheimhnítear le teastas client, agus teastaíonn an mód auth comhoiriúnach ó phróifíl static-challenge. Teastaíonn openvpn-systemd-resolved ar Ubuntu agus Debian ó phróifílí a bhrúnn roghanna DNS, mar ní athraíonn an bhrú amháin aon rud ar íomhá bhunúsach.

Is probe í an ullmhacht, ní sos

Maireann sleep seasta go díreach go dtí go n-éiríonn an tiúntóir mall, agus ansin ritheann céim an deploy sula bhfuil an mhórbhealach ann. Tagann an teip ansin chun solais taobh istigh den uirlis deploy mar timeout chuig an óstach príobháideach, rud nach ndeir aon rud faoin tollán.

- 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

Breathnaíonn an lúb ar dhá rud mar is féidir le ceachtar acu a bheith ina leath briste. Cruthaíonn getent hosts gur freagraíonn an resolver brúite don ainm sin, agus cruthaíonn oscailt an socket go bhfuil rud éigin ag éisteacht ar an port a úsáidfidh an deploy; teastaíonn an seoladh litriúil agus an líne getent scriosta ó phróifíl nach bhfuil inti ach mórbhealach.

Nuair a théann an lúb in éag, is é an log an t-aon rud a scarann trí locht éagsúla: teastas diúltaithe, mód auth mícheart agus mórbhealach nár tháinig riamh. Coinníonn scagadh roimh an tail an t-aschur sin gearr go leor le léamh agus an job fós ag teip. Léigh an chéad earráid seachas an líne dheireanach, mar déanann client nach féidir leis fíordheimhniú é féin a athrá go dtí go dtabharfaidh an lúb suas. Freagraíonn ip -4 route show dev tun0 an cheist is simplí ar brúdh mórbhealach ar chor ar bith, agus cosnaíonn sé líne amháin sa lúb chéanna.

Baint anuas agus ceist an artifact

Dún an job le céim a chosnaíonn if: always() agus a ritheann sudo kill "$(sudo cat "$RUNNER_TEMP/openvpn.pid")" agus faic eile. Ar runner féin roinnte ná maraigh riamh de réir ainm phróisis: féadfaidh client le dénártha céanna agus argóintí cosúla a bheith ag job eile. Titeann an teip ansin ar an job a ritheadh sa dara háit, agus díríonn a log ar workflow nár dhein aon rud mícheart.

Tá tábhacht leis an gcosaint mar fágann deploy teipthe tollán beo fós. Gan always() scipeáltar an chéim ghlanta go díreach nuair a bhíonn sí de dhíth, agus tosaíonn an chéad rith eile i gcoinne client atá ceangailte cheana.

Tá ceist amháin fágtha sula nglacfaidh tú le ceachtar dearadh: an dteastaíonn mórbhealach príobháideach ón gcéim build ar chor ar bith? Féadann gníomhaire deployment atá ina shuí sa líonra cheana artifact ceadaithe a tharraingt, agus coinníonn sé sin buildanna rialta amach ón gcosán príobháideach. Ciallaíonn níos lú job a choinníonn tollán níos lú áiteanna inar féidir le mórbhealach seanaimseartha dul i bhfolach.

Ailt ghaolmhara