Hoppa till innehåll

Migraatio-opas · GitHub:sta

Siirry GitHubista SIAXin Git- ja CI-palveluun

GitHub ei ole huono työkalu, eikä se yleensä ole syy siihen että joku siirtyy pois. Syitä on tavallisesti kolme: kehittäjäkohtainen lisenssikustannus joka kasvaa tiimin mukana, CI-minuutit joita on vaikea ennakoida, ja se että sekä koodi että build-ketju sijaitsevat Yhdysvaltain lainkäyttövallan alla. Yrityksille jotka myyvät julkiselle sektorille tai säännellyille asiakkaille viimeinen argumentti on usein se joka ratkaisee.

Meidän Git- ja CI-palvelumme on itseisännöity Gitea Actions-yhteensopivilla runnereilla, kaikki EU:ssa. Git-protokolla on sama, joten kloonit, remotet ja työkalut toimivat muuttumattomana, ja workflow-syntaksi vastaa pääosin GitHub Actionsia. Hinta on 199 kr/kk kymmenelle käyttäjälle, verrattuna kehittäjäkohtaiseen lisenssiin plus vaihtelevaan CI-kustannukseen.

Rehellinen varoitus: Actions-yhteensopivuus on hyvä muttei identtinen. Workflow-tiedostot voi useimmiten kopioida sellaisenaan, mutta yksittäiset marketplace-actionit pitää vaihtaa, ja osalle GitHubin ekosysteemistä — Codespaces, Advanced Security, Pages, OIDC-federointi pilvitoimittajiin — ei ole vastinetta. Tämä opas laittaa ajan sinne missä työ oikeasti on: pipelineen, ei koodiin.

Ajankäyttö

Puoli päivää repolle jossa on yksinkertainen pipeline. 20–30 repolle joilla on aktiivisia workfloweja: varautukaa kahdesta kolmeen työpäivään, josta suurin osa menee workflowien testaamiseen — ei koodin siirtämiseen.

Käyttökatko

Ei koodille. Git on hajautettu ja kaikilla on täydelliset kloonit, joten itse reposiirto ei näy mitenkään. CI:ssä sen sijaan on aukko: uudelleenkirjoituksen aikana on jakso jolloin build on varmennettu vain toisessa järjestelmässä. Ajakaa molempia rinnakkain kunnes tulokset täsmäävät ennen kuin teette CI:stämme pakollisen.

01

