Skip to content

Fixing schema designer filtering and auto layout behavior. #769

Fixing schema designer filtering and auto layout behavior.

Fixing schema designer filtering and auto layout behavior. #769

Workflow file for this run

name: Build and Test (Unit + E2E)
# Trigger the workflow on PRs to the main branch.
# It performs the following checks:
# 1. Calculate the size difference between the webview bundles of the main branch and the PR branch.
# 2. Calculate the size difference between the VSIX files of the main branch and the PR branch.
# 3. Does a check if the PR has properly localized strings.
on:
schedule:
- cron: '0 0 * * *'
push:
branches:
- main
pull_request:
branches:
- main
- 'release/**'
workflow_dispatch:
jobs:
build-and-test:
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
actions: read
issues: write
pull-requests: write
steps:
- name: Checkout main branch
uses: actions/checkout@v4
with:
ref: main
path: './main'
- name: Checkout PR branch
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
path: './pr'
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Setup .NET Core # Required to execute ReportGenerator
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.x
dotnet-quality: 'ga'
- name: Install tools
run: |
echo "Installing Yarn"
npm install --global [email protected]
echo "Installing Gulp CLI"
npm install --global [email protected]
echo "Installing VSCE"
npm install --global [email protected]
echo "Installing gulp"
npm install --global [email protected]
- name: Install dependencies and build main extension
uses: ./pr/.github/actions/build-extension
with:
source-dir: './main'
- name: Install dependencies and build PR extension
uses: ./pr/.github/actions/build-extension
with:
source-dir: './pr'
- name: Run lint
run: |
cd ./pr
yarn lint
# Calculate sizes and package before testing;
# Testing generates sourcemaps and instrumented code
# that increase size
- name: Package both branches
run: |
cd main
yarn gulp package:online
cd ../pr
yarn gulp package:online
- name: Calculate webview bundle sizes
run: |
main_file=$(du -sk ./main/out/src/reactviews/assets | cut -f1)
pr_file=$(du -sk ./pr/out/src/reactviews/assets | cut -f1)
echo "Main branch bundle size: $main_file KB"
echo "PR branch bundle size: $pr_file KB"
size_diff=$((pr_file - main_file))
percentage_change=$((100 * size_diff / main_file))
echo "Size difference: $size_diff KB"
echo "Percentage change: $percentage_change%"
echo "main_webview_bundle_size=$main_file" >> $GITHUB_ENV
echo "pr_webview_bundle_size=$pr_file" >> $GITHUB_ENV
echo "webview_size_diff=$size_diff" >> $GITHUB_ENV
echo "webview_bundle_percentage_change=$percentage_change" >> $GITHUB_ENV
webview_text_color=$(if [ $percentage_change -gt 0 ]; then echo "red"; else echo "lightgreen"; fi)
echo "webview_text_color=$webview_text_color" >> $GITHUB_ENV
- name: Calculate vsix file sizes
run: |
main_vsix=$(find ./main -name "*.vsix")
pr_vsix=$(find ./pr -name "*.vsix")
main_size=$(stat -c%s "$main_vsix")
pr_size=$(stat -c%s "$pr_vsix")
main_size=$((main_size / 1024))
pr_size=$((pr_size / 1024))
size_diff=$((pr_size - main_size))
percentage_change=$((100 * size_diff / main_size))
echo "Main branch VSIX size: $main_size KB"
echo "PR branch VSIX size: $pr_size KB"
echo "Size difference: $size_diff bytes"
echo "Percentage change: $percentage_change%"
echo "main_vsix_size=$main_size" >> $GITHUB_ENV
echo "pr_vsix_size=$pr_size" >> $GITHUB_ENV
echo "vsix_size_diff=$size_diff" >> $GITHUB_ENV
echo "vsix_percentage_change=$percentage_change" >> $GITHUB_ENV
vsix_text_color=$(if [ $percentage_change -gt 0 ]; then echo "red"; else echo "lightgreen"; fi)
echo "vsix_text_color=$vsix_text_color" >> $GITHUB_ENV
- name: Run unit tests for PR branch
run: |
cd pr
DISPLAY=:10 yarn test
- name: PR Unit Test Report
uses: dorny/test-reporter@v1
if: success() || failure()
with:
name: 'Unit Test Report'
path: ./test-reports/**/*.xml
reporter: jest-junit
working-directory: ./pr
badge-title: 'unit-tests'
- name: Run unit tests for main branch # for calculating coverage comparison
continue-on-error: true
run: |
cd main
DISPLAY=:10 yarn test
- name: Build mappings for React Webviews
run: |
cd ./pr
gulp ext:compile-reactviews
cd ../main
gulp ext:compile-reactviews
- name: Setup environment for smoke tests
run: |
wget http://mirrors.kernel.org/ubuntu/pool/main/o/openldap/libldap-2.5-0_2.5.11+dfsg-1~exp1ubuntu3_amd64.deb
sudo dpkg -i libldap-2.5-0_2.5.11+dfsg-1~exp1ubuntu3_amd64.deb
echo "Setting up environment for smoke tests"
PASSWORD="$(LC_ALL=C tr -dc 'A-Za-z0-9!?%=' < /dev/urandom | head -c 16)$(LC_ALL=C tr -dc '@^#' < /dev/urandom | head -c 1)"
echo "PASSWORD=$PASSWORD" >> $GITHUB_ENV
sudo cp build/mssql.init /etc/init.d/mssql-server
sudo chmod +x /etc/init.d/mssql-server
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list)"
sudo apt-get update
sudo apt-get install -y mssql-server
# Set the language choice variable (1 for English)
LANGUAGE_CHOICE="1"
echo -e "$LANGUAGE_CHOICE" | sudo ACCEPT_EULA='Y' MSSQL_PID='Developer' MSSQL_SA_PASSWORD="$PASSWORD" /opt/mssql/bin/mssql-conf setup || true
sudo service mssql-server start
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list
sudo apt-get update
sudo apt-get install -y mssql-tools
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "$PASSWORD" -Q "SELECT @@VERSION"
working-directory: ./pr
- name: Run smoke tests for PR branch
run: |
VS_CODE_VERSION=stable
SERVER_NAME=localhost
AUTHENTICATION_TYPE="SQL Login"
USER_NAME=sa
PASSWORD=${{ env.PASSWORD }}
SAVE_PASSWORD=No
PROFILE_NAME=test-server
cd pr
DISPLAY=:10 yarn smoketest
cd ../main
DISPLAY=:10 yarn smoketest
- name: Upload Smoke Test Screenshots
uses: actions/upload-artifact@v4
if: failure()
with:
name: smoke-test-failure-screenshots
path: ./pr/test-results/**/
retention-days: 7
- name: Smoke Test Report
uses: dorny/test-reporter@v1
if: success() || failure()
with:
name: 'Smoke Test Report'
path: ./test-reports/**/smoke-results.xml
reporter: jest-junit
badge-title: 'smoke-tests'
working-directory: ./pr
- name: Run smoke tests for main branch # for calculating coverage comparison
continue-on-error: true
run: |
VS_CODE_VERSION=stable
SERVER_NAME=localhost
AUTHENTICATION_TYPE="SQL Login"
USER_NAME=sa
PASSWORD=${{ env.PASSWORD }}
SAVE_PASSWORD=No
PROFILE_NAME=test-server
cd main
DISPLAY=:10 yarn smoketest
- name: Merge Smoke and Unit Test Coverage Reports
run: |
if [ -f main/test/resources/mergeReports.js ]; then
node main/test/resources/mergeReports.js main/coverage/coverage-e2e/cobertura-coverage.xml main/coverage/cobertura-coverage.xml
else
echo "mergeReports.js not found in ./main, skipping..."
fi
if [ -f pr/test/resources/mergeReports.js ]; then
node pr/test/resources/mergeReports.js pr/coverage/coverage-e2e/cobertura-coverage.xml pr/coverage/cobertura-coverage.xml
else
echo "mergeReports.js not found in ./pr, skipping..."
fi
- name: Generate Coverage Report
uses: danielpalme/[email protected]
with:
reports: './pr/coverage/cobertura-coverage.xml'
targetdir: 'coveragereport'
reporttypes: 'Html'
toolpath: 'reportgeneratortool'
- name: Upload coverage report artifact
uses: actions/upload-artifact@v4
with:
name: CoverageReport # Artifact name
path: coveragereport # Directory containing files to upload
- name: Code coverage
run: |
cd main
xml_coverage_main="./coverage/cobertura-coverage.xml"
# Pull out the line rate coverage from the main branch's cobertura report
line_rate_main=$(grep -m 1 -o 'line-rate="[0-9.]\+"' "$xml_coverage_main" | sed 's/line-rate="\([0-9.]*\)"/\1/')
line_rate_main=$(printf "%.2f" $(echo "$line_rate_main * 100" | bc))
# Save formatted line rate in env variable
echo "line_rate_main=$line_rate_main" >> $GITHUB_ENV
cd ../pr
xml_coverage_pr="./coverage/cobertura-coverage.xml"
# Pull out the line rate coverage from the pr branch's cobertura report
line_rate_pr=$(grep -m 1 -o 'line-rate="[0-9.]\+"' "$xml_coverage_pr" | sed 's/line-rate="\([0-9.]*\)"/\1/')
line_rate_pr=$(printf "%.2f" $(echo "$line_rate_pr * 100" | bc))
# Save formatted line rate in env variable
echo "line_rate_pr=$line_rate_pr" >> $GITHUB_ENV
# Calculate difference in line coverage rate
echo "line_rate_diff=$(echo "$line_rate_pr - $line_rate_main" | bc)" >> $GITHUB_ENV
coverage_text_color=$(if [ $line_rate_diff -gt 0 ]; then echo "red"; else echo "lightgreen"; fi)
echo "coverage_text_color=$coverage_text_color" >> $GITHUB_ENV
- name: Write PR results to markdown
run: |
echo "### PR Changes" >> results.md
echo "| Category | Main Branch | PR Branch | Difference |" >> results.md
echo "|------------------------------|--------------------|-------------------|----------------------|" >> results.md
echo "| Code Coverage | ${{ env.line_rate_main }}% | ${{ env.line_rate_pr }}% | ${{ '\$\${\color{' }}${{ env.coverage_text_color }}} ${{ env.line_rate_diff }}\\\\% ${{ '}\$\$' }} |" >> results.md
echo "| VSIX Size | ${{ env.main_vsix_size }} KB | ${{ env.pr_vsix_size }} KB | ${{ '\$\${\color{' }}${{ env.vsix_text_color }}} ${{ env.vsix_size_diff }} KB \space (${{ env.vsix_percentage_change }}\\\\%) ${{ '}\$\$' }} |" >> results.md
echo "| Webview Bundle Size | ${{ env.main_webview_bundle_size }} KB | ${{ env.pr_webview_bundle_size }} KB | ${{ '\$\${\color{' }}${{ env.webview_text_color }}} ${{ env.webview_size_diff }} KB \space (${{ env.webview_bundle_percentage_change }}\\\\%) ${{ '}\$\$' }} |" >> results.md
- name: Find comment
uses: peter-evans/find-comment@v3
if: github.event_name == 'pull_request'
id: fc
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: |
### PR Changes
- name: Create or update comment
uses: peter-evans/create-or-update-comment@v4
if: github.event_name == 'pull_request'
with:
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.pull_request.number }}
body-path: ./results.md
comment-id: ${{ steps.fc.outputs.comment-id }}
edit-mode: replace
- name: Fail if vsix size is increased by 5% or size is above 25mb
if: ${{ env.vsix_percentage_change > 5 || env.pr_vsix_size > 25000000 }}
run: exit 1
- name: Fail if bundle size is increased by 5%
if: ${{ env.webview_bundle_percentage_change > 5 }}
run: exit 1
- name: Generate xliff files in PR branch
run: |
cd pr
yarn localization
# Check if there are git changes in english xlf files
- name: Check for changes in english xlf files
run: |
cd pr
if git diff --quiet --exit-code ./localization/xliff/vscode-mssql.xlf; then
echo "Changes not found in english xlf files"
echo "loc_update_required=false" >> $GITHUB_ENV
else
echo "Changes found in english xlf files"
echo "loc_update_required=true" >> $GITHUB_ENV
fi
- name: Find comment
uses: peter-evans/find-comment@v3
if: github.event_name == 'pull_request'
id: loc-comment
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: |
# Updates to localized strings required
- name: Create or update comment
if: github.event_name == 'pull_request' && env.loc_update_required == 'true'
uses: peter-evans/create-or-update-comment@v4
with:
comment-id: ${{ steps.loc-comment.outputs.comment-id }}
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.pull_request.number }}
body: |
# Updates to localized strings required
Please update the localized strings in the PR with following steps:
1. Run `yarn localization` in the PR branch.
1. Based on the changes,
* If there are changes in localized strings in source code, make sure that `src/localization/xliff/vscode-mssql.xlf` and `src/l10n/bundle.l10n.json` files are updated.
* If there are changes in localized strings in `package.nls.json`, make sure that `src/localization/xliff/vscode-mssql.xlf` is updated.
edit-mode: replace
- name: Delete comment
if: github.event_name == 'pull_request' && ${{ env.loc_update_required == 'false' }} && steps.loc-comment.outputs.comment-id != ''
run: |
curl -X DELETE \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/${{ github.repository }}/issues/comments/${{ steps.loc-comment.outputs.comment-id }}
- name: Fail if there are changes required in english xlf files
if: ${{ env.loc_update_required == 'true' }}
run: exit 1