diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 1762294..39a78c9 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -3,159 +3,242 @@ name: Robot Framework in Docker on: push: # Publish `master` as Docker `latest` image. - # Release branches will trigger the creation of a git tag if the build is successful branches: - master - - release/* + tags: + - "*" # Run tests for any PRs. pull_request: env: + REGISTRY: docker.io # The image name - IMAGE_NAME: docker-robot-framework:ci + IMAGE_NAME: ppodgorsek/robot-framework + IMAGE_VERSION_CI: ci +# Build and run tests. +# See also https://docs.docker.com/docker-hub/builds/automated-testing/ jobs: - # Build and run tests. - # See also https://docs.docker.com/docker-hub/builds/automated-testing/ build: runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_REGISTRY_USERNAME }} + password: ${{ secrets.DOCKER_REGISTRY_TOKEN }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build + uses: docker/build-push-action@v6 + with: + # Only build one platform in order to run tests (additional platforms will be built afterwards, before push) + platforms: linux/amd64 + push: false + tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:cache + cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:cache,mode=max + + test: + runs-on: ubuntu-latest + needs: build # run all our tests on each browser strategy: matrix: include: - browser: "chrome" - - browser: "edge" + # FIXME: The tests pass successfully for Edge locally but fail in GitHub Actions + # - browser: "edge" - browser: "firefox" env: BROWSER: ${{ matrix.browser }} steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Build image - run: podman build . --tag $IMAGE_NAME --file Dockerfile + - name: Checkout code + uses: actions/checkout@v4 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_REGISTRY_USERNAME }} + password: ${{ secrets.DOCKER_REGISTRY_TOKEN }} + + - name: Pull image from cache + uses: docker/build-push-action@v6 + with: + platforms: linux/amd64 + push: false + tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:cache + - name: Basic Test run: | - podman run --shm-size=1g \ + docker run --rm --shm-size=1g \ -v `pwd`/test/browser-library.robot:/opt/robotframework/tests/browser-library.robot:Z \ -v `pwd`/test/faker.robot:/opt/robotframework/tests/faker.robot:Z \ -v `pwd`/test/requests.robot:/opt/robotframework/tests/requests.robot:Z \ -v `pwd`/test/selenium.robot:/opt/robotframework/tests/selenium.robot:Z \ -v `pwd`/test/timezones.robot:/opt/robotframework/tests/timezones.robot:Z \ - -e BROWSER=$BROWSER \ - $IMAGE_NAME + -e BROWSER=${{ env.BROWSER }} \ + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + - name: Test dependency installation run: | - podman run --shm-size=1g \ + docker run --rm --shm-size=1g \ -v `pwd`/test/pip-dependencies/main.robot:/opt/robotframework/tests/pip-dependencies.robot:Z \ -v `pwd`/test/pip-dependencies/requirements.txt:/opt/robotframework/pip-requirements.txt:Z \ - -e BROWSER=$BROWSER \ - $IMAGE_NAME + -e BROWSER=${{ env.BROWSER }} \ + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + - name: Colour Depth 16 Test run: | - podman run --shm-size=1g \ + docker run --rm --shm-size=1g \ -v `pwd`/test/browser-library.robot:/opt/robotframework/tests/browser-library.robot:Z \ -v `pwd`/test/selenium.robot:/opt/robotframework/tests/selenium.robot:Z \ - -e BROWSER=$BROWSER \ + -e BROWSER=${{ env.BROWSER }} \ -e SCREEN_COLOUR_DEPTH=16 \ - $IMAGE_NAME + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + - name: Screen Width 800x600 Test run: | - podman run --shm-size=1g \ + docker run --rm --shm-size=1g \ -v `pwd`/test/browser-library.robot:/opt/robotframework/tests/browser-library.robot:Z \ -v `pwd`/test/selenium.robot:/opt/robotframework/tests/selenium.robot:Z \ - -e BROWSER=$BROWSER \ + -e BROWSER=${{ env.BROWSER }} \ -e SCREEN_WIDTH=800 \ -e SCREEN_HEIGHT=600 \ - $IMAGE_NAME + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + - name: Screen Width 1024x768 Test run: | - podman run --shm-size=1g \ + docker run --rm --shm-size=1g \ -v `pwd`/test/browser-library.robot:/opt/robotframework/tests/browser-library.robot:Z \ -v `pwd`/test/selenium.robot:/opt/robotframework/tests/selenium.robot:Z \ - -e BROWSER=$BROWSER \ + -e BROWSER=${{ env.BROWSER }} \ -e SCREEN_WIDTH=1024 \ -e SCREEN_HEIGHT=768 \ - $IMAGE_NAME + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + - name: Screen Width 1280x1024 Test run: | - podman run --shm-size=1g \ + docker run --rm --shm-size=1g \ -v `pwd`/test/browser-library.robot:/opt/robotframework/tests/browser-library.robot:Z \ -v `pwd`/test/selenium.robot:/opt/robotframework/tests/selenium.robot:Z \ - -e BROWSER=$BROWSER \ + -e BROWSER=${{ env.BROWSER }} \ -e SCREEN_WIDTH=1280 \ -e SCREEN_HEIGHT=1024 \ - $IMAGE_NAME + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + - name: Screen Width 2560x1440 Test run: | - podman run --shm-size=1g \ + docker run --rm --shm-size=1g \ -v `pwd`/test/browser-library.robot:/opt/robotframework/tests/browser-library.robot:Z \ -v `pwd`/test/selenium.robot:/opt/robotframework/tests/selenium.robot:Z \ - -e BROWSER=$BROWSER \ + -e BROWSER=${{ env.BROWSER }} \ -e SCREEN_WIDTH=2560 \ -e SCREEN_HEIGHT=1440 \ - $IMAGE_NAME + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + - name: Screen Width 3840x2160 Test run: | - podman run --shm-size=1g \ + docker run --rm --shm-size=1g \ -v `pwd`/test/browser-library.robot:/opt/robotframework/tests/browser-library.robot:Z \ -v `pwd`/test/selenium.robot:/opt/robotframework/tests/selenium.robot:Z \ - -e BROWSER=$BROWSER \ + -e BROWSER=${{ env.BROWSER }} \ -e SCREEN_WIDTH=3840 \ -e SCREEN_HEIGHT=2160 \ - $IMAGE_NAME + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + - name: Debug Log Level Test run: | - podman run --shm-size=1g \ + docker run --rm --shm-size=1g \ -v `pwd`/test/faker.robot:/opt/robotframework/tests/faker.robot:Z \ - -e BROWSER=$BROWSER \ + -e BROWSER=${{ env.BROWSER }} \ -e ROBOT_OPTIONS="--loglevel DEBUG" \ - $IMAGE_NAME + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + - name: Basic Multithreaded Test run: | - podman run --shm-size=1g \ + docker run --rm --shm-size=1g \ -v `pwd`/test/browser-library.robot:/opt/robotframework/tests/browser-library.robot:Z \ -v `pwd`/test/faker.robot:/opt/robotframework/tests/faker.robot:Z \ -v `pwd`/test/requests.robot:/opt/robotframework/tests/requests.robot:Z \ -v `pwd`/test/selenium.robot:/opt/robotframework/tests/selenium.robot:Z \ -v `pwd`/test/timezones.robot:/opt/robotframework/tests/timezones.robot:Z \ - -e BROWSER=$BROWSER \ + -e BROWSER=${{ env.BROWSER }} \ -e ROBOT_THREADS=4 \ - $IMAGE_NAME + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + - name: Test Level Multithreaded Test run: | - podman run --shm-size=1g \ + docker run --rm --shm-size=1g \ -v `pwd`/test/browser-library.robot:/opt/robotframework/tests/browser-library.robot:Z \ -v `pwd`/test/faker.robot:/opt/robotframework/tests/faker.robot:Z \ -v `pwd`/test/requests.robot:/opt/robotframework/tests/requests.robot:Z \ -v `pwd`/test/selenium.robot:/opt/robotframework/tests/selenium.robot:Z \ -v `pwd`/test/timezones.robot:/opt/robotframework/tests/timezones.robot:Z \ - -e BROWSER=$BROWSER \ + -e BROWSER=${{ env.BROWSER }} \ -e ROBOT_THREADS=4 \ -e PABOT_OPTIONS="--testlevelsplit" \ - $IMAGE_NAME + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + - name: Custom User Test run: | - podman run --user=2000 --shm-size=1g \ + docker run --rm --user=2000 --shm-size=1g \ -v `pwd`/test/faker.robot:/opt/robotframework/tests/faker.robot:Z \ - -e BROWSER=$BROWSER \ - $IMAGE_NAME + -e BROWSER=${{ env.BROWSER }} \ + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + - name: Custom User and Group Test run: | - podman run --user=2000:2000 --shm-size=1g \ + docker run --rm --user=2000:2000 --shm-size=1g \ -v `pwd`/test/faker.robot:/opt/robotframework/tests/faker.robot:Z \ - -e BROWSER=$BROWSER \ - $IMAGE_NAME + -e BROWSER=${{ env.BROWSER }} \ + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + - name: Datetime run: | - podman run --user=2000:2000 --shm-size=1g \ + docker run --rm --shm-size=1g \ -v `pwd`/test/timezones.robot:/opt/robotframework/tests/timezones.robot:Z \ - -e BROWSER=$BROWSER \ + -e BROWSER=${{ env.BROWSER }} \ -e TZ="America/New_York" \ - $IMAGE_NAME + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + - name: Rerun Test run: | - podman run --user=2000:2000 --shm-size=1g \ + docker run --rm --shm-size=1g \ -v `pwd`/test/rerun.robot:/opt/robotframework/tests/rerun.robot:Z \ + -e BROWSER=${{ env.BROWSER }} \ -e ROBOT_RERUN_MAX_ROUNDS=50 \ - $IMAGE_NAME + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION_CI }} + + push: + runs-on: ubuntu-latest + needs: test + if: github.event_name != 'pull_request' + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_REGISTRY_USERNAME }} + password: ${{ secrets.DOCKER_REGISTRY_TOKEN }} + + - name: Build other platforms and push + uses: docker/build-push-action@v6 + with: + platforms: linux/amd64 + # platforms: linux/amd64,linux/arm64 + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_type == 'branch' && 'latest' || github.ref_name }} + cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:cache diff --git a/Dockerfile b/Dockerfile index fa12951..bfa43ad 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,64 +1,64 @@ FROM fedora:42 -LABEL authors Paul Podgorsek -LABEL description Robot Framework in Docker. +LABEL authors="Paul Podgorsek" +LABEL description="Robot Framework in Docker" # Set the Python dependencies' directory environment variable -ENV ROBOT_DEPENDENCY_DIR /opt/robotframework/dependencies +ENV ROBOT_DEPENDENCY_DIR="/opt/robotframework/dependencies" # Set the reports directory environment variable -ENV ROBOT_REPORTS_DIR /opt/robotframework/reports +ENV ROBOT_REPORTS_DIR="/opt/robotframework/reports" # Set the tests directory environment variable -ENV ROBOT_TESTS_DIR /opt/robotframework/tests +ENV ROBOT_TESTS_DIR="/opt/robotframework/tests" # Set the working directory environment variable -ENV ROBOT_WORK_DIR /opt/robotframework/temp +ENV ROBOT_WORK_DIR="/opt/robotframework/temp" # Set the maximum number of rounds to rerun failed tests -ENV ROBOT_RERUN_MAX_ROUNDS 0 +ENV ROBOT_RERUN_MAX_ROUNDS=0 # Options to the rebot command when rerunning failed tests -ENV ROBOT_RERUN_REBOT_OPTIONS "" +ENV ROBOT_RERUN_REBOT_OPTIONS="" # Setup X Window Virtual Framebuffer -ENV SCREEN_COLOUR_DEPTH 24 -ENV SCREEN_HEIGHT 1080 -ENV SCREEN_WIDTH 1920 +ENV SCREEN_COLOUR_DEPTH=24 +ENV SCREEN_HEIGHT=1080 +ENV SCREEN_WIDTH=1920 # Setup the timezone to use, defaults to UTC -ENV TZ UTC +ENV TZ="UTC" # Set number of threads for parallel execution # By default, no parallelisation -ENV ROBOT_THREADS 1 +ENV ROBOT_THREADS=1 # Define the default user who'll run the tests -ENV ROBOT_UID 1000 -ENV ROBOT_GID 1000 +ENV ROBOT_UID=1000 +ENV ROBOT_GID=1000 # Dependency versions -ENV AWS_CLI_VERSION 1.42.11 -ENV AXE_SELENIUM_LIBRARY_VERSION 2.1.6 -ENV BROWSER_LIBRARY_VERSION 19.7.0 -ENV CHROME_VERSION 139.0.7258.68 -ENV DATABASE_LIBRARY_VERSION 2.1.4 -ENV DATADRIVER_VERSION 1.11.2 -ENV DATETIMETZ_VERSION 1.0.6 -ENV MICROSOFT_EDGE_VERSION 139.0.3405.86 -ENV FAKER_VERSION 6.0.0 -ENV FIREFOX_VERSION 144.0 -ENV FTP_LIBRARY_VERSION 1.9 -ENV GECKO_DRIVER_VERSION v0.36.0 -ENV IMAP_LIBRARY_VERSION 0.4.11 -ENV PABOT_VERSION 5.0.0 -ENV REQUESTS_VERSION 0.9.7 -ENV ROBOT_FRAMEWORK_VERSION 7.3.2 -ENV SELENIUM_LIBRARY_VERSION 6.7.1 -ENV SSH_LIBRARY_VERSION 3.8.0 +ENV AWS_CLI_VERSION="1.42.11" +ENV AXE_SELENIUM_LIBRARY_VERSION="2.1.6" +ENV BROWSER_LIBRARY_VERSION="19.7.0" +ENV CHROME_VERSION="139.0.7258.68" +ENV DATABASE_LIBRARY_VERSION="2.1.4" +ENV DATADRIVER_VERSION="1.11.2" +ENV DATETIMETZ_VERSION="1.0.6" +ENV MICROSOFT_EDGE_VERSION="142.0.3595.65" +ENV FAKER_VERSION="6.0.0" +ENV FIREFOX_VERSION="144.0" +ENV FTP_LIBRARY_VERSION="1.9" +ENV GECKO_DRIVER_VERSION="v0.36.0" +ENV IMAP_LIBRARY_VERSION="0.4.11" +ENV PABOT_VERSION="5.0.0" +ENV REQUESTS_VERSION="0.9.7" +ENV ROBOT_FRAMEWORK_VERSION="7.3.2" +ENV SELENIUM_LIBRARY_VERSION="6.7.1" +ENV SSH_LIBRARY_VERSION="3.8.0" # By default, no reports are uploaded to AWS S3 -ENV AWS_UPLOAD_TO_S3 false +ENV AWS_UPLOAD_TO_S3="false" # Install system dependencies RUN dnf upgrade -y --refresh \ @@ -119,6 +119,7 @@ RUN rpm --import https://packages.microsoft.com/keys/microsoft.asc \ && wget -q "https://msedgedriver.microsoft.com/${MICROSOFT_EDGE_VERSION}/edgedriver_linux64.zip" \ && unzip edgedriver_linux64.zip -d edge \ && mv edge/msedgedriver /opt/robotframework/drivers/msedgedriver \ + && chmod ugo+x /opt/robotframework/drivers/msedgedriver \ && rm -Rf edgedriver_linux64.zip edge/ \ # IMPORTANT: don't remove the wget package because it's a dependency of Microsoft Edge && dnf remove -y \ diff --git a/README.md b/README.md index ccac53e..5b87c6e 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ The versions used are: * [Axe Selenium Library](https://github.com/mozilla-services/axe-selenium-python) 2.1.6 * Firefox 144.0 * [Chrome for Testing](https://googlechromelabs.github.io/chrome-for-testing/) 139.0 -* Microsoft Edge 139.0 +* Microsoft Edge 142.0 * [Amazon AWS CLI](https://pypi.org/project/awscli/) 1.42.11 As stated by [the official GitHub project](https://github.com/robotframework/Selenium2Library), starting from version 3.0, Selenium2Library is renamed to SeleniumLibrary and this project exists mainly to help with transitioning. The Selenium2Library 3.0.0 is also the last release and for new releases, please look at the [SeleniumLibrary](https://github.com/robotframework/SeleniumLibrary) project. diff --git a/test/selenium.robot b/test/selenium.robot index e2004c6..6f7439f 100644 --- a/test/selenium.robot +++ b/test/selenium.robot @@ -1,5 +1,5 @@ *** Settings *** -Library SeleniumLibrary +Library SeleniumLibrary *** Variables *** ${BROWSER} %{BROWSER}