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).

b) Restart aplikacji

cmd
%windir%\system32\inetsrv\appcmd recycle apppool /apppool.name:"aplikacja"
  • 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.