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