Ostatnio przy budowaniu projektu potrzebowałem skorzystać z metadanych zawartych w repozytorium GIT. Mój projekt był budowany przez AWS CodeBuild. Moim ogromnym zaskoczeniem był błąd jaki zobaczyłem przy próbie odpalenia budowania: Fatal: Not a git repository. Projekt jest hostowany na GitHubie i źródła są pobierane przez CodePipeline w poprzednim kroku. Po chwili Googlowania okazało się, że CodePipeline, zamiast robić git clone, pobiera archiwum zip z kodem źródłowym. Znalazłem dużo informacji na ten temat na forum AWS. Posty pochodziły z 2017 roku, jednak do dzisiaj nie było oficjalnego rozwiązania.
Sprawdziłem kilka dostępnych opcji, wśród nich znalazłem 2 które miały sens:
- Pobranie hasha commitu ze zmiennej środowiskowej
- Ręczne zrobienie clone i podpięcie katalogu .git do katalogu z kodem
CodeBuild przetrzymuje numer aktualnie budowanego commitu w zmiennej $CODEBUILD_RESOLVED_SOURCE_VERSION. Niestety narzędzia których używam do budowania projektu wewnętrznie korzystają z komend gita do pobrania metadanych. Metoda z pobraniem hasha niestety tutaj się nie sprawdzi. Pozostało mi ręczne klonowanie repozytorium przy buildzie. Na szczęście okazało się to dość proste i wystarczył krótki skrypt który uruchomiony na początku pobierze sobie wszystko co trzeba. Skrypt możecie znaleźć poniżej.
#!/bin/bash | |
if [ -z "${CODEBUILD_RESOLVED_SOURCE_VERSION:-}" ]; then | |
{ | |
echo "Error: CODEBUILD_RESOLVED_SOURCE_VERSION is not set" | |
} >&2 | |
exit 1 | |
else | |
echo "Resolved hash: ${CODEBUILD_RESOLVED_SOURCE_VERSION}" | |
fi | |
echo "Creating tmp dirs" | |
mkdir tmp | |
cd tmp | |
echo "Clonning repository" | |
git clone https://$GITHUB_API_TOKEN:x-oauth-basic@github.com/username/repository-name ./ | |
echo "Resetting to version from build" | |
git reset "$CODEBUILD_RESOLVED_SOURCE_VERSION" | |
echo "Moving git dir to build directory" | |
cd ../ | |
mv tmp/.git ./ |
Zmienna $GITHUB_API_TOKEN jest przekazywana z parameter store (o korzystaniu ze zmiennych tam przechowywanych pisałem we wpisie: Numerowanie buildów w AWS CodeBuild). Można go wygenerować w zakładce ustawień w GitHubie.
Powyższy skrypt najpierw pobiera hash commitu ze zmiennej środowiskowej i sprawdza czy jest on ustawiony. Następnie tworzy tymczasowy katalog do którego klonuje repozytorium. Stan repozytorium jest resetowany do wersji która jest aktualnie budowana. Po takim przygotowaniu, katalog .git jest przenoszony do folderu ze źródłami które zostały pobrane przez CodeBuild we wcześniejszym kroku. Od tego momentu wszystkie komendy gita będą działać poprawnie.
Powyższy skrypt jest uruchamiany jako komenda w sekcji pre_install w pliku buildspec.yml.