Azure DevOps automatyczny deploy

Opublikowany Autor Piotr CudnikDodaj komentarz

DevOps przez ostatnie lata zyskał sporo na popularności. Automatyczne zbudowanie paczki i wgranie jej na serwer brzmi naprawdę świetnie. Wystarczy umieścić nową funkcjonalność w repozytorium, by za kilka minut była ona już dostępna na serwerze. W tym wpisie zapoznamy się z Azure Devops i skonfigurujemy prosty pipeline automatycznego wdrożenia nowych funkcjonalności na serwer. Dla przykładu posłuży nam aplikacja PairMatching

.

Konfiguracja github

Na platformie github w pierwszej kolejności z marketplace musimy zainstalować Azure Pipelines. Po zainstalowaniu przechodzimy do konfiguracji, wybieramy repozytorium, z którego chcemy budować paczki. Wybieramy subskrypcje azure, tworzymy nowy projekt i przechodzimy do portalu Azure DevOps.

Jeżeli przy tworzeniu nowego projektu pojawi się komunikat „The project visibility specified is invalid. Public projects are not allowed in this organization.” Należy zalogować się w Azure DevOps , tam utworzyć nowy publiczny projekt i wróćcie do kreatora.

 

Automatyczny build – plik yml

W Azure DevOps dla automatycznego builda możemy utworzyć plik yml. Można zrobić to przez kreator lub dodać plik bezpośrednio do repozytorium a następnie w sekcji pipeline builds wskazać plik yml.

Przykładowy plik yml dla projektu .Net Core, w którym projekt zostanie zbudowany oraz zostanie utworzony artefakt z nową wersją aplikacji wygląda następująco:

# ASP.NET Core
# Build ASP.NET Core projects targeting .NET Core.

pool:
  vmImage: 'Ubuntu 16.04'

steps:
- script: dotnet publish -c Release --output ./PublishApp
- task: PublishBuildArtifacts@1
  inputs:
    pathtoPublish: '$(System.DefaultWorkingDirectory)/PairMatching/PublishApp'
    artifactName: WebApp

Konfiguracja maszyny wirtualnej azure [ubuntu]

Przechodzimy do sekcji Pipeline następnie Deployment groups i dodajemy nowy grupę. Wybieramy system operacyjny, w moim przypadku jest to Linux. Kopiujemy wygenerowane polecenie.

Podłączamy się do serwera Ubuntu prze ssh i wykonujemy skopiowane polecenie. Po chwili serwer powinien byś skonfigurowany z Azure DevOps.

 

Automatyczny deploy

W sekcji Pipelines przechodzimy do Releases, tworzymy nowy pipleine. W stages wybieramy empty job, przechodzimy do dodania tasków. Zmieniamy Agent job na Deployment group job. Następnie dodajemy nowe zadanie Bash Script w trybie Inline. W polu script wpisałem komendy do wykonania po stronie serwera. Poniższy skrypt, który przekopiuje pliki artefaktu w docelowe miejsce, na koniec ponownie uruchomi usługę aplikacji. Dodałem również zmienią Upass, w której przechowywane jest hasło użytkownika z uprawnieniami administratora (mało eleganckie rozważanie w przyszłości planuje to zmienić).

Treść pola skrypt

echo "stop dotnet-core-app.service"

echo $Upass | sudo -S systemctl stop dotnet-core-app.service

echo "copy files"

'cp' -rf $(System.DefaultWorkingDirectory)/_$(Build.DefinitionName)/WebApp/* /home/ubuntu/PairMatching/PairMatching/

echo "start dotnet-core-app.service"

echo $Upass | sudo -S systemctl start dotnet-core-app.service

Przechodzimy do pipleline i dodajemy artefakt oraz uruchamiamy trigger, który uruchomi deploy gdy pojawi się nowy artefakt. Zmiany automatycznie zostaną wdrożone na serwer.

a co z bazą danych?

W projekcie PairMatching znajduje się baza danych SQLite, niestety nie udało mi się jeszcze znaleźć sposobu na automatyczne podgrywanie zmian w bazie danych na serwer. Problem polega na tym, że nie ma za bardzo możliwości porównania projektu bazy danych z bazą na serwerze w czasie wykonywania builda. Można oczywiście pobrać całe repozytorium na serwer i tam odpalić build i porównanie bazy jednak takie rozwiązanie jest mało eleganckie. Może Wam udało się rozwiązać ten problem dajcie znać w komentarzach.