Näin teet sen

  1. 1

    Kartoita repot, workflowt ja integraatiot

    Listatkaa kaikki repot viimeisimmällä commitilla, koolla ja sillä käyttävätkö ne LFS:ää. Käykää läpi jokainen aktiivinen workflow ja kirjatkaa mitä actioneja se käyttää, mitä salaisuuksia se lukee ja mihin se deployaa. Kirjatkaa myös kaikki mikä on Gitin ulkopuolella: GitHub Apps, webhookit, branch-suojaus, koodin omistajat ja pakolliset statustarkistukset. Tämä lista on teidän todellinen vaatimusmäärittelynne — ei repolista.

  2. 2

    Pystytä organisaatio, käyttäjät ja käyttöoikeudet

    Luokaa organisaatio meillä ja lisätkää tiimit samoilla käyttöoikeustasoilla kuin GitHubissa. Yhdistäkää kirjautuminen olemassa olevaan identiteettitoimittajaanne OIDC:n kautta jos teillä on sellainen, muuten paikalliset tilit pakotetulla kaksivaiheisella tunnistautumisella. Asettakaa branch-suojaus heti — sen lykkääminen on helppoa ja huomataan vasta kun joku pushaa mainiin.

  3. 3

    Peilaa repot ja siirrä issue-historia

    Migraatiotyökalu hakee repon, tagit, julkaisut, wikin, issuet ja pull requestit GitHub-API:n kautta henkilökohtaisella access tokenilla. Ajakaa testimigraatio keskikokoiselle repolle ensin ja tarkastakaa tulos ennen kuin otatte loput. LFS-objektit ja containerimaget ghcr.io:ssa siirtyvät erikseen eivätkä tule mukana samassa ajossa.

  4. 4

    Siirrä salaisuudet — ja kierrätä ne samalla

    Salaisuuksia ei voi lukea ulos GitHubista, joten ne pitää joka tapauksessa asettaa uudelleen. Hyödyntäkää se: kierrättäkää jokainen avain siirron yhteydessä sen sijaan että liimaatte samat arvot. Laittakaa ne organisaatiotasolle siellä missä useampi repo jakaa ne, ja dokumentoikaa mikä pipeline tarvitsee mitäkin.

  5. 5

    Kirjoita workflowt uudelleen ja vaihda actionit jotka eivät kanna

    .gitea/workflows-syntaksi vastaa pääosin GitHub Actionsia, joten tiedostot voi useimmiten kopioida sellaisenaan. Testatkaa sitten jokainen workflow: tavalliset actionit kuten checkout, setup-node ja cache toimivat normaalisti, kun taas ne jotka kutsuvat GitHubin omaa API:a, käyttävät OIDC-federointia tai olettavat GitHubin runner-imagen, eivät toimi. Lukitkaa versiot eksplisiittisesti ja korvatkaa se mikä kaatuu puhtailla shell-askelilla. Varautukaa siihen että tämä vaihe vie eniten aikaa kaikista.

  6. 6

    Aja molempia järjestelmiä rinnakkain kunnes tulokset täsmäävät

    Pitäkää GitHub peilinä ja pushatkaa molempiin remoteihin jakson ajan. Vertailkaa build-lokia build-lokiin samalla commitilla — erot johtuvat yleensä runner-imagen esiasennetuista työkaluista, ei koodistanne. Vasta kun kymmenen–viisitoista peräkkäistä ajoa antaa saman tuloksen, on kohtuullista tehdä CI:stämme pakollinen statustarkistus.

  7. 7

    Ohjaa deploy-kohteet ja webhookit uudelleen, arkistoi sitten GitHub

    Päivittäkää deploy-avaimet, containerrekisteri ja kaikki webhookit jotka osoittavat github.comiin. Jos pipeline deployaa App Hostingiimme (alkaen 99 kr/kk), riittää deploy-avain ja webhook. Asettakaa GitHub-repot arkistoituun, kirjoitussuojattuun tilaan sen sijaan että poistaisitte ne — vanhat permalinkit dokumentaatiossa ja issueissa lakkaavat muuten toimimasta. Pitäkää ne vähintään vuosineljänneksen.

02

Mikä on todella hankalaa

  • Marketplace-actionit eivät aina toimi muuttumattomana. Se mikä vain ajaa komentoja toimii hyvin; se mikä kutsuu GitHubin REST- tai GraphQL-API:a, käyttää OIDC-federointia AWS:ään tai GCP:hen, tai luottaa GitHubin runner-imageen, ei toimi. Testatkaa jokainen action, lukitkaa versiot ja varautukaa korvaamaan osa shell-askelilla.
  • Runner-image ei ole GitHubin ubuntu-latest. Pipelinet jotka olettavat että työkalu on jo asennettu, kaatuvat, usein kryptisellä virheellä pitkällä buildin sisällä. Asentakaa riippuvuudet eksplisiittisesti workflowssa sen sijaan että luotatte imageen.
  • OIDC-federointi pilvitoimittajiin katoaa. Workflowt jotka hakevat väliaikaisia AWS- tai GCP-credentialeja GitHubin identiteettitoimittajan kautta pitää siirtää pitkäikäisiin avaimiin tai muuhun mekanismiin. Se on tietoturvaheikennys jota pitää käsitellä tietoisesti, ei huomata jälkikäteen.
  • Osalle GitHubia ei ole vastinetta: Codespaces, Advanced Security ja koodiskannaus, Pages, Discussions ja organisaatiotason rulesetit. Jos jokin niistä on liiketoimintakriittinen, vastaus ei ole siirtää kaikkea, vaan siirtää se mikä onnistuu ja maksaa lopusta.
  • Issue-historia tulee mukana tekstinä, mutta pull requestien katselutraitit, statustarkistusten historia ja permalinkit github.comiin eivät tule täysin mukana. Linkit vanhassa dokumentaatiossa osoittavat edelleen sinne — siksi GitHub-repot pitää arkistoida, ei poistaa.
