diff --git a/buildmachine/README-OLD.md b/buildmachine/README-OLD.md
new file mode 100644
index 0000000..f5bc8c3
--- /dev/null
+++ b/buildmachine/README-OLD.md
@@ -0,0 +1,252 @@
+# Build Machine
+
+Počítač slúži na build našich projektov.
+
+Inštalácia potrebných programov sa robí pomocou [Chocolatey](https://chocolatey.org/).
+
+Na čo najjednoduchšie nakonfigurovanie počítača slúžia skripty `install.ps1` a `configure.ps1`. Oba skripty je potrebné spustiť
+ako administrátor.
+
+## Chocolatey
+
+Ak je potrebné pridať nový program, prípadne niečo zmeniť, používajte `choco`. _Ručne_ inštalujeme iba to, na čo Choco nemá
+balíček, prípadne sú na to nejkaé iné vážne dôvody. Zoznam základných vecí čo sa inštauljú je v súbore
+[`buildmachine-packages.config`](https://github.com/Kros-sk/kros-sk.github.io/blob/master/buildmachine/buildmachine-packages.config),
+tu na na našom GitHub-e. Ak je potrebné niečo zmeniť/pridať, nainštaluj to z príkazovej riadky (ako admin) a pridaj do toho súboru.
+Jednoducho si tak v prípade potreby budeme vedieť spraviť ďalší build počítač. Prvé nainštalovanie z tohto zoznamu sa spraví príkazom:
+
+``` sh
+choco install ./buildmachine-packages.config --yes
+```
+
+`choco` spúšťaj v administrátorskom režime obyčajného _command prompt-u_ (`cmd`). Je možné to spustiť aj vo Windows Terminále,
+prípadne v PowerShelli, ale tieto veci sa tiež aktualizujú cez `choco`, takže ich aktualizácia by neprešla, ak by boli spustené.
+
+Ak bude potrebné pridať nejakú utilitku, čo sa neinštaluje štandardne, ale iba kopíruje, pridaj ju do zložky `C:\tools`,
+nech máme takéto veci na jednom mieste. Táto cesta je aj zapísaná v premennej `PATH`, takže všetko čo je v nej, je priamo spustiteľné.
+
+### Základné príkazy
+
+Zoznam aktuálne nainštalovaných vecí:
+
+``` sh
+choco list --local
+```
+
+Nainštalovanie nového balíčka:
+
+``` sh
+choco install program-name --yes
+```
+
+Zoznam neaktuálnych vecí, tzn. programov, ktoré už majú novšiu verziu, než je nainštalovaná:
+
+``` sh
+choco outdated
+```
+
+Aktualizácia všetkých neaktuálnych programov:
+
+``` sh
+choco upgrade all --yes
+```
+
+Niekedy nechceme aktualizovať úplne všetko. Štandardne napríklad Terraform neaktualizujeme okamžite. Vtedy je potrebné napísať
+ meno programu, ktorý sa má aktualizovať namiesto `all`. Takto je možné zadať aj viacero programov naraz, oddelených medzerou:
+
+``` sh
+choco upgrade program-1 program-2 program-3 --yes
+```
+
+## Skript `install.ps1`
+
+Skript nainštaluje samotné **chocolatey** a potom aj všetky ostatné programy v `buildmachine-packages.config`.
+Nie je potrebné nič inštalovať popredu, stačí spustiť Powershell ktorý aktuálne v systéme je. Chocolatey nainštaluje aj
+Powershell Core, či Windows Terminal.
+
+Skript nemá žiadne parametre.
+
+## Skript `configure.ps1`
+
+Skript nakonfiguruje všetko potrebné, čo je možné spraviť automaticky a to je takmer všetko, čo je popísané ďalej v tomto
+dokumente.
+
+Skript má nasledovné parametre (všetky nepovinné):
+
+- `-Proxy` – adresa proxy servera, zadaná aj so schémou (napr. `http://`). Predvolená hodnota je prázdny reťazec (bez proxy).
+- `-NewmanPath` – cesta, kde bude nainštalovaný Newman. Predvolená hodnota je `C:\newman`.
+- `-ToolsPath` – cesta k rôznym nástrojom. Táto cesta je pridaná do systémovej premennej `PATH`, aby nástroje boli globálne dostupné. Predvolená hodnota je `C:\tools`,
+- `-CachePath` – cesta, kde sa nastaví keš pre rôzne programy (NPM, Cypress…). Predvolená hodnota je `C:\cache`.
+
+## Script `install-load-tests.ps1`
+
+Skript nainštaluje / nakonfiguruje všetko potrebné pre load testy. Tento script je potrebné spúšťať len na build mašinách,
+ktoré budú spúšťať load testy. Nainštaluje software, ktorý je definovaný v `load-tests-buildmachine-packages.config`.
+Taktiež stiahne a rozbalí JMeter _(by default do `C:\tools\jmeter`)_ a nainštaluje potrebné pluginy.
+
+Skript má nasledovné parametre (všetky nepovinné):
+
+- `JMeterVersion` - Verzia JMeter-u, ktorá sa má nainštalovať _(default je `5.4.1`)_.
+- `ToolsPath` - Adresár, kde sa nachádzajú naše tools. Tam sa nainštaluje JMeter _(default je `C:\tools`)_.
+- `PluginsList` - Čiarkou oddelený zoznam pluginov _(Plugin Id)_, ktoré sa majú nainštalovať _(default je `jpgc-graphs-basic,jpgc-casutg,jpgc-prmctl`)_.
+
+## PowerShell (`install.ps1`)
+
+Je potrebné povoliť spúšťanie skriptov: `Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope LocalMachine`.
+Skript `install.ps1` to nastaví sám.
+
+## DevOps build agenti
+
+**DevOps agentov treba konfigurovať nakoniec, až keď je nainštalované a nastavné všetko ostatné**, aby si zistili info o všetkom
+čo je v počítači. V prípade, že sa neskôr nainštaluje niečo nové, čo má na agentov vplyv, je potrebné reštartovať ich služby
+(prípadne počítač).
+
+Každý agent musí bežať pod svojim vlastným používateľom. Je to kvôli problémom, keď sa agenti bili o nejaké zdroje počas buildu,
+ak bežali pod spoločným účtom. Na jednoduché pridanie viacerých používateľov naraz slúži skript
+[`create-users.ps1`](https://github.com/Kros-sk/kros-sk.github.io/blob/master/buildmachine/create-users.ps1).
+
+Agentovi je potrebné nastaviť proxy server. V adresári agenta je potrebné vytvoriť súbor `.proxy` (pozor, súbor naozaj začína
+bodkou), v ktorom je zapísaná adresa proxy servera aj s protokolom a portom (napr. `http://123.112.1.9:1234`).
+
+Niekedy sú po rozbalení ZIP-u agenta zblbnuté práva na jeho adresári a súboroch, čo sa prejavuje chybovou hláškou:
+
+> This access control list is not in canonical form and therefore cannot be modified.
+
+Vtedy treba spustiť nasladovný príkaz: `icacls.exe {agent-folder} /reset /T /C /L /Q`. Parameter `{agent-folder}` je cesta
+k zložke s agentom.
+
+Samotný agent sa potom nakonfiguruje jednoducho nasledovným príkazom:
+
+``` sh
+.\config.cmd --unattended --url "https://dev.azure.com/krossk/" --auth pat --token {token} --runAsService --pool {pool-name} --agent {agent-name} --windowsLogonAccount {user-name} --windowsLogonPassword {user-password}
+```
+
+- `{token}`: PAT (personal access token) v DevOps, ktorý musí mať nastavený scope **Read & manage** pre **Agent Pools**.
+Tento token môže mať krátku platnosť a je potrebný iba na zaregistrovanie agenta v DevOps agent pool-e.
+Pre samotný beh agenta potrebný nie je.
+- `{pool-name}`: Meno pool-u, do ktorého bude agent pridaný.
+- `{agent-name}`: Meno agenta.
+- `{user-name}`: Meno používateľa, pod ktorým agent beží.
+- `{user-password}`: Heslo používateľa, pod ktorým agent beží.
+
+⚠ **Dôležité nastavenie pre Agent Pools** - v Devopse v jeho nastaveniach (prístupné cez `Organization settings`),
+treba nastaviť `Maintenance job`, ktorý bude pravidelne prečisťovať miesto. Nastaviť ho podľa iných pools tak,
+aby sa ideálne vykonávanie robilo v iných časoch (nie je to nutná podmienka).
+
+## Systémové premenné (`configure.ps1`)
+
+### Všeobecné systémové premenné
+
+- `CYPRESS_CACHE_FOLDER` – štandardne nastavená na `C:\cache\cypress`. Cypress si tu ukladá stiahnuté binárky.
+- `NPM_CONFIG_CACHE` – štandardne nastavená na `C:\cache\npm`. NPM si tu ukladá stiahnuté balíčky.
+- `NUGET_PACKAGES` – štandardne nastavená na `C:\cache\nuget`. NuGet si tu ukaldá stiahnuté balíčky.
+
+### Proxy systémové premenné
+
+Hodnota `{proxy}` je IP adresa nášho proxy servera aj so schémou a portom (http://a.b.c.d:port).
+
+V systéme je nutné nastaviť niekoľko premenných (pre celý systém, nie iba pre používateľa):
+
+- `HTTP_PROXY` - `{proxy}`
+- `HTTPS_PROXY` - `{proxy}`
+
+Všetky systémové premenné automaticky nastaví skript `configure.ps1`.
+
+## Web Deploy (potrebné spraviť ručne)
+
+> Web deploy služieb používajú iba na SSW, takže ak nie je potrebné, netreba sa s ním zaoberať.
+
+Niektoré release pipeline-y používajú _Web Deploy_ spôsob nasadenia služby do Azure,
+[takže je potrebné ho nainštalovať](https://www.iis.net/downloads/microsoft/web-deploy).
+Po inštalácii je potrebné manuálne nastaviť proxy v súbore `msdeploy.exe.config`, na oboch miestach:
+
+- `C:\Program Files\IIS\Microsoft Web Deploy V3`
+- `C:\Program Files (x86)\IIS\Microsoft Web Deploy V3`
+
+Do súborov je potrebné doplniť nasledujúcu sekciu. _Adresu proxy servera je potrebné zadať aj so schémou `http://`._
+
+``` xml
+
+
+
+
+
+```
+
+## NPM (`configure.ps1`)
+
+Nastavenie proxy (je potrebné ho zadať aj so schémou `http://`):
+
+``` sh
+npm config set proxy {proxy}
+npm config set https-proxy {proxy}
+```
+
+Po nakonfigurovaní nového servera sa môže stať, že projekt si nevie stiahnuť npm balíčky
+(konkrétne sa to stalo pre projekt s Cypress testami). Vtedy treba spustiť príkaz:
+
+``` sh
+npm config set registry https://registry.npmjs.org/
+```
+
+### Globálne NPM nástroje (`configure.ps1`)
+
+⚠ Globálna inštalácia (`npm install -g`) v prípade NPM znamená, že sa daná vec nainštaluje
+_globálne pre aktuálneho používateľa_, do jeho profilu. Toto nechceme, my daný nástroj potrebujeme globálne
+pre celý systém. Neexistuje možnosť ako toto v NPM spraviť (aspoň o nej nevieme), takže jediné čo nám ostáva,
+je nainštalovať to takto a potom ručne skopírovať na nejaké všeobecné miesto. Po prekopírovaní je možné danú
+vec pokojne odinštalovať.
+
+**NewMan:** `npm install -g newman` Po nainštalovaní skopírovať do `C:\newman` (príkaz musí byť dostupný ako
+`C:\newman\newman.cmd`) a do systémovej premennej `PATH` pridať cestu `C:\newman`.
+Nainštalovaný nástroj sa nachádza v zložke `%APPDATA%\npm\`.
+
+## DotNet Global Tools (`configure.ps1`)
+
+Je potrebné nainštalovať nasledovné dotnet tools:
+
+- Kros.DummyData.Initializer
+- Kros.VariableSubstitution
+
+Nástroje sa inštalujú príkazom `dotnet tool install --global {toolName} --tool-path {toolPath}`.
+
+## Inštalácia Docker 🐳
+
+Docker je potrebné nainštalovať "ručne". Najskôr je v programoch a súčastiach potrebné zapnúť `Hyper-V` ![hyper-v](hyper-v.png).
+> Ak by bola časť možností disablovaná, tak je potrebné zapnúť virtualizáciu na úrovni BIOSu.
+
+Ďalej [nainštalovať linux subsystem](https://docs.microsoft.com/en-us/windows/wsl/install) `wsl --install`.
+
+Následne samotný [Docker](https://docs.docker.com/desktop/windows/install/).
+
+### Nastavenie spúšťania
+
+`Docker desktop.exe` sa spúšťa až s prihlásením používateľa *(po odhlásení sa vypne)*. Je potrebné naplánovať udalosť po štarte mašiny, ktorá ho spustí.
+Je na to vytvorený script `.\register-docker-start-schedule.ps1 "username" "password"`. Je potrebné zadať používateľa pod ktorým sa to bude spúšťať.
+
+Taktiež je potrebné pridať všetkých používateľov _(pod ktorými bežia agenti)_ do skupiny `docker-users` _(aby mali prístup k docker daemon-u)_.
+Na to je tiež vytvorený script `.\add-users-to-docker-group.ps1 "esw" 15 1`.
+
+### Čistenie dát po docker príkazoch
+
+Docker pri svojej práci vytvára rôzne dáta. Jednotlivé images, cache, ... Keďže to beží pod `WSL` tak všetky dáta sú v `C:\Users\{userName}\AppData\Local\Docker\wsl\data\ext4.vhdx`. Z času na čas je to potrebné prečistiť. Robíme to tak, že odstránime jednotlivé images a "shrinkneme" daný súbor. Na to sa používa script `clean-docker.ps1`. Jeho automatické spúšťani je možné naplánovať pomocou scriptu `.\register-docker-clean-schedule.ps1 "username" "password"`. *(nateraz je to naplánované na každú nedeľu 20:00)*
+
+## Čistenie dočasných (temp) súborov (`configure.ps1`)
+
+Mnoho vecí vytvára v `Temp` adresári používateľa svoje súbory a neupravuje si po sebe. Keďže každý agent beží pod vlastným
+používateľským účtom má aj vlastnú `Temp` zložku a tak množstvo takto vytvorených dát je celkom významné. Z dlhodobého hľadiska
+s tým je problém, pretože nám pravidelne dochádza miesto na disku.
+
+Na prečistenie `Temp` zložiek všetkých používateľov slúži skript [`clean-temp.ps1`](https://github.com/Kros-sk/kros-sk.github.io/blob/master/buildmachine/clean-temp.ps1).
+Tento skript vymaže všetky súbory v `Temp` adresároch všetkých používateľov, ktoré sú staršie ako 4 dni.
+Túto hodnotu je možné zmeniť parametrom `-OlderThanDays`.
+Ak sa spúšťa z príkazovej riadky, je potrebné ho spúšťať ako administrátor (inak vymaže len temp aktuálne prihláseného
+používateľa). Na _build_ počítač ho treba pridať ako naplánovanú úlohu, ktorá sa spustí raz za deň a `Temp` prečistí.
+Skript je potrebné nakopírovať do zložky `C:\tools` a naplánovanú úlohu vytvoriť nasledovným príkazom,
+spusteným ako administrátor:
+
+``` sh
+schtasks /create /ru "NT AUTHORITY\SYSTEM" /rl HIGHEST /sc daily /st 03:30 /tn "BuildAgents\CleanTemp" /tr "pwsh -File 'C:\tools\clean-temp.ps1' -SaveTranscript"
+```
+
+Skript vytvorí záznam o svojom poslednom behu do súboru `clean-temp.log`.
diff --git a/buildmachine/README.md b/buildmachine/README.md
index f5bc8c3..ba1eaf2 100644
--- a/buildmachine/README.md
+++ b/buildmachine/README.md
@@ -1,86 +1,92 @@
# Build Machine
-Počítač slúži na build našich projektov.
+> Staré informácie pre build počítače, ktoré používajú Chocolatey, sú v [README-OLD.md](README-OLD.md)
-Inštalácia potrebných programov sa robí pomocou [Chocolatey](https://chocolatey.org/).
+Na nainštalovanie potrebných vecí a konfiguráciu build počítača slúžia skripty:
-Na čo najjednoduchšie nakonfigurovanie počítača slúžia skripty `install.ps1` a `configure.ps1`. Oba skripty je potrebné spustiť
-ako administrátor.
+- `install.ps1`
+- `configure.ps1`
+- `configure-agents.ps1`
-## Chocolatey
+## Skript `install.ps1`
-Ak je potrebné pridať nový program, prípadne niečo zmeniť, používajte `choco`. _Ručne_ inštalujeme iba to, na čo Choco nemá
-balíček, prípadne sú na to nejkaé iné vážne dôvody. Zoznam základných vecí čo sa inštauljú je v súbore
-[`buildmachine-packages.config`](https://github.com/Kros-sk/kros-sk.github.io/blob/master/buildmachine/buildmachine-packages.config),
-tu na na našom GitHub-e. Ak je potrebné niečo zmeniť/pridať, nainštaluj to z príkazovej riadky (ako admin) a pridaj do toho súboru.
-Jednoducho si tak v prípade potreby budeme vedieť spraviť ďalší build počítač. Prvé nainštalovanie z tohto zoznamu sa spraví príkazom:
+Na inštaláciu bežných vecí sa používa **WinGet**. Je to nástroj priamo vo Windows, ktorý umožňuje inštalovať, aktualizovať
+a odinštalovávať programy. Zoznam vecí šo sa na build počítač inštalujú je v súbore [`install.json`](install.json).
+Zoznam programov je možné mať aj v inom súbore, ktorý sa špecifikuje pomocou parametra `-WingetJsonPath`.
-``` sh
-choco install ./buildmachine-packages.config --yes
-```
+Pri spustení súboru `install.ps1` sa nainštalujú/aktualizujú iba programy, definované v `install.json`. WinGet však umožňuje
+aktualizovať všetky nainštalované programy. Spustením `winget upgrade` zobrazí zoznam programov, ktoré je možné aktualizovať.
+Samotná aktualizácia sa spustí príkazom `winget upgrade --all`.
-`choco` spúšťaj v administrátorskom režime obyčajného _command prompt-u_ (`cmd`). Je možné to spustiť aj vo Windows Terminále,
-prípadne v PowerShelli, ale tieto veci sa tiež aktualizujú cez `choco`, takže ich aktualizácia by neprešla, ak by boli spustené.
+`install.ps1` aj `winget` je potrebné spúšťať ako administrátor.
-Ak bude potrebné pridať nejakú utilitku, čo sa neinštaluje štandardne, ale iba kopíruje, pridaj ju do zložky `C:\tools`,
-nech máme takéto veci na jednom mieste. Táto cesta je aj zapísaná v premennej `PATH`, takže všetko čo je v nej, je priamo spustiteľné.
+### Azure CLI
-### Základné príkazy
+Azure CLI je síce možné nainštalovať pomocou WinGet, ale toto sa ukázalo ako nespoľahlivé – inštalácia z nejakých dôvodov
+náhodne padala. Preto `install.ps1` Azure CLI nainštaluje manuálne tak, že stiahne inštalačku a spustí ju.
-Zoznam aktuálne nainštalovaných vecí:
+### Kubectl
-``` sh
-choco list --local
-```
+`kubectl` je nástroj na komunikáciu s Kubernetes. Tento nástroj sa inštaluje automaticky v `install.ps1`. Avšak na
+počítači `BUILD5` bol problém, že samotné `exe` nemalo správne nastavené práva a tak ho bežný používateľ (build agent)
+nevedel spustiť. Preto je po inštalácii toto potrebné preveriť. Súbor `kuibectl.exe` sa nachádza v zložke
+`c:\Program Files\WinGet\Packages\Kubernetes.kubectl_Microsoft.Winget.Source_...\` a musí mať práva `Read`
+a `Read and execute` pre skupinu `Users`. Ak ich nemá, je potrebné ich nastaviť.
-Nainštalovanie nového balíčka:
-
-``` sh
-choco install program-name --yes
-```
+## Skript `configure.ps1`
-Zoznam neaktuálnych vecí, tzn. programov, ktoré už majú novšiu verziu, než je nainštalovaná:
+Skript nakonfiguruje na build počítači všetko potrebné a nainštaluje veci, ktoré nie je možné/vhodné inštalovať pomocou
+`install.ps1`. Skript má nasledovné parametre (všetky nepovinné):
-``` sh
-choco outdated
-```
+- `Proxy`: adresa proxy servera, zadaná aj so schémou a prípadným portom (`http://1.2.3:4:5678`). Predvolená hodnota je prázdny reťazec (bez proxy).
+- `ToolsPath`: cesta k rôznym nástrojom. Táto cesta je pridaná do systémovej premennej `PATH`, aby nástroje boli globálne dostupné. Predvolená hodnota je `C:\tools`,
+- `CachePath`: cesta, kde sa nastaví keš pre rôzne programy (NPM, Cypress…). Predvolená hodnota je `C:\cache`.
-Aktualizácia všetkých neaktuálnych programov:
+Skrip sa postará o nasledovné veci:
-``` sh
-choco upgrade all --yes
-```
+- Vytvorí zložku `$ToolsPath`.
+- Vytvorí zložku `$CachePath` a v nej všetky ďalšie potrebné. Zároveň nastaví potrebné práva pre túto zložku.
+- Aj bolo zadané `Proxy`, tak nastaví premenné prostredia `HTTP_PROXY` a `HTTPS_PROXY` a nastaví aj proxy pre NPM.
+- Pridá štandardný `nuget.org` ako zdroj pre NuGet.
+- Nainštaluje potrebné `dotnet` nástroje.
+- Do zložky `$ToolsPath/newman` nainštaluje `newman`, potrebný pre Postman testy.
+- Do zložky `$ToolsPath` skopíruje pomocné skripty `clean-temp.ps1` a `clean-nx-cache.ps1`.
+- V plánovači úloh (Task Scheduler) vytvorí potrebné úlohy an čistenie rôznych dát.
-Niekedy nechceme aktualizovať úplne všetko. Štandardne napríklad Terraform neaktualizujeme okamžite. Vtedy je potrebné napísať
- meno programu, ktorý sa má aktualizovať namiesto `all`. Takto je možné zadať aj viacero programov naraz, oddelených medzerou:
+Ak sa skript spúšťa opakovane, tak môže hlásiť chyby, pretože niektoré veci už budú existovať.
-``` sh
-choco upgrade program-1 program-2 program-3 --yes
-```
+## Skript `configure-agents.ps1`
-## Skript `install.ps1`
+Skript vytvorí a nakonfiguruje potrebných build agentov. Má nasledovné parametre:
-Skript nainštaluje samotné **chocolatey** a potom aj všetky ostatné programy v `buildmachine-packages.config`.
-Nie je potrebné nič inštalovať popredu, stačí spustiť Powershell ktorý aktuálne v systéme je. Chocolatey nainštaluje aj
-Powershell Core, či Windows Terminal.
+- `Pat`: personal access token (PAT) pre DevOps. Token musí mať právo `Read & manage` pre scope `Agent Pools`. Parameter je povinný.
+- `AgentsBaseFolder`: adresár, do ktorého sa agenti nakpírujú. Predvolaná hodnota je `C:/agents`.
+- `AgentZipFile`: názov ZIP súboru s agentom. Súbor musí byť v rovnakom adresári ako `configure-agents.ps1`. Predvolená hodnota ja `vsts-agent-win-x64.zip`.
+- `WindowsUser`: meno Windows používateľa, pod ktorým budú služby agentov spustené. Predvolaná hdodnota je `buildAgent`.
+- `WindowsPassword`: = heslo Windows používateľa, pod ktorým budú služby agentov spustené. Predvolaná hdodnota je `buildAgent`.
-Skript nemá žiadne parametre.
+Zoznam agentov ktorí sa nakonfigurujú je v súbore `configure-agents.json`. Je potrebné stiahnuť si ZIP s aktuálnym agentom
+(v časti _Agent pools_ v Devops). Všetci agenti sú registrovaní ako Windows služba a spustený sú pod jedným používateľom
+(`$WindowsUser`). Ak tento používateľ vo Windows neexistuje, automaticky sa vytvorí.
-## Skript `configure.ps1`
+Ak je agent za proxy serverom, je potrebné pri skripte `configure-agents.ps1` vytvoriť súbory `.proxy` a `.proxybypass`.
+Skript ich nakopíruje ku každému agentovi čo vytvorí. V súbore `.proxy` je potrebné uviesť adresu proxy.
-Skript nakonfiguruje všetko potrebné, čo je možné spraviť automaticky a to je takmer všetko, čo je popísané ďalej v tomto
-dokumente.
+``` text
+http://1.2.3.4:5678
+```
-Skript má nasledovné parametre (všetky nepovinné):
+V súbore `.proxybypass` je potrebné uviesť adresy, ktoré sa majú obísť proxy serverom, napríklad:
-- `-Proxy` – adresa proxy servera, zadaná aj so schémou (napr. `http://`). Predvolená hodnota je prázdny reťazec (bez proxy).
-- `-NewmanPath` – cesta, kde bude nainštalovaný Newman. Predvolená hodnota je `C:\newman`.
-- `-ToolsPath` – cesta k rôznym nástrojom. Táto cesta je pridaná do systémovej premennej `PATH`, aby nástroje boli globálne dostupné. Predvolená hodnota je `C:\tools`,
-- `-CachePath` – cesta, kde sa nastaví keš pre rôzne programy (NPM, Cypress…). Predvolená hodnota je `C:\cache`.
+``` text
+localhost
+127.0.0.1
+build5
+```
## Script `install-load-tests.ps1`
-Skript nainštaluje / nakonfiguruje všetko potrebné pre load testy. Tento script je potrebné spúšťať len na build mašinách,
+Skript nainštaluje / nakonfiguruje všetko potrebné pre load testy. Tento skript je potrebné spúšťať len na build mašinách,
ktoré budú spúšťať load testy. Nainštaluje software, ktorý je definovaný v `load-tests-buildmachine-packages.config`.
Taktiež stiahne a rozbalí JMeter _(by default do `C:\tools\jmeter`)_ a nainštaluje potrebné pluginy.
@@ -89,164 +95,3 @@ Skript má nasledovné parametre (všetky nepovinné):
- `JMeterVersion` - Verzia JMeter-u, ktorá sa má nainštalovať _(default je `5.4.1`)_.
- `ToolsPath` - Adresár, kde sa nachádzajú naše tools. Tam sa nainštaluje JMeter _(default je `C:\tools`)_.
- `PluginsList` - Čiarkou oddelený zoznam pluginov _(Plugin Id)_, ktoré sa majú nainštalovať _(default je `jpgc-graphs-basic,jpgc-casutg,jpgc-prmctl`)_.
-
-## PowerShell (`install.ps1`)
-
-Je potrebné povoliť spúšťanie skriptov: `Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope LocalMachine`.
-Skript `install.ps1` to nastaví sám.
-
-## DevOps build agenti
-
-**DevOps agentov treba konfigurovať nakoniec, až keď je nainštalované a nastavné všetko ostatné**, aby si zistili info o všetkom
-čo je v počítači. V prípade, že sa neskôr nainštaluje niečo nové, čo má na agentov vplyv, je potrebné reštartovať ich služby
-(prípadne počítač).
-
-Každý agent musí bežať pod svojim vlastným používateľom. Je to kvôli problémom, keď sa agenti bili o nejaké zdroje počas buildu,
-ak bežali pod spoločným účtom. Na jednoduché pridanie viacerých používateľov naraz slúži skript
-[`create-users.ps1`](https://github.com/Kros-sk/kros-sk.github.io/blob/master/buildmachine/create-users.ps1).
-
-Agentovi je potrebné nastaviť proxy server. V adresári agenta je potrebné vytvoriť súbor `.proxy` (pozor, súbor naozaj začína
-bodkou), v ktorom je zapísaná adresa proxy servera aj s protokolom a portom (napr. `http://123.112.1.9:1234`).
-
-Niekedy sú po rozbalení ZIP-u agenta zblbnuté práva na jeho adresári a súboroch, čo sa prejavuje chybovou hláškou:
-
-> This access control list is not in canonical form and therefore cannot be modified.
-
-Vtedy treba spustiť nasladovný príkaz: `icacls.exe {agent-folder} /reset /T /C /L /Q`. Parameter `{agent-folder}` je cesta
-k zložke s agentom.
-
-Samotný agent sa potom nakonfiguruje jednoducho nasledovným príkazom:
-
-``` sh
-.\config.cmd --unattended --url "https://dev.azure.com/krossk/" --auth pat --token {token} --runAsService --pool {pool-name} --agent {agent-name} --windowsLogonAccount {user-name} --windowsLogonPassword {user-password}
-```
-
-- `{token}`: PAT (personal access token) v DevOps, ktorý musí mať nastavený scope **Read & manage** pre **Agent Pools**.
-Tento token môže mať krátku platnosť a je potrebný iba na zaregistrovanie agenta v DevOps agent pool-e.
-Pre samotný beh agenta potrebný nie je.
-- `{pool-name}`: Meno pool-u, do ktorého bude agent pridaný.
-- `{agent-name}`: Meno agenta.
-- `{user-name}`: Meno používateľa, pod ktorým agent beží.
-- `{user-password}`: Heslo používateľa, pod ktorým agent beží.
-
-⚠ **Dôležité nastavenie pre Agent Pools** - v Devopse v jeho nastaveniach (prístupné cez `Organization settings`),
-treba nastaviť `Maintenance job`, ktorý bude pravidelne prečisťovať miesto. Nastaviť ho podľa iných pools tak,
-aby sa ideálne vykonávanie robilo v iných časoch (nie je to nutná podmienka).
-
-## Systémové premenné (`configure.ps1`)
-
-### Všeobecné systémové premenné
-
-- `CYPRESS_CACHE_FOLDER` – štandardne nastavená na `C:\cache\cypress`. Cypress si tu ukladá stiahnuté binárky.
-- `NPM_CONFIG_CACHE` – štandardne nastavená na `C:\cache\npm`. NPM si tu ukladá stiahnuté balíčky.
-- `NUGET_PACKAGES` – štandardne nastavená na `C:\cache\nuget`. NuGet si tu ukaldá stiahnuté balíčky.
-
-### Proxy systémové premenné
-
-Hodnota `{proxy}` je IP adresa nášho proxy servera aj so schémou a portom (http://a.b.c.d:port).
-
-V systéme je nutné nastaviť niekoľko premenných (pre celý systém, nie iba pre používateľa):
-
-- `HTTP_PROXY` - `{proxy}`
-- `HTTPS_PROXY` - `{proxy}`
-
-Všetky systémové premenné automaticky nastaví skript `configure.ps1`.
-
-## Web Deploy (potrebné spraviť ručne)
-
-> Web deploy služieb používajú iba na SSW, takže ak nie je potrebné, netreba sa s ním zaoberať.
-
-Niektoré release pipeline-y používajú _Web Deploy_ spôsob nasadenia služby do Azure,
-[takže je potrebné ho nainštalovať](https://www.iis.net/downloads/microsoft/web-deploy).
-Po inštalácii je potrebné manuálne nastaviť proxy v súbore `msdeploy.exe.config`, na oboch miestach:
-
-- `C:\Program Files\IIS\Microsoft Web Deploy V3`
-- `C:\Program Files (x86)\IIS\Microsoft Web Deploy V3`
-
-Do súborov je potrebné doplniť nasledujúcu sekciu. _Adresu proxy servera je potrebné zadať aj so schémou `http://`._
-
-``` xml
-
-
-
-
-
-```
-
-## NPM (`configure.ps1`)
-
-Nastavenie proxy (je potrebné ho zadať aj so schémou `http://`):
-
-``` sh
-npm config set proxy {proxy}
-npm config set https-proxy {proxy}
-```
-
-Po nakonfigurovaní nového servera sa môže stať, že projekt si nevie stiahnuť npm balíčky
-(konkrétne sa to stalo pre projekt s Cypress testami). Vtedy treba spustiť príkaz:
-
-``` sh
-npm config set registry https://registry.npmjs.org/
-```
-
-### Globálne NPM nástroje (`configure.ps1`)
-
-⚠ Globálna inštalácia (`npm install -g`) v prípade NPM znamená, že sa daná vec nainštaluje
-_globálne pre aktuálneho používateľa_, do jeho profilu. Toto nechceme, my daný nástroj potrebujeme globálne
-pre celý systém. Neexistuje možnosť ako toto v NPM spraviť (aspoň o nej nevieme), takže jediné čo nám ostáva,
-je nainštalovať to takto a potom ručne skopírovať na nejaké všeobecné miesto. Po prekopírovaní je možné danú
-vec pokojne odinštalovať.
-
-**NewMan:** `npm install -g newman` Po nainštalovaní skopírovať do `C:\newman` (príkaz musí byť dostupný ako
-`C:\newman\newman.cmd`) a do systémovej premennej `PATH` pridať cestu `C:\newman`.
-Nainštalovaný nástroj sa nachádza v zložke `%APPDATA%\npm\`.
-
-## DotNet Global Tools (`configure.ps1`)
-
-Je potrebné nainštalovať nasledovné dotnet tools:
-
-- Kros.DummyData.Initializer
-- Kros.VariableSubstitution
-
-Nástroje sa inštalujú príkazom `dotnet tool install --global {toolName} --tool-path {toolPath}`.
-
-## Inštalácia Docker 🐳
-
-Docker je potrebné nainštalovať "ručne". Najskôr je v programoch a súčastiach potrebné zapnúť `Hyper-V` ![hyper-v](hyper-v.png).
-> Ak by bola časť možností disablovaná, tak je potrebné zapnúť virtualizáciu na úrovni BIOSu.
-
-Ďalej [nainštalovať linux subsystem](https://docs.microsoft.com/en-us/windows/wsl/install) `wsl --install`.
-
-Následne samotný [Docker](https://docs.docker.com/desktop/windows/install/).
-
-### Nastavenie spúšťania
-
-`Docker desktop.exe` sa spúšťa až s prihlásením používateľa *(po odhlásení sa vypne)*. Je potrebné naplánovať udalosť po štarte mašiny, ktorá ho spustí.
-Je na to vytvorený script `.\register-docker-start-schedule.ps1 "username" "password"`. Je potrebné zadať používateľa pod ktorým sa to bude spúšťať.
-
-Taktiež je potrebné pridať všetkých používateľov _(pod ktorými bežia agenti)_ do skupiny `docker-users` _(aby mali prístup k docker daemon-u)_.
-Na to je tiež vytvorený script `.\add-users-to-docker-group.ps1 "esw" 15 1`.
-
-### Čistenie dát po docker príkazoch
-
-Docker pri svojej práci vytvára rôzne dáta. Jednotlivé images, cache, ... Keďže to beží pod `WSL` tak všetky dáta sú v `C:\Users\{userName}\AppData\Local\Docker\wsl\data\ext4.vhdx`. Z času na čas je to potrebné prečistiť. Robíme to tak, že odstránime jednotlivé images a "shrinkneme" daný súbor. Na to sa používa script `clean-docker.ps1`. Jeho automatické spúšťani je možné naplánovať pomocou scriptu `.\register-docker-clean-schedule.ps1 "username" "password"`. *(nateraz je to naplánované na každú nedeľu 20:00)*
-
-## Čistenie dočasných (temp) súborov (`configure.ps1`)
-
-Mnoho vecí vytvára v `Temp` adresári používateľa svoje súbory a neupravuje si po sebe. Keďže každý agent beží pod vlastným
-používateľským účtom má aj vlastnú `Temp` zložku a tak množstvo takto vytvorených dát je celkom významné. Z dlhodobého hľadiska
-s tým je problém, pretože nám pravidelne dochádza miesto na disku.
-
-Na prečistenie `Temp` zložiek všetkých používateľov slúži skript [`clean-temp.ps1`](https://github.com/Kros-sk/kros-sk.github.io/blob/master/buildmachine/clean-temp.ps1).
-Tento skript vymaže všetky súbory v `Temp` adresároch všetkých používateľov, ktoré sú staršie ako 4 dni.
-Túto hodnotu je možné zmeniť parametrom `-OlderThanDays`.
-Ak sa spúšťa z príkazovej riadky, je potrebné ho spúšťať ako administrátor (inak vymaže len temp aktuálne prihláseného
-používateľa). Na _build_ počítač ho treba pridať ako naplánovanú úlohu, ktorá sa spustí raz za deň a `Temp` prečistí.
-Skript je potrebné nakopírovať do zložky `C:\tools` a naplánovanú úlohu vytvoriť nasledovným príkazom,
-spusteným ako administrátor:
-
-``` sh
-schtasks /create /ru "NT AUTHORITY\SYSTEM" /rl HIGHEST /sc daily /st 03:30 /tn "BuildAgents\CleanTemp" /tr "pwsh -File 'C:\tools\clean-temp.ps1' -SaveTranscript"
-```
-
-Skript vytvorí záznam o svojom poslednom behu do súboru `clean-temp.log`.
diff --git a/buildmachine/clean-nx-cache.ps1 b/buildmachine/clean-nx-cache.ps1
index 66115af..2a6e6f1 100644
--- a/buildmachine/clean-nx-cache.ps1
+++ b/buildmachine/clean-nx-cache.ps1
@@ -4,7 +4,7 @@ Delete old files and directories from NX cache folder.
#>
param (
[Parameter(Mandatory = $false)][string]$CacheFolder = "e:\cache\nx\",
- [Parameter(Mandatory = $false)][int]$OlderThanDays = 20,
+ [Parameter(Mandatory = $false)][int]$OlderThanDays = 10,
[Parameter(Mandatory = $false)][switch]$SaveTranscript,
[Parameter(Mandatory = $false)][string]$TranscriptFile = "",
[Parameter(Mandatory = $false)][switch]$DryRun
diff --git a/buildmachine/clean-temp.ps1 b/buildmachine/clean-temp.ps1
index ab758b7..e4d72d6 100644
--- a/buildmachine/clean-temp.ps1
+++ b/buildmachine/clean-temp.ps1
@@ -5,7 +5,7 @@ Delete old files and directories from Temp folders of all users.
param (
[Parameter(Mandatory = $false)][string]$BaseFolder = "C:\Users",
[Parameter(Mandatory = $false)][string]$TempSubfolder = "AppData\Local\Temp",
- [Parameter(Mandatory = $false)][int]$OlderThanDays = 2,
+ [Parameter(Mandatory = $false)][int]$OlderThanDays = 1,
[Parameter(Mandatory = $false)][switch]$SaveTranscript,
[Parameter(Mandatory = $false)][string]$TranscriptFile = "",
[Parameter(Mandatory = $false)][switch]$DryRun
@@ -21,8 +21,8 @@ if ($SaveTranscript) {
Start-Transcript -Path $TranscriptFile -UseMinimalHeader
}
-if ($OlderThanDays -lt 1) {
- $OlderThanDays = 1
+if ($OlderThanDays -lt 0) {
+ $OlderThanDays = 0
}
$nowDate = [DateTime]::Now.ToString("d.M.yyyy")
diff --git a/buildmachine/configure-agents.json b/buildmachine/configure-agents.json
new file mode 100644
index 0000000..74fbe82
--- /dev/null
+++ b/buildmachine/configure-agents.json
@@ -0,0 +1,19 @@
+{
+ "pools": [
+ {
+ "name": "Esw",
+ "agents": [
+ "test-esw-01",
+ "test-esw-02",
+ "test-esw-03"
+ ]
+ },
+ {
+ "name": "Cypress",
+ "agents": [
+ "test-cypress-01",
+ "test-cypress-02"
+ ]
+ }
+ ]
+}
diff --git a/buildmachine/configure-agents.ps1 b/buildmachine/configure-agents.ps1
new file mode 100644
index 0000000..1170799
--- /dev/null
+++ b/buildmachine/configure-agents.ps1
@@ -0,0 +1,87 @@
+#Requires -RunAsAdministrator
+
+[CmdletBinding()]
+param (
+ [Parameter()][string]$Pat,
+ [Parameter()][string]$AgentsBaseFolder = "C:/agents",
+ [Parameter()][string]$AgentZipFile = "vsts-agent-win-x64.zip",
+ [Parameter()][string]$WindowsUser = "buildAgent",
+ [Parameter()][string]$WindowsPassword = "buildAgent"
+)
+
+if ([string]::IsNullOrWhiteSpace($Pat)) {
+ Write-Host "PAT is not set. Exiting." -ForegroundColor Red
+ Write-Host "PAT must have 'Read & manage' rights in 'Agent Pools' scope."
+ exit 1
+}
+$scriptFolder = [IO.Path]::GetDirectoryName($PSCommandPath)
+$agentZip = [IO.Path]::Combine($scriptFolder, $AgentZipFile)
+if (-not (Test-Path $agentZip)) {
+ Write-Host "Agent zip file '$agentZip' not found. Exiting." -ForegroundColor Red
+ exit 2
+}
+$configFile = [IO.Path]::ChangeExtension($PSCommandPath, "json")
+Write-Host "Reading configuration from '$configFile'"
+if (-not (Test-Path $configFile)) {
+ Write-Host "Configuration file '$configFile' not found. Exiting." -ForegroundColor Red
+ exit 3
+}
+
+Write-Host "Checking local user '$WindowsUser'."
+net user $WindowsUser
+if ($LASTEXITCODE -eq 0) {
+ Write-Host "Local user '$WindowsUser' already exist."
+}
+else {
+ Write-Host "Local user '$WindowsUser' does not exist."
+ net user $WindowsUser $WindowsPassword /add /passwordchg:no /expires:never
+ Write-Host "Local user '$WindowsUser' was craeted."
+}
+
+if (-not (Test-Path $AgentsBaseFolder)) {
+ Write-Host "Creating base folder for agents '$AgentsBaseFolder'."
+ New-Item -Path $AgentsBaseFolder -ItemType Directory
+}
+
+$devOpsServerUrl = "https://dev.azure.com/krossk/"
+
+$agents = Get-Content -Raw -Path $configFile | ConvertFrom-Json
+$agents.pools | ForEach-Object {
+ $pool = $_
+ $poolName = $pool.name
+ $pool.agents | ForEach-Object {
+ $agentName = $_
+ Write-Host "Configuring agent '$agentName' in agent pool '$poolName'" -ForegroundColor Green
+ $agentFolder = [IO.Path]::Combine($AgentsBaseFolder, $agentName)
+ Write-Host "Agent folder is '$agentFolder'"
+ if (Test-Path $agentFolder) {
+ Write-Host "Agent folder already exists. Configuration of this agent is skipped."
+ Write-Host
+ continue
+ }
+ else {
+ New-Item -Path $agentFolder -ItemType Directory
+ Write-Host "Unzipping agent to folder."
+ Expand-Archive -LiteralPath $agentZip -DestinationPath $agentFolder
+ $proxyFile = [IO.Path]::Combine($scriptFolder, ".proxy")
+ if (Test-Path -Path $proxyFile) {
+ Write-Host "Copying proxy settings '$proxyFile' to agent folder."
+ Copy-Item -Path $proxyFile -Destination $agentFolder -Force
+ } else {
+ Write-Host "Proxy settings file '$proxyFile' not found." -ForegroundColor Yellow
+ Write-Host "If agent is behind proxy, create file '$proxyFile' with proxy settings, otherwise the agent may not work correctly." -ForegroundColor Yellow
+ }
+ $proxyBypassFile = [IO.Path]::Combine($scriptFolder, ".proxybypass")
+ if (Test-Path -Path $proxyBypassFile) {
+ Write-Host "Copying proxy settings '$proxyBypassFile' to agent folder."
+ Copy-Item -Path $proxyBypassFile -Destination $agentFolder -Force
+ }
+
+ $agentConfig = [IO.Path]::Combine($agentFolder, "config.cmd")
+ Write-Host "Running agent configuration file '$agentConfig'."
+ & $agentConfig --unattended --url $devOpsServerUrl --auth pat --token $Pat --runAsService --pool $poolName --agent $agentName --windowsLogonAccount $WindowsUser --windowsLogonPassword $WindowsPassword
+ Write-Host "Agent '$agentName' is configured." -ForegroundColor Green
+ Write-Host
+ }
+ }
+}
diff --git a/buildmachine/configure.ps1 b/buildmachine/configure.ps1
index 6880f21..5bb02bd 100644
--- a/buildmachine/configure.ps1
+++ b/buildmachine/configure.ps1
@@ -3,7 +3,6 @@
[CmdletBinding()]
param (
[Parameter()][string]$Proxy = "",
- [Parameter()][string]$NewmanPath = "C:\newman",
[Parameter()][string]$ToolsPath = "C:\tools",
[Parameter()][string]$CachePath = "C:\cache"
)
@@ -53,48 +52,64 @@ AddToPath $ToolsPath
# Cache folders
CreateFolder $CachePath
+Write-Host "Set rights for 'Users' group for cache folder."
+$acl = Get-Acl -Path $CachePath
+$usersRule = New-Object Security.AccessControl.FileSystemAccessRule 'BUILTIN\Users', 'FullControl', 'ContainerInherit, ObjectInherit', 'None', 'Allow'
+$acl.SetAccessRule($usersRule)
+Set-Acl -Path $CachePath -AclObject $acl
+
$cypressCachePath = [System.IO.Path]::Join($CachePath, "cypress")
CreateFolder $cypressCachePath "CYPRESS_CACHE_FOLDER"
$npmCachePath = [System.IO.Path]::Join($CachePath, "npm")
CreateFolder $npmCachePath "NPM_CONFIG_CACHE"
$nugetCachePath = [System.IO.Path]::Join($CachePath, "nuget")
CreateFolder $nugetCachePath "NUGET_PACKAGES"
+$nugetCachePath = [System.IO.Path]::Join($CachePath, "nx")
+CreateFolder $nugetCachePath
+Write-Host "Set proxy" -ForegroundColor Green
$proxyUri = $null
+$proxyValue = ""
if ([string]::IsNullOrWhiteSpace($Proxy)) {
Write-Host " Proxy is empty, so no proxy environment variables will be set."
}
else {
$proxyUri = New-Object -TypeName System.Uri $Proxy
- Write-Host " Proxy is $proxyUri"
$proxyValue = $proxyUri.ToString().TrimEnd("/")
+ Write-Host " Proxy is $proxyValue"
+ Write-Host " Set environment variables HTTP_PROXY and HTTPS_PROXY."
SetEnvVariable "HTTP_PROXY" $proxyValue
SetEnvVariable "HTTPS_PROXY" $proxyValue
+
+ Write-Host " Set proxy for NPM"
+ npm config set proxy $proxyValue
+ npm config set https-proxy $proxyValue
}
+# Azure Artifacts Credential Provider
+Write-Host "Install Azure Artifacts Credential Provider" -ForegroundColor Green
+Invoke-Expression "& { $(Invoke-RestMethod https://aka.ms/install-artifacts-credprovider.ps1) }"
# .NET global tools
+Write-Host "Add NuGet source nuget.org" -ForegroundColor Green
+dotnet nuget add source "https://api.nuget.org/v3/index.json" --name "nuget.org"
+
Write-Host "Install .NET tool Kros.DummyData.Initializer" -ForegroundColor Green
dotnet tool install Kros.DummyData.Initializer --tool-path $ToolsPath
Write-Host "Install .NET tool Kros.VariableSubstitution" -ForegroundColor Green
dotnet tool install Kros.VariableSubstitution --tool-path $ToolsPath
-Write-Host ".NET WebAssembly build tools for .NET 6 projects" -ForegroundColor Green
-dotnet workload install wasm-tools-net6
-
-# NPM proxy
-if (-not $proxyUri -eq $null) {
- Write-Host "Set proxy for NPM: $proxyUri" -ForegroundColor Green
- npm config set proxy $proxyUri
- npm config set https-proxy $proxyUri
-}
+Write-Host "Install .NET tool dotnet-affected" -ForegroundColor Green
+dotnet tool install dotnet-affected --tool-path $ToolsPath
+# Write-Host ".NET WebAssembly build tools for .NET 6 projects" -ForegroundColor Green
+# dotnet workload install wasm-tools-net6
# Newman
+$NewmanPath = [System.IO.Path]::Join($ToolsPath, "newman")
Write-Host "Install 'newman' to '$NewmanPath'" -ForegroundColor Green
Write-Host " Install 'newman' globally"
npm install -g newman
-
if (Test-Path $NewmanPath) {
Write-Host " Delete existing folder '$NewmanPath'"
Remove-Item $NewmanPath -Recurse
@@ -107,18 +122,28 @@ New-Item -Path $NewmanNodeModulesPath -ItemType Directory
Write-Host " Copy 'newman' files to '$NewmanPath'"
Copy-Item -Path "$env:APPDATA\npm\newman*" -Destination $NewmanPath
Copy-Item -Path "$env:APPDATA\npm\node_modules\newman" -Destination $NewmanNodeModulesPath -Recurse
-
Write-Host " Uninstall 'newman' globally"
npm uninstall -g newman
AddToPath $NewmanPath
-
# Scheduled tasks
Write-Host "Create scheduled tasks" -ForegroundColor Green
Write-Host " Copy scripts to '$ToolsPath' folder"
Copy-Item -Path "clean-temp.ps1" -Destination $ToolsPath -Force
+Copy-Item -Path "clean-nx-cache.ps1" -Destination $ToolsPath -Force
-Write-Host " Create scheduled task 'BuildAgents\CleanTemp'"
+$scheduledTask = "BuildAgents\Clean Temp"
+Write-Host " Create scheduled task '{$scheduledTask}'"
$script = [System.IO.Path]::Join($ToolsPath, "clean-temp.ps1")
-schtasks /create /ru "NT AUTHORITY\SYSTEM" /rl HIGHEST /sc daily /st 03:30 /tn "BuildAgents\CleanTemp" /tr "pwsh -File '$script' -SaveTranscript"
+schtasks /create /f /ru "NT AUTHORITY\SYSTEM" /rl HIGHEST /sc daily /st 02:00 /tn $scheduledTask /tr "pwsh -File '$script' -SaveTranscript"
+
+$scheduledTask = "BuildAgents\Clean Cypress artifacts"
+Write-Host " Create scheduled task '{$scheduledTask}'"
+$script = [System.IO.Path]::Join($ToolsPath, "clean-temp.ps1")
+schtasks /create /f /ru "NT AUTHORITY\SYSTEM" /rl HIGHEST /sc weekly /d SUN /st 22:00 /tn $scheduledTask /tr "pwsh -File '$script' -TempSubfolder 'AppData\Roaming\Cypress\cy\production\projects' -OlderThanDays 5 -SaveTranscript -TranscriptFile 'cypress'"
+
+$scheduledTask = "BuildAgents\Clean NX cache"
+Write-Host " Create scheduled task '{$scheduledTask}'"
+$script = [System.IO.Path]::Join($ToolsPath, "clean-nx-cache.ps1")
+schtasks /create /f /ru "NT AUTHORITY\SYSTEM" /rl HIGHEST /sc daily /st 02:30 /tn $scheduledTask /tr "pwsh -File '$script' -SaveTranscript"
diff --git a/buildmachine/install.json b/buildmachine/install.json
new file mode 100644
index 0000000..0690381
--- /dev/null
+++ b/buildmachine/install.json
@@ -0,0 +1,73 @@
+{
+ "$schema" : "https://aka.ms/winget-packages.schema.2.0.json",
+ "WinGetVersion" : "1.8.1911",
+ "Sources" :
+ [
+ {
+ "Packages" :
+ [
+ {
+ "PackageIdentifier" : "Git.Git"
+ },
+ {
+ "PackageIdentifier" : "Google.Chrome"
+ },
+ {
+ "PackageIdentifier" : "Kubernetes.kubectl"
+ },
+ {
+ "PackageIdentifier" : "mcmilk.7zip-zstd"
+ },
+ {
+ "PackageIdentifier" : "Microsoft.AppInstaller"
+ },
+ {
+ "PackageIdentifier" : "Microsoft.Azure.StorageEmulator"
+ },
+ {
+ "PackageIdentifier" : "Microsoft.DotNet.SDK.7"
+ },
+ {
+ "PackageIdentifier" : "Microsoft.DotNet.SDK.8"
+ },
+ {
+ "PackageIdentifier" : "Microsoft.Edge"
+ },
+ {
+ "PackageIdentifier" : "Microsoft.EdgeWebView2Runtime"
+ },
+ {
+ "PackageIdentifier" : "Microsoft.NuGet"
+ },
+ {
+ "PackageIdentifier" : "Microsoft.PowerShell"
+ },
+ {
+ "PackageIdentifier" : "Microsoft.VisualStudio.2022.BuildTools"
+ },
+ {
+ "PackageIdentifier" : "Microsoft.VisualStudioCode"
+ },
+ {
+ "PackageIdentifier" : "Microsoft.WebDeploy"
+ },
+ {
+ "PackageIdentifier" : "Microsoft.WindowsTerminal"
+ },
+ {
+ "PackageIdentifier" : "OpenJS.NodeJS.LTS"
+ },
+ {
+ "PackageIdentifier" : "Rizonesoft.Notepad3"
+ }
+ ],
+ "SourceDetails" :
+ {
+ "Name" : "winget",
+ "Identifier" : "Microsoft.Winget.Source_8wekyb3d8bbwe",
+ "Argument" : "https://cdn.winget.microsoft.com/cache",
+ "Type" : "Microsoft.PreIndexed.Package"
+ }
+ }
+ ]
+}
diff --git a/buildmachine/install.ps1 b/buildmachine/install.ps1
index b273f5d..415ede9 100644
--- a/buildmachine/install.ps1
+++ b/buildmachine/install.ps1
@@ -1,14 +1,37 @@
#Requires -RunAsAdministrator
-Write-Host "Set execution policy to 'ByPass'" -ForegroundColor Yellow
-Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope LocalMachine
+param (
+ [Parameter()][string]$WingetJsonPath = ""
+)
-Write-Host "Install chocolatey" -ForegroundColor Yellow
-[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
-Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
+if ([string]::IsNullOrWhiteSpace($WingetJsonPath)) {
+ $WingetJsonPath = [IO.Path]::ChangeExtension($PSCommandPath, "json")
+}
+Write-Host "JSON file with packages to install is '$WingetJsonPath'."
+if (-not (Test-Path $WingetJsonPath)) {
+ Write-Host "JSON file with packages to install not found. Exiting." -ForegroundColor Red
+ exit 1
+}
-Write-Host "Install software" -ForegroundColor Yellow
-choco install buildmachine-packages.config --yes
+Write-Host "Installing packages from JSON file." -ForegroundColor Green
+$json = Get-Content -Raw -Path $WingetJsonPath | ConvertFrom-Json
+$json.Sources | ForEach-Object {
+ $source = $_
+ $source.Packages | ForEach-Object {
+ $packageId = $_.PackageIdentifier
+ Write-Host "Installing package '$packageId'" -ForegroundColor Yellow
+ winget install --id $packageId --exact --scope machine
+ Write-Host
+ }
+}
+# Azure CLI can also be installed using WinGet, but it was very unreliable – the installation often failed.
+Write-Host "Installing Azure CLI" -ForegroundColor Green
+$ProgressPreference = 'SilentlyContinue'
+Write-Host "Download Azure CLI installer."
+Invoke-WebRequest -Uri https://aka.ms/installazurecliwindowsx64 -OutFile .\AzureCLI.msi
+Write-Host "Execute Azure CLI installer."
+Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet'
+Write-Host "Remove Azure CLI installer."
+Remove-Item .\AzureCLI.msi
Write-Host
-Write-Host "Everything is installed. If you want install software for load testing, then run the 'install-load-tests.ps1' otherwise run the 'configure.ps1' script." -ForegroundColor Green