O CZYM PISZEMY?

Wdrożenie systemu ciągłej integracji przy użyciu GitLab i Unity

Wysłano dnia: 21.09.2018 | Komentarzy: 0
Wdrożenie systemu ciągłej integracji przy użyciu GitLab i Unity

Po niezliczonych dniach i nocach poświęconych ręcznemu tworzeniu aplikacji, w końcu postanowiliśmy usprawnić część naszego procesu za pomocą automatyzacji.

 

Ale… dlaczego?

Naszym głównym celem wdrożenia systemu Continuous Integration było skrócenie czasu poświęcanego na budowanie aplikacji. W poprzednim projekcie pojedyncze buildy trwały czasami ponad pół godziny, więc postanowiliśmy sobie nieco ułatwić pracę. Oto kluczowe funkcje, które chcieliśmy zrealizować:

  • Dostęp do buildów online, gotowych do pobrania
  • Obsługa wielu wersji Unity
  • Budowanie na iOS, Windows i Android na jednej maszynie z Windows
  • Przechowywanie buildów na naszym serwerze lokalnym

(Nasz proces Continuous Integration w kilku prostych krokach)

 

O GitLab CI

Wybraliśmy GitLab CI, ponieważ nasze repozytoria już tam były hostowane. Szczegóły konfiguracji GitLab i Runnera opisaliśmy w osobnym artykule.

 

Podczas konfigurowania naszego GitLab Runnera skonfigurowaliśmy pipeline CI za pomocą pliku .gitlab-ci.yml.

Nasz system działa w dwóch etapach: build i deploy. Zadanie „build” służy jako szablon dla wszystkich zadań specyficznych dla platform. Uruchamia ono skrypt PowerShell, który odpala Unity w trybie batch oraz wywołuje nasz własny skrypt build w C#.

Aby to osiągnąć, korzystamy z następujących opcji w linii poleceń Unity:

 

C:\’Program Files’\Unity\Editor\Unity.exe Uruchamia plik wykonywalny Unity
-batchmode Uruchamia Unity bez otwierania edytora
-nographics Zapewnia brak interfejsu GUI na Windows
-executeMethod BuildScript.Build Wywołuje metodę „Build” w naszym BuildScript
-projectPath %CI_PROJECT_DIR% Wskazuje Unity katalog projektu
-quit Zamyka Unity po zakończeniu builda

Oraz dowolne dodatkowe zmienne, np. -customProjectName %CI_PROJECT_NAME%.

 

GitLab udostępnia zmienne takie jak nazwa projektu, ID pipeline, katalog projektu czy cel builda. Przekazujemy je do naszego skryptu Unity, aby określić, na jaką platformę zbudować aplikację.

.build: &build
     stage: build
     variables:
     tags:
          - Unity
     script:
          - C:\"Program Files"\Unity\Hub\Editor\%UNITY_VERSION%\Editor\Unity.exe -projectPath %CI_PROJECT_DIR% -logfile D:\Logs\%BUILD_TARGET%.log -customBuildPath %BUILD_PATH% -customProjectName %CI_PROJECT_NAME% -customBuildTarget %BUILD_TARGET% -pipelineId %CI_PIPELINE_ID% -batchmode -nographics -executeMethod BuildScript.Build -quit
artifacts:
     name: "%CI_PROJECT_NAME% %BUILD_TARGET% %CI_PIPELINE_ID%"
     paths: 
          - ./Builds/%CI_PROJECT_NAME%/%CI_PIPELINE_ID%/%BUILD_TARGET%

 

Buildy na żądanie

Oferujemy cztery opcje buildów: Windows, Android, iOS lub All. Wybiera się je w oknie „Run pipeline”. Obecnie GitLab CI nie obsługuje list zmiennych, dlatego wprowadzamy je ręcznie. Jeśli nie zostanie podany cel, pipeline uruchamia build dla wszystkich platform. Dlatego nasze zadanie „build” jest szablonem — każde zadanie specyficzne dla platformy uruchamia się wyłącznie, gdy podana zostanie właściwa zmienna.

Windows:
    >>: *build
    variables:
         BUILD_TARGET: StandaloneWindows64
         BUILD_PATH : ./Builds

    only:
         variables:
              - $Target == "Windows"
              - $Target == "windows"
              - $Target == "All"
              - $Target == null

 

Harmonogram budowania

Oprócz ręcznych wyzwalaczy, harmonogramujemy buildy po każdym commicie do gałęzi master oraz codziennie o 2:00, korzystając z funkcji Schedules w GitLab CI.

 

Wersję Unity definiujemy też jako zmienną globalną na początku pliku, co ułatwia jej aktualizację na początku projektu.

 

Gdzie znaleźć nasze buildy?

Początkowo planowaliśmy zapisywać buildy bezpośrednio na naszym serwerze lokalnym, jednak ograniczenia uprawnień zmusiły nas do kopiowania ich z tymczasowego folderu. Aby uniknąć zapełniania dysku, czyścimy folder tymczasowy po każdym deployu. Buildy wciąż są dostępne jako artefakty w GitLab.

 

Optymalizacja szybkości

Aby przyspieszyć buildy, wdrożyliśmy Unity Cache Server. Dzięki temu Unity pobiera wstępnie przetworzone zasoby z cache zamiast konwertować je za każdym razem, gdy zmieniamy platformę.

 

Budowanie aplikacji iOS na Windows

Celem było zrealizowanie wszystkich buildów na jednej maszynie z Windows, bez angażowania Maca. Budowanie pliku .ipa wydawało się niemożliwe na Windows, dopóki nie odkryliśmy pluginu Unity, który to umożliwia. Wymagało to przeniesienia certyfikatów z Maca, ale opłaciło się. Plugin obsługuje interfejs wiersza poleceń, co czyni go idealnym do naszego CI.

 

Spróbuj samodzielnie

Tak oto wygląda nasza historia tworzenia systemu Continuous Integration z wykorzystaniem GitLab CI i Unity. Było to trudniejsze, niż się wydaje, ale wciąż go udoskonalamy. Nasz proces jest teraz prostszy i szybszy — wypróbuj samodzielnie i stwórz własny!

 

Dodaj komentarz