Skip to content

Feat/GitHub actions pipeline #381

Feat/GitHub actions pipeline

Feat/GitHub actions pipeline #381

Workflow file for this run

name: "CI: Build and Test"
on:
push:
branches: [main, feat/github-actions-pipeline]
paths:
- "**.cs"
- "**.cshtml"
- "**.tsx"
- "**.js"
- "**.json"
- "**.csproj"
- "**.props"
- "**.targets"
- "**.sln"
- "**.yml"
pull_request:
branches: [main]
paths:
- "**.cs"
- "**.cshtml"
- "**.tsx"
- "**.js"
- "**.json"
- "**.csproj"
- "**.props"
- "**.targets"
- "**.sln"
env:
XBK_DIR: "${{ github.workspace }}\\xbk"
UMT_DIR: "${{ github.workspace }}\\umt"
DB_USER: "kentico"
DB_PASSWORD: "Asdfg12345!@#$%"
DB_DATABASE: "pwtest"
XBK_ADMIN_PASSWORD: "admin"
LICENSE_FILE: "${{ github.workspace }}\\license.txt"
XBK_URL: ""
SQLSERVER_NAME: ".\\SQLEXPRESS"
jobs:
build:
runs-on: windows-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
path: ${{ env.UMT_DIR }}
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: "${{ env.UMT_DIR}}\\global.json"
- name: Install dependencies and build
working-directory: ${{ env.UMT_DIR }}
run: |
dotnet restore --locked-mode
dotnet tool restore
- name: <DB> Install SQL Server
uses: Particular/install-sql-server-action@v1.0.0
with:
connection-string-env-var: SQL_SERVER_CONNECTION_STRING
catalog: kentico-boilerplate
- name: <DB> Create Kentico DB user
run: |
sqlcmd -Q "CREATE LOGIN ${{ env.DB_USER}} WITH PASSWORD = '${{ env.DB_PASSWORD }}';
CREATE USER kentico FOR LOGIN kentico;
GO"
- name: <DB> Add kentico user to sysadmin role
run: |
sqlcmd -Q "sp_addsrvrolemember '${{ env.DB_USER}}', 'sysadmin';
GO"
- name: <DB> Enable SQL authentication
run: |
Write-Output "SQL Server: Setting Mixed Mode Authentication."
New-ItemProperty 'HKLM:\Software\Microsoft\Microsoft SQL Server\MSSQL16.SQLEXPRESS\MSSQLServer\' -Name 'LoginMode' -Value 2 -Force
Write-Output "SQL Server: Forcing Restart of Instance."
Restart-Service -Force 'MSSQL$SQLEXPRESS'
- name: <DB> Create database with collation Latin1_General_CI_AS
run: |
sqlcmd -S "${{ env.SQLSERVER_NAME}}" -U '${{ env.DB_USER}}' -P '${{ env.DB_PASSWORD }}' -Q "CREATE DATABASE ${{ env.DB_DATABASE}} COLLATE Latin1_General_CI_AS;"
- name: <DB> Test SQL Server login as admin
run: |
sqlcmd -S "${{ env.SQLSERVER_NAME}}" -U '${{ env.DB_USER}}' -P '${{ env.DB_PASSWORD }}' -Q "SELECT 'Login successful' AS Message"
- name: <XbK> Install kentico templates
working-directory: ${{ env.UMT_DIR }}
run: |
$XBK_CORE_VERSION = Select-String -Path "Directory.Packages.props" -Pattern '<PackageVersion Include="Kentico.Xperience.Core" Version="([^"]*)"' | ForEach-Object { $_.Matches.Groups[1].Value }
mkdir ${{ env.XBK_DIR }}
cd ${{ env.XBK_DIR }}
dotnet new install Kentico.Xperience.Templates::$XBK_CORE_VERSION
- name: <XbK> Create Kentico Xperience project
working-directory: ${{ env.XBK_DIR }}
run: |
echo "y" | dotnet new kentico-xperience-mvc -n kentico-boilerplate
- name: <XbK> Run kentico dbmanager with license
working-directory: ${{ env.XBK_DIR }}
run: |
echo ${{ secrets.XPERIENCE_BY_KENTICO_LICENSE }} > ${{ env.LICENSE_FILE }}
Write-Output "SQL_SERVER_CONNECTION_STRING: $env:SQL_SERVER_CONNECTION_STRING"
dotnet kentico-xperience-dbmanager -- -s "${{ env.SQLSERVER_NAME}}" -d "${{ env.DB_DATABASE }}" -u "${{ env.DB_USER }}" -p "${{ env.DB_PASSWORD }}" -a "${{ env.XBK_ADMIN_PASSWORD }}" --license-file "${{ env.LICENSE_FILE }}" --use-existing-database --hash-string-salt "<hash_string_salt>"
sqlcmd -S "${{ env.SQLSERVER_NAME}}" -U 'kentico' -P '${{ env.DB_PASSWORD }}' -d "${{ env.DB_DATABASE }}" -Q "SELECT * FROM CMS_User"
- name: <UMT> Prepare appsettings.json for migration
working-directory: ${{ env.UMT_DIR }}
run: |
$EXAMPLE_APPSETTINGS = "examples/Kentico.Xperience.UMT.Example.Console/appsettings.json"
$CMS_CONNECTION_STRING = (Get-Content "${{ env.XBK_DIR }}/appsettings.json" | ConvertFrom-Json).ConnectionStrings.CMSConnectionString
$appsettings = Get-Content $EXAMPLE_APPSETTINGS | ConvertFrom-Json
$appsettings.ConnectionStrings.CMSConnectionString = $CMS_CONNECTION_STRING
$appsettings.WebApplicationPhysicalPath = "${{ env.XBK_DIR }}"
$appsettings | ConvertTo-Json -Compress | Set-Content $EXAMPLE_APPSETTINGS
Get-Content $EXAMPLE_APPSETTINGS
- name: <UMT> Run example migration
working-directory: ${{ env.UMT_DIR }}\examples\Kentico.Xperience.UMT.Example.Console\
run: |
dotnet run
- name: Install Playwright
working-directory: ${{ env.UMT_DIR }}\tests\Kentico.Xperience.UMT.Tests
run: |
dotnet build
bin\Debug\net8.0\playwright.ps1 install --with-deps
- name: Prepare test.runsettings
working-directory: ${{ env.UMT_DIR }}
run: |
Get-Content "${{ env.XBK_DIR }}\Properties\launchSettings.json"
$url = (Get-Content "${{ env.XBK_DIR }}\Properties\launchSettings.json" | ConvertFrom-Json).profiles.kentico_boilerplate.applicationUrl
echo "XBK_URL=$url" | Out-File -FilePath ${{ github.env }} -Encoding utf8 -Append
Write-Output "Setting XbK URL for tests: $url"
(Get-Content test.runsettings) -replace "<BASE_URL>([^<]*)</BASE_URL>", "<BASE_URL>$url</BASE_URL>" | Set-Content test.runsettings
(Get-Content test.runsettings) -replace "<ADMINISTRATION_PASSWORD>([^<]*)</ADMINISTRATION_PASSWORD>", "<ADMINISTRATION_PASSWORD>${{ env.XBK_ADMIN_PASSWORD}}</ADMINISTRATION_PASSWORD>" | Set-Content test.runsettings
Get-Content test.runsettings
- name: Start xbk and run tests
run: |
cd ${{ env.XBK_DIR }}
Start-Job -ScriptBlock { dotnet run --project "${{ env.XBK_DIR }}\kentico-boilerplate.csproj" } -Name "XbK"
Write-Output "XbK starting..."
$timeout = 100
$elapsed = 0
$url = (Get-Content "${{ env.XBK_DIR }}/Properties/launchSettings.json" | ConvertFrom-Json).profiles.kentico_boilerplate.applicationUrl
$url = $url + "/admin"
while ($elapsed -lt $timeout) {
try {
$response = Invoke-WebRequest -Uri $url -UseBasicParsing
if ($response.StatusCode -eq 200) {
Write-Output "XbK is accessible"
break
}
else {
Write-Output "XbK status: $($response.StatusCode)"
}
} catch {
Write-Output "Waiting for XbK to be accessible..."
}
Start-Sleep -Seconds 5
$elapsed += 5
}
cd ${{ env.UMT_DIR }}
Write-Output "Running tests..."
mkdir reports
dotnet test --settings:test.runsettings --logger:"html;LogFileName=${{ env.UMT_DIR }}\reports\logFile.html"
- name: Print media tree
if: always()
run: tree ${{ env.XBK_DIR}} /f
- name: Print content items table
if: always()
run: |
sqlcmd -S "${{ env.SQLSERVER_NAME}}" -U '${{ env.DB_USER}}' -P '${{ env.DB_PASSWORD }}' -d "${{ env.DB_DATABASE }}" -Q "SELECT * FROM CMS_ContentItem"
- name: Print media file table
if: always()
run: |
sqlcmd -S "${{ env.SQLSERVER_NAME}}" -U '${{ env.DB_USER}}' -P '${{ env.DB_PASSWORD }}' -d "${{ env.DB_DATABASE }}" -Q "SELECT * FROM Media_File"
- name: Print media lib table
if: always()
run: |
sqlcmd -S "${{ env.SQLSERVER_NAME}}" -U '${{ env.DB_USER}}' -P '${{ env.DB_PASSWORD }}' -d "${{ env.DB_DATABASE }}" -Q "SELECT * FROM Media_Library"
- name: Print event log table
if: always()
run: |
sqlcmd -S "${{ env.SQLSERVER_NAME}}" -U '${{ env.DB_USER}}' -P '${{ env.DB_PASSWORD }}' -d "${{ env.DB_DATABASE }}" -Q "SELECT * FROM CMS_EventLog"
- uses: actions/upload-artifact@v4
if: ${{ !cancelled() }}
with:
name: playwright-report
path: ${{ env.UMT_DIR }}\reports\
retention-days: 10