Skip to content

Continuous integration #10187

Continuous integration

Continuous integration #10187

Workflow file for this run

# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
name: Continuous integration
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
schedule:
- cron: '15 10 * * *'
env:
SYS_VAR_CI_INSTALL_TEST: 0
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ "ubuntu-latest", "windows-latest" ]
steps:
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: 20.x
cache: 'npm'
- name: Install nodejs dependencies
env:
PLAYWRIGHT_BROWSERS_PATH: 0
run: |
npm ci
npx playwright install --with-deps
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: 3.11
cache: 'pip'
- name: Install python dependencies in Linux
if: matrix.os == 'ubuntu-latest'
run: |
python -m pip install --upgrade pip
pip install uv
uv pip install wheel --python 3.11 --system --verbose
uv pip install -r Browser/dev-requirements.txt --python 3.11 --system
- name: Install python dependencies in Windows
if: matrix.os != 'ubuntu-latest'
run: |
python -m pip install --upgrade pip
pip install uv
uv pip install wheel --python 3.11 --system --verbose
uv pip install -r Browser/dev-requirements.txt --python 3.11 --system
- name: Build Protos and check with tsc
if: matrix.os == 'ubuntu-latest'
run: |
inv node-build
python -m Browser.gen_stub
- name: Build test app
run: |
inv create-test-app
- name: Create Distributable Package
if: matrix.os == 'ubuntu-latest'
run: |
inv docs
inv create-package
- uses: actions/upload-artifact@v4
if: matrix.os == 'ubuntu-latest'
with:
name: rfbrowser-wheel
path: dist/robotframework_browser-*-py3-none-any.whl
- name: Package demoapp
run: |
inv demo-app
- uses: actions/upload-artifact@v4
with:
name: demoapp-${{ matrix.os }}
path: zip_results/demoapp
testing:
runs-on: ${{ matrix.os }}
timeout-minutes: 30
permissions:
contents: read
pull-requests: write
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
python-version: "3.10"
node-version: 18.x
shard: 1
- os: windows-latest
python-version: "3.12"
node-version: 20.x
shard: 2
- os: ubuntu-latest
python-version: "3.10"
node-version: 22.x
shard: 3
- os: ubuntu-latest
python-version: "3.11"
node-version: 20.x
shard: 4
- os: windows-latest
python-version: "3.9"
node-version: 20.x
shard: 1
- os: ubuntu-latest
python-version: "3.10"
node-version: 18.x
shard: 2
- os: ubuntu-latest
python-version: "3.9"
node-version: 18.x
shard: 3
- os: ubuntu-latest
python-version: "3.10"
node-version: 20.x
shard: 4
- os: ubuntu-latest
python-version: "3.11"
node-version: 20.x
shard: 1
- os: macos-latest
python-version: "3.11"
node-version: 20.x
shard: 1
- os: macos-latest
python-version: "3.12"
node-version: 20.x
shard: 2
- os: macos-latest
python-version: "3.10"
node-version: 20.x
shard: 3
steps:
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install nodejs dependencies
env:
PLAYWRIGHT_BROWSERS_PATH: 0
run: |
npm ci
npx playwright install --with-deps
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: 'pip'
- name: Install python dependencies
run: |
python -m pip install --upgrade pip
pip install uv
uv pip install wheel --python ${{ matrix.python-version }} --system
uv pip install -r Browser/dev-requirements.txt --python ${{ matrix.python-version }} --system
- name: Build Protos and check with tsc
run: |
inv node-build
python -m Browser.gen_stub
- name: Check types with mypy on Linux
if: matrix.os == 'ubuntu-latest' && matrix.shard == 1 && matrix.python-version != '3.10'
run: |
inv lint-python
- name: Lint atest
if: matrix.shard == 1
run: |
inv lint-robot
- name: Lint node
if: matrix.shard == 1
run: |
inv lint-node
- name: Build test app
run: |
inv create-test-app
- name: Start xvfb on Linux
if: matrix.os == 'ubuntu-latest'
run: |
export DISPLAY=:99.0
Xvfb -ac :99 -screen 0 1280x1024x16 > /dev/null 2>&1 &
- name: Run pytests
if: matrix.shard == 1
run: |
invoke utest
- name: Run Robot Framework tests on linux
if: matrix.os == 'ubuntu-latest'
run: |
xvfb-run --auto-servernum inv atest --shard ${{ matrix.shard }}/4 -z true
- name: Run Robot Framework tests on Windows
if: matrix.os == 'windows-latest'
run: |
inv atest --shard ${{ matrix.shard }}/4 -z true
- name: Run Robot Framework tests on macOS
if: matrix.os == 'macos-latest'
run: |
inv atest --shard ${{ matrix.shard }}/4 -z true
- name: Install rflogs
if: always()
run: |
pip install rflogs
- name: Upload test results to RF Logs
if: always()
env:
RFLOGS_API_KEY: ${{ secrets.RFLOGS_API_KEY }}
working-directory: ${{ github.workspace }}/atest/output
run: |
rflogs upload --tag branch:${{ github.head_ref || github.ref_name }} --tag shard:${{ matrix.shard }} --tag os:${{ matrix.os }} --tag python-version:${{ matrix.python-version }} --tag node-version:${{ matrix.node-version }} || true
- uses: actions/upload-artifact@v4
if: ${{ always() }}
with:
name: Test results-${{ matrix.os }}-${{ matrix.shard }}-${{ matrix.python-version }}-${{ matrix.node-version }}
path: zip_results/output
test-install:
needs: build
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest]
python-version: [3.9, 3.11]
node-version: [18.x, 20.x]
exclude:
- python-version: 3.9
node-version: 20.x
- os: windows-latest
python-version: 3.9
- os: windows-latest
node-version: 20.x
steps:
- uses: actions/checkout@v4
- name: Download package for install testing
uses: actions/download-artifact@v4
with:
name: rfbrowser-wheel
- name: Download package for install testing
uses: actions/download-artifact@v4
with:
name: demoapp-${{ matrix.os }}
path: zip_results/demoapp
- name: Unzip demoapp in linux or MacOS
if: matrix.os != 'windows-latest'
run: |
ls -l zip_results/demoapp
unzip -o zip_results/demoapp/demo-app-linux.zip
- name: Unzip demoapp in windows
if: matrix.os == 'windows-latest'
run: |
dir zip_results/demoapp
tar -xf zip_results/demoapp/demo-app-win32.zip
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: 'pip'
- name: Install Robot Framework Browser on unix-like
run: |
pip install uv
uv pip install ./robotframework_browser-*-py3-none-any.whl --python ${{ matrix.python-version }} --system
if: matrix.os != 'windows-latest'
- name: Install Robot Framework Browser on windows
run: |
pip install uv
uv pip install (gci *.whl)--python ${{ matrix.python-version }} --system
if: matrix.os == 'windows-latest'
- name: Install node deps and python deps for test running
run: |
rfbrowser init
uv pip install wheel --python ${{ matrix.python-version }} --system
uv pip install -r Browser/dev-requirements.txt --python ${{ matrix.python-version }} --system
- name: Test on unix-like os - serial mode
if: matrix.os == 'ubuntu-latest'
env:
SYS_VAR_CI_INSTALL_TEST: 1
run: |
echo ${{ matrix.os }}
rm -rf Browser
export DISPLAY=:99.0
Xvfb -ac :99 -screen 0 1280x1024x16 > /dev/null 2>&1 &
xvfb-run --auto-servernum invoke atest-robot --smoke
- name: Run Robot Framework tests on windows or macOS
if: ${{ matrix.os != 'ubuntu-latest' }}
env:
SYS_VAR_CI_INSTALL_TEST: 1
run: |
echo ${{ matrix.os }}
Remove-Item -Path .\Browser -Force -Recurse
invoke atest-robot --smoke
- name: Uninstall on Linux or MacOS
if: ${{ matrix.os != 'windows-latest' }}
run: |
rfbrowser clean-node
uv pip uninstall robotframework-browser --python ${{ matrix.python-version }} --system
- uses: actions/upload-artifact@v4
if: ${{ always() }}
with:
name: ${{ matrix.os }} ${{ matrix.python-version }} ${{ matrix.node-version }} Clean install results
path: atest/output