03

Kustannusesimerkki

Kymmenen kehittäjän tiimi GitHub Teamissa maksaa noin 40 USD kuukaudessa lisensseissä, eli karkeasti 450 kr, plus se mitä CI-minuutit maksavat sisältyvän potin ylitse. Aktiiviselle monorepolle jolla on paljon rinnakkaisia buildeja CI-erä on usein suurempi kuin lisenssit. Hinnat ja sisältyvät volyymit muuttuvat jatkuvasti — tarkistakaa ajantasainen hinnasto. Vastaava meillä: Git ja CI 199 kr/kk kymmenelle käyttäjälle. Jos tarvitsette raskaita rinnakkaisia buildeja, mitoitamme oman runnerin dedikoidulla palvelimella alkaen 890 kr/kk, mikä on silti ennakoitava vaihtelevan sijaan.

04

Usein kysytyt kysymykset

Toimivatko GitHub Actions -workflowmme sellaisenaan?
Tiedostot voi useimmiten kopioida ilman muutoksia — syntaksi on sama. Actionit ovat eri asia: yleisimmät toimivat, mutta ne jotka puhuvat GitHubin API:n kanssa tai käyttävät OIDC-federointia, eivät. Varautukaa testaamaan ja säätämään jokaista workflowta, älkää siirtämään niitä sokkona.
Tulevatko issuet ja pull requestit mukana?
Kyllä, migraatiotyökalu hakee issuet, pull requestit, julkaisut, tagit ja wikin GitHub-API:n kautta. Katselutraitit ja statustarkistusten historia eivät tule identtisinä. Ajakaa testimigraatio yhdelle repolle ja katsokaa tulosta ennen kuin päätätte koko siirrosta.
Voimmeko säilyttää GitHubin rinnakkain?
Kyllä, ja suosittelemme sitä siirtymän ajaksi. Git on hajautettu, joten pushaaminen kahteen remoteen on yksi rivi konfiguraatiossa. Moni säilyttää GitHubin kirjoitussuojattuna peilinä pysyvästi julkisille repoille.
Mitä tapahtuu ghcr.io:n containerimageille?
Ne siirtyvät erikseen. Pakettirekisterimme puhuu samaa OCI-protokollaa, joten kyse on uudelleentagauksesta ja pushaamisesta — sekä kaikkien pull-referenssien päivittämisestä Kubernetes-manifesteissa, compose-tiedostoissa ja deploy-skripteissä. Älkää unohtako imagen hakusalaisuuksia.
Onko teillä ISO 27001 tai SOC 2?
Ei. Meillä ei ole ISO 27001:tä, SOC 2:ta eikä PCI-DSS:ää. Meillä on GDPR-vaatimustenmukaisuus kaiken datan ollessa EU:ssa, avoin lähdekoodi aivan pohjalle asti niin että voitte tarkastaa mitä ajetaan, ja sopimukset jotka antavat teille datan ulosviennin milloin haluatte. Jos kilpailutuksessanne on sertifiointivaatimus, se pitää tietää ennen projektin aloitusta.
Miten pääsemme pois jos tämä ei toimi?
Klonatkaa repot — ne sisältävät koko historian. Issuet ja pull requestit viedään API:n kautta ja workflow-tiedostot ovat jo repossa. Sama tie ulos kuin sisään, mikä on avointen formaattien koko pointti.