diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index a4c99a5..9e34028 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -217,7 +217,7 @@ jobs: push: runs-on: ubuntu-latest needs: test - if: github.event_name != 'pull_request' + if: github.event_name != 'pull_request' && github.ref_type == 'tag' steps: - name: Checkout code uses: actions/checkout@v4 @@ -239,5 +239,5 @@ jobs: with: 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 }} + tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }},${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:cache diff --git a/Dockerfile b/Dockerfile index 37ba48e..e871304 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,17 +7,22 @@ LABEL description="Robot Framework in Docker" # * linux/arm64 # * linux/amd64" +ENV ROBOT_FRAMEWORK_BASE_FOLDER="/opt/robotframework" + # Set the Python dependencies' directory environment variable -ENV ROBOT_DEPENDENCY_DIR="/opt/robotframework/dependencies" +ENV ROBOT_DEPENDENCY_DIR="${ROBOT_FRAMEWORK_BASE_FOLDER}/dependencies" + +# Set the browser drivers' directory environment variable +ENV ROBOT_DRIVER_DIR="${ROBOT_FRAMEWORK_BASE_FOLDER}/drivers" # Set the reports directory environment variable -ENV ROBOT_REPORTS_DIR="/opt/robotframework/reports" +ENV ROBOT_REPORTS_DIR="${ROBOT_FRAMEWORK_BASE_FOLDER}/reports" # Set the tests directory environment variable -ENV ROBOT_TESTS_DIR="/opt/robotframework/tests" +ENV ROBOT_TESTS_DIR="${ROBOT_FRAMEWORK_BASE_FOLDER}/tests" # Set the working directory environment variable -ENV ROBOT_WORK_DIR="/opt/robotframework/temp" +ENV ROBOT_WORK_DIR="${ROBOT_FRAMEWORK_BASE_FOLDER}/temp" # Set the maximum number of rounds to rerun failed tests ENV ROBOT_RERUN_MAX_ROUNDS=0 @@ -116,8 +121,8 @@ RUN if [ `uname --machine` == "x86_64" ]; \ fi \ && wget -q "https://github.com/mozilla/geckodriver/releases/download/${GECKO_DRIVER_VERSION}/geckodriver-${GECKO_DRIVER_VERSION}-${PLATFORM}.tar.gz" \ && tar xzf geckodriver-${GECKO_DRIVER_VERSION}-${PLATFORM}.tar.gz \ - && mkdir -p /opt/robotframework/drivers/ \ - && mv geckodriver /opt/robotframework/drivers/geckodriver \ + && mkdir -p ${ROBOT_DRIVER_DIR}/ \ + && mv geckodriver ${ROBOT_DRIVER_DIR}/geckodriver \ && rm geckodriver-${GECKO_DRIVER_VERSION}-${PLATFORM}.tar.gz # Install Microsoft Edge & webdriver @@ -137,8 +142,8 @@ RUN if [ `uname --machine` == "x86_64" ]; \ zip \ && wget -q "https://msedgedriver.microsoft.com/${MICROSOFT_EDGE_VERSION}/edgedriver_${PLATFORM}.zip" \ && unzip edgedriver_${PLATFORM}.zip -d edge \ - && mv edge/msedgedriver /opt/robotframework/drivers/msedgedriver \ - && chmod ugo+x /opt/robotframework/drivers/msedgedriver \ + && mv edge/msedgedriver ${ROBOT_DRIVER_DIR}/msedgedriver-original \ + && chmod ugo+x ${ROBOT_DRIVER_DIR}/msedgedriver-original \ && rm -Rf edgedriver_${PLATFORM}.zip edge/ \ # IMPORTANT: don't remove the wget package because it's a dependency of Microsoft Edge && dnf remove -y \ @@ -152,30 +157,32 @@ ENV PATH=/opt/microsoft/msedge:$PATH RUN rfbrowser init chromium firefox # Prepare binaries to be executed -COPY bin/chromedriver.sh /opt/robotframework/drivers/chromedriver -COPY bin/chrome.sh /opt/robotframework/bin/chrome -COPY bin/run-tests-in-virtual-screen.sh /opt/robotframework/bin/ +COPY bin/chromedriver.sh ${ROBOT_FRAMEWORK_BASE_FOLDER}/drivers/chromedriver +COPY bin/chrome.sh ${ROBOT_FRAMEWORK_BASE_FOLDER}/bin/chrome +COPY bin/msedgedriver.sh ${ROBOT_FRAMEWORK_BASE_FOLDER}/drivers/msedgedriver +COPY bin/run-tests-in-virtual-screen.sh ${ROBOT_FRAMEWORK_BASE_FOLDER}/bin/ # Create the default report and work folders with the default user to avoid runtime issues # These folders are writeable by anyone, to ensure the user can be changed on the command line. RUN mkdir -p ${ROBOT_REPORTS_DIR} \ && mkdir -p ${ROBOT_WORK_DIR} \ - && chown ${ROBOT_UID}:${ROBOT_GID} ${ROBOT_REPORTS_DIR} \ - && chown ${ROBOT_UID}:${ROBOT_GID} ${ROBOT_WORK_DIR} \ - && chmod ugo+w ${ROBOT_REPORTS_DIR} ${ROBOT_WORK_DIR} - -# Allow any user to write logs -RUN chmod ugo+w /var/log \ - && chown ${ROBOT_UID}:${ROBOT_GID} /var/log - -# Update system path -ENV PATH=/opt/robotframework/bin:/opt/robotframework/drivers:$PATH - -# Ensure the directory for Python dependencies exists -RUN mkdir -p ${ROBOT_DEPENDENCY_DIR} \ + && chown -R ${ROBOT_UID}:${ROBOT_GID} ${ROBOT_REPORTS_DIR} \ + && chown -R ${ROBOT_UID}:${ROBOT_GID} ${ROBOT_WORK_DIR} \ + && chmod -R ugo+w ${ROBOT_REPORTS_DIR} ${ROBOT_WORK_DIR} \ + \ + # Allow any user to run the drivers and write logs + && chmod ugo+x ${ROBOT_DRIVER_DIR} \ + && chmod ugo+w /var/log \ + && chown ${ROBOT_UID}:${ROBOT_GID} /var/log \ + \ + # Ensure the directory for Python dependencies exists + && mkdir -p ${ROBOT_DEPENDENCY_DIR} \ && chown ${ROBOT_UID}:${ROBOT_GID} ${ROBOT_DEPENDENCY_DIR} \ && chmod 777 ${ROBOT_DEPENDENCY_DIR} +# Update system path +ENV PATH=${ROBOT_FRAMEWORK_BASE_FOLDER}/bin:${ROBOT_DRIVER_DIR}:$PATH + # Set up a volume for the generated reports VOLUME ${ROBOT_REPORTS_DIR} diff --git a/README.md b/README.md index 8c06b1f..0258069 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ * [Error: Suite contains no tests](#error-suite-contains-no-tests) * [Database tests are failing in spite of the DatabaseLibrary being present](#database-tests-are-failing-in-spite-of-the-databaselibrary-being-present) * [Supported devices and architectures](#supported-devices-and-architectures) + * [Container image is too large](#troubleshooting-image-too-large) * [Please contribute!](#please-contribute) ----- @@ -200,6 +201,8 @@ rpa==1.50.0 **For large dependencies, it is still recommended to extend the project's image and to add them there, to avoid delaying the CI/CD pipelines with repeated dependency installations.** + + ### Rerunning tests Failing tests can be rerun by setting the environment variable `ROBOT_RERUN_MAX_ROUNDS` to a value above 0. All reruns of failed tests are executed without parallelization. @@ -467,7 +470,7 @@ It is anyway mandatory to extend the container image to install the specific dat ### Supported devices and architectures -As mentioned on the [Docker Hub](https://hub.docker.com/r/ppodgorsek/robot-framework), the project has been built and uploaded as a `linux/amd64` image only. This means ARM devices such as MacBook M1/M2 and Amazon EC2 Graviton won't be able to run the image with the default configuration. +As mentioned on the [Docker Hub](https://hub.docker.com/r/ppodgorsek/robot-framework), the project has been built and uploaded for `linux/amd64` and `linux/arm64` architectures only. As mentioned in the official documentation, [Podman](https://docs.podman.io/en/latest/markdown/podman-run.1.html#platform-os-arch) and [Docker](https://docs.docker.com/build/building/multi-platform/) provide a `--platform` option which selects a given application architecture, such as: @@ -479,12 +482,22 @@ docker run \ ppodgorsek/robot-framework: ``` -Please note that builds and automated tests of this project are only performed on `linux/amd64` and `linux/arm64` architectures so such emulation might not work, depending on your device and operating system. - **It is to be noted that Microsoft Edge is not available for Linux ARM. Please visit [the official Microsoft Edge website](https://www.microsoft.com/en-us/edge/business/download) and [the Arm developer website](https://learn.arm.com/install-guides/browsers/edge/) for more information.** If this does not solve your platform-related issues, you might have to rebuild the image for your device/platform, specifying that `--platform` option during the build and run. + + +### Container image is too large + +Unfortunately, the image size is due to the presence of both Selenium and Playwright. (the latter requiring its own set of browsers) + +Should you need to use Robot Framework in embedded devices, this is too much. + +Instead, a basic multi-arch container (under 200MB) can be found in this public container registry: [Robot Framework for Embedded Multi-Arch Container](https://gitlab.com/gitlab-accelerates-embedded/comp/robot-for-embdd/container_registry). + +It is built as part of the [Robot Framework for Embedded](https://gitlab.com/explore/catalog/gitlab-accelerates-embedded/comp/robot-for-embdd). + ## Please contribute! diff --git a/bin/msedgedriver.sh b/bin/msedgedriver.sh new file mode 100755 index 0000000..fbc461c --- /dev/null +++ b/bin/msedgedriver.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +exec /opt/robotframework/drivers/msedgedriver-original --disable-dev-shm-usage --verbose --log-path=/var/log/msedgedriver "$@" diff --git a/test/selenium.robot b/test/selenium.robot index 6f7439f..5ddf19f 100644 --- a/test/selenium.robot +++ b/test/selenium.robot @@ -2,13 +2,13 @@ Library SeleniumLibrary *** Variables *** -${BROWSER} %{BROWSER} +${BROWSER} %{BROWSER} *** Test Cases *** Visit Bing - Open Browser https://www.bing.com ${BROWSER} - Capture Page Screenshot + Open Browser https://www.bing.com ${BROWSER} + Capture Page Screenshot Visit Google - Open Browser https://www.google.com ${BROWSER} - Capture Page Screenshot + Open Browser https://www.google.com ${BROWSER} + Capture Page Screenshot