Korzystam z GitLab CI/CD do wdrożenia aplikacji ASP.NET w systemie Windows Server 2022. Pipeline’y wykonują się prawidłowo, tzn. aplikacja buduje się na runner’ach (obraz mcr.microsoft.com/dotnet/sdk:8.0), a archiwum zawierające folder wynikowy jest z użyciem mechanizmu artefaktów pobierane na serwer aplikacji i wypakowywane do folderu C:\inetpub\wwwroot\aplikacja\X, gdzie X to wartość zmiennej CI_JOB_ID. Niestety po każdym wdrożeniu muszę ręcznie zmienić physical path w IIS Manager i zrestartować stronę, aby zmiany były widoczne. Czy nie można tego zautomatyzować, ale bez użycia PowerShell?
Apr 15, 7:01am
Tak, można zautomatyzować zmianę physical path w IIS i restart aplikacji bez użycia PowerShell, korzystając z narzędzi dostępnych w systemie Windows, takich jak appcmd (Application Configuration Command Tool) lub msdeploy. Obie te opcje są dostępne z poziomu wiersza poleceń (cmd) i można je zintegrować z pipeline’em GitLab CI/CD.
1. Zmiana physical path i restart aplikacji za pomocą appcmd
appcmd jest narzędziem wbudowanym w IIS, które pozwala zarządzać konfiguracją serwera z poziomu wiersza poleceń. Możesz go użyć do:
Zmiany ścieżki fizycznej (physicalPath) dla aplikacji.
Restartu aplikacji lub puli aplikacji.
Przykładowe polecenia
a) Zmiana physicalPath dla aplikacji
cmd
%windir%\system32\inetsrv\appcmd set app /app.name:"Default Web Site/aplikacja" /path:/ /physicalPath:"C:\inetpub\wwwroot\aplikacja\%CI_JOB_ID%"
Default Web Site/aplikacja – nazwa aplikacji w IIS (dostosuj do swojej struktury).
%CI_JOB_ID% – zmienna środowiskowa GitLab CI/CD (zastąpi ją wartość z pipeline’a).
aplikacja – nazwa puli aplikacji (Application Pool) w IIS.
c) Restart całej strony (opcjonalnie)
cmd
%windir%\system32\inetsrv\appcmd stop site /site.name:"Default Web Site"
%windir%\system32\inetsrv\appcmd start site /site.name:"Default Web Site"
Integracja z GitLab CI/CD
W pliku .gitlab-ci.yml dodaj job, który wykona te polecenia na serwerze docelowym (np. za pomocą SSH lub WinRM).
Przykład dla SSH (jeśli serwer Windows obsługuje OpenSSH):
yaml
deploy_to_iis:
stage: deploy
script:
- echo "Deploying to IIS..."
- scp -o StrictHostKeyChecking=no -r ./artifacts/* user@windows-server:C:\inetpub\wwwroot\aplikacja\%CI_JOB_ID%
- ssh user@windows-server "%windir%\system32\inetsrv\appcmd set app /app.name:\"Default Web Site/aplikacja\" /path:/ /physicalPath:\"C:\inetpub\wwwroot\aplikacja\%CI_JOB_ID%\""
- ssh user@windows-server "%windir%\system32\inetsrv\appcmd recycle apppool /apppool.name:\"aplikacja\""
only:
- main
Uwaga:
Jeśli używasz WinRM, zamiast ssh użyj narzędzia jak winrs lub Invoke-Command (ale to już PowerShell).
Upewnij się, że użytkownik, pod którym łączysz się z serwerem, ma uprawnienia administratora w IIS.
2. Alternatywa: msdeploy (Web Deploy)
Jeśli używasz Web Deploy (msdeploy), możesz zautomatyzować wdrożenie i restart aplikacji w jednym poleceniu.
Przykład:
cmd
msdeploy -verb:sync -source:contentPath="C:\inetpub\wwwroot\aplikacja\%CI_JOB_ID%" -dest:contentPath="Default Web Site/aplikacja",computerName=https://windows-server:8172/msdeploy.axd,userName=user,password=pass,authType=Basic -allowUntrusted
Zalety: Jedno polecenie do wdrożenia + restart.
Wady: Wymaga skonfigurowania Web Deploy na serwerze.
3. Inne opcje (bez PowerShell)
Zadania zaplanowane (Task Scheduler):
Możesz utworzyć zadanie, które uruchomi appcmd po wykryciu nowego folderu w C:\inetpub\wwwroot\aplikacja\. Pipeline GitLab mógłby tworzyć plik "trigger" (np. deploy.trigger), a zadanie monitorowałoby ten plik i wykonywało polecenia appcmd.
Skrypty .bat:
Utwórz plik .bat na serwerze, który wykona appcmd, i uruchamiaj go z pipeline’a (np. przez ssh lub winrs).
Podsumowanie
appcmd
Wbudowane w IIS, proste polecenia
Wymaga SSH/WinRM
Uprawnienia admin w IIS
msdeploy
Jedno polecenie do wdrożenia
Konfiguracja Web Deploy
Web Deploy na serwerze
Zadania zaplanowane
Brak potrzeby zdalnego wywoływania
Mniej elastyczne
Monitorowanie plików
Rekomendacja
Najprostsze rozwiązanie to appcmd + SSH (jeśli serwer obsługuje OpenSSH). Jeśli nie, rozważ Web Deploy lub zadania zaplanowane.
Czy masz już skonfigurowany dostęp SSH/WinRM do serwera Windows?
Jeśli nie, to który sposób wolisz: appcmd, msdeploy, czy może coś innego?
Apr 15, 7:01am
This is a shared conversation and may include unverified content that doesn't reflect Mistral AI's views. Login to resume chatting.