uraimo/run-on-arch-action

Multiple steps in a job

Krakinou opened this issue · 7 comments

Hello,
I was wondering if it was possible to use the same containers across multiple steps in the same jobs?
Something along the line of:

    - name : Build system (qemu)
      uses: uraimo/run-on-arch-action@v2.5.0
      with:
        arch: ${{ matrix.qemu_arch }}
        distro: ubuntu20.04
        install: |
          echo "Install packages"
          apt-get update && apt-get install -y pkg1 pkg2
        run: |
          echo "System successfully built"

    - name : Build project (qemu)
      uses: uraimo/run-on-arch-action@v2.5.0
      with:
        arch: ${{ matrix.qemu_arch }}
        distro: ubuntu20.04
        run: |
          ... build project...

    - name: functional-tests (qemu)
      uses: uraimo/run-on-arch-action@v2.5.0
      with:
        arch: ${{ matrix.qemu_arch }}
        distro: ubuntu20.04
        run: |
          ...do some tests
      continue-on-error: false
...

The idea is to split the building chain into multiple steps so it's easier to monitor.
It seems that at the moment, each steps is recreating the container at each run...

This should be possible right now, provided the steps exist in the same workflow.
If it does not happen and the images get rebuilt on every run, perhaps your github.token does not have the necessary permission to push the image. After running your workflow, simply look at your project's published "packages". There should be at least one containing the string run-on-arch-action like here. If there are none, then your token does not have these permissions. In that case, in the github GUI, go the Project settings, select Actions->General in the left pane, then scroll down to Workflow permissions and select Read and write permissions there, and hit the Save button.

For possible future releases:

  • With PR #100 applied (perhaps in the future) , the steps need to be in the same job too.
  • With my PR #122 you are completely free when choosing the image tag.

Oh, and looking at your example, you also should have the install: parameter present exactly the same in all invocations. After all, the install step gets saved to the image and if the 2nd and 3rd invocation do not have exactly the same install parameters, this would result in different images.

I do have the package in my repo, so this is not the issue

Oh, and looking at your example, you also should have the install: parameter present exactly the same in all invocations. After all, the install step gets saved to the image and if the 2nd and 3rd invocation do not have exactly the same install parameters, this would result in different images.

I will try to add the exact same install parameter and check if it works, thanks for the tip!

Hi, thanks @felfert, duplicating the install is not necessary and until the workflow, arch and distro are still the same the next steps should pickup the original image created with the install step, if you set and configured correctly the token.

Hi,
So I ran a bunch of test and I confirm what @felfert said : install parameter have to be the same accross multiple steps so that the docker image is not reinstalled again.
If I skip the install parameter, the image is rebuilt at each step (which obviously does not work).

Well, I guess that @uraimo is right. Problem is, that you did just post an example and not the real script that you actually use. I believe you use this one. In there, ALL invocations include the parameter githubToken which enables the docker push in every step. This is wrong. If you use that parameter in the Build system step ONLY, then it should work without the duplicated install as well.

Yep, you're correct this is the action I'm working on. Sorry for not giving the full script (as it was quite long with a lot of stuff, I did not want to put too many unrelated info).
However, I tried removing the github token parameter and it does not seems to work: I have 2 versions of the same script, one with token+install parameter, and the second one without:
The first script is running correctly, with each step re-using the container as installed (.
The second one is failling on the first step using run-on-arch without install parameter as it does not find git (which was installed in the container).

Or am I missing something obvious?

So, I made a lighter script to test. Both github token and install part are required so that the steps reused the cached package:

  • With only the install, the script will rerun the install (as expected)
  • With only the token, it will not reuse the cached packages.

Here is the script:

name: Check run on arch

on:
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-22.04

    steps:

    - name : Build system
      uses: uraimo/run-on-arch-action@v2.5.0
      with:
        arch: armv7
        distro: ubuntu22.04
        githubToken: ${{ github.token }}
        install: |
            echo "Install packages"
            apt-get update && apt-get -y install python3
        run: |
          echo "system installed"
      
    - name : Check system 1 - Token & install
      uses: uraimo/run-on-arch-action@v2.5.0
      with:
        arch: armv7
        distro: ubuntu22.04
        githubToken: ${{ github.token }}
        install: |
            echo "Install packages"
            apt-get update && apt-get -y install python3
        run: |
          echo "this step will run"
          python3 --version

    - name : Check system 2 - Install only
      uses: uraimo/run-on-arch-action@v2.5.0
      with:
        arch: armv7
        distro: ubuntu22.04
        install: |
            echo "Install packages"
            apt-get update && apt-get -y install python3
        run: |
          echo "this step will also run but will reinstall everything"
          python3 --version

    - name : Check system 3 - Token only
      uses: uraimo/run-on-arch-action@v2.5.0
      with:
        arch: armv7
        distro: ubuntu22.04
        githubToken: ${{ github.token }}
        run: |
          echo "this step will fail"
          python3 --version
Here are the logs for step 1
Run uraimo/run-on-arch-action@v2.5.0
Configuring Docker for multi-architecture support
/home/runner/work/_actions/uraimo/run-on-arch-action/v2.5.0/src/run-on-arch.sh /home/runner/work/_actions/uraimo/run-on-arch-action/v2.5.0/Dockerfiles/Dockerfile.armv7.ubuntu22.04 run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04
Build container
  GitHub token provided, caching to ghcr.io/krakinou/runonarch/run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04
  WARNING! Your password will be stored unencrypted in /home/runner/.docker/config.json.
  Configure a credential helper to remove this warning. See
  https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  Login Succeeded
  latest: Pulling from krakinou/runonarch/run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04
  Digest: sha256:4ef06c3de1eac1fa18976a946d985e793bdd4bc95e7d6332754b0f218b17ac18
  Status: Image is up to date for ghcr.io/krakinou/runonarch/run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04:latest
  ghcr.io/krakinou/runonarch/run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04:latest
  Sending build context to Docker daemon  69.63kB
  Step 1/3 : FROM arm32v7/ubuntu:22.04
   ---> eb792700b748
  Step 2/3 : COPY ./run-on-arch-install.sh /root/run-on-arch-install.sh
   ---> Using cache
   ---> 1aad52f28564
  Step 3/3 : RUN chmod +x /root/run-on-arch-install.sh && /root/run-on-arch-install.sh
   ---> Using cache
   ---> c094c8af338e
  Successfully built c094c8af338e
  Successfully tagged run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04:latest
  Using default tag: latest
  The push refers to repository [ghcr.io/krakinou/runonarch/run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04]
  479eec1abe5f: Preparing
  f71ce63d2bea: Preparing
  8d5d171f01dd: Preparing
  f71ce63d2bea: Layer already exists
  8d5d171f01dd: Layer already exists
  479eec1abe5f: Layer already exists
  latest: digest: sha256:4ef06c3de1eac1fa18976a946d985e793bdd4bc95e7d6332754b0f218b17ac18 size: 948
Run container
  WARNING: The requested image's platform (linux/arm/v7) does not match the detected host platform (linux/amd64) and no specific platform was requested
  this step will run
  Python 3.10.6

Here are the logs for step 2
Run uraimo/run-on-arch-action@v2.5.0
Configuring Docker for multi-architecture support
/home/runner/work/_actions/uraimo/run-on-arch-action/v2.5.0/src/run-on-arch.sh /home/runner/work/_actions/uraimo/run-on-arch-action/v2.5.0/Dockerfiles/Dockerfile.armv7.ubuntu22.04 run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04
Build container
  Sending build context to Docker daemon  69.63kB
  Step 1/3 : FROM arm32v7/ubuntu:22.04
   ---> eb792700b748
  Step 2/3 : COPY ./run-on-arch-install.sh /root/run-on-arch-install.sh
   ---> 8d7c50bc4535
  Step 3/3 : RUN chmod +x /root/run-on-arch-install.sh && /root/run-on-arch-install.sh
  Warning: rning] The requested image's platform (linux/arm/v7) does not match the detected host platform (linux/amd64) and no specific platform was requested
   ---> Running in 9c1df93cbda8
  Install packages
  Get:1 http://ports.ubuntu.com/ubuntu-ports jammy InRelease [270 kB]
  Get:2 http://ports.ubuntu.com/ubuntu-ports jammy-updates InRelease [119 kB]
  Get:3 http://ports.ubuntu.com/ubuntu-ports jammy-backports InRelease [108 kB]
  Get:4 http://ports.ubuntu.com/ubuntu-ports jammy-security InRelease [110 kB]
  Get:5 http://ports.ubuntu.com/ubuntu-ports jammy/multiverse armhf Packages [199 kB]
  Get:6 http://ports.ubuntu.com/ubuntu-ports jammy/universe armhf Packages [16.8 MB]
  Get:7 http://ports.ubuntu.com/ubuntu-ports jammy/main armhf Packages [1701 kB]
  Get:8 http://ports.ubuntu.com/ubuntu-ports jammy/restricted armhf Packages [13.3 kB]
  Get:9 http://ports.ubuntu.com/ubuntu-ports jammy-updates/multiverse armhf Packages [3270 B]
  Get:10 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main armhf Packages [633 kB]
  Get:11 http://ports.ubuntu.com/ubuntu-ports jammy-updates/restricted armhf Packages [11.2 kB]
  Get:12 http://ports.ubuntu.com/ubuntu-ports jammy-updates/universe armhf Packages [838 kB]
  Get:13 http://ports.ubuntu.com/ubuntu-ports jammy-backports/main armhf Packages [48.9 kB]
  Get:14 http://ports.ubuntu.com/ubuntu-ports jammy-backports/universe armhf Packages [23.6 kB]
  Get:15 http://ports.ubuntu.com/ubuntu-ports jammy-security/restricted armhf Packages [10.3 kB]
  Get:16 http://ports.ubuntu.com/ubuntu-ports jammy-security/universe armhf Packages [612 kB]
  Get:17 http://ports.ubuntu.com/ubuntu-ports jammy-security/main armhf Packages [359 kB]
  Get:18 http://ports.ubuntu.com/ubuntu-ports jammy-security/multiverse armhf Packages [594 B]
  Fetched 21.8 MB in 12s (1768 kB/s)
  Reading package lists...
  Reading package lists...
  Building dependency tree...
  Reading state information...
  The following additional packages will be installed:
    libexpat1 libmpdec3 libpython3-stdlib libpython3.10-minimal
    libpython3.10-stdlib libreadline8 libsqlite3-0 media-types python3-minimal
    python3.10 python3.10-minimal readline-common
  Suggested packages:
    python3-doc python3-tk python3-venv python3.10-venv python3.10-doc binutils
    binfmt-support readline-doc
  The following NEW packages will be installed:
    libexpat1 libmpdec3 libpython3-stdlib libpython3.10-minimal
    libpython3.10-stdlib libreadline8 libsqlite3-0 media-types python3
    python3-minimal python3.10 python3.10-minimal readline-common
  0 upgraded, 13 newly installed, 0 to remove and 4 not upgraded.
  Need to get 5933 kB of archives.
  After this operation, 19.6 MB of additional disk space will be used.
  Get:1 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main armhf libpython3.10-minimal armhf 3.10.6-1~22.04.2ubuntu1 [794 kB]
  Get:2 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main armhf libexpat1 armhf 2.4.7-1ubuntu0.2 [66.9 kB]
  Get:3 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main armhf python3.10-minimal armhf 3.10.6-1~22.04.2ubuntu1 [1941 kB]
  Get:4 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main armhf python3-minimal armhf 3.10.6-1~22.04 [24.3 kB]
  Get:5 http://ports.ubuntu.com/ubuntu-ports jammy/main armhf media-types all 7.0.0 [25.5 kB]
  Get:6 http://ports.ubuntu.com/ubuntu-ports jammy/main armhf libmpdec3 armhf 2.5.1-2build2 [76.5 kB]
  Get:7 http://ports.ubuntu.com/ubuntu-ports jammy/main armhf readline-common all 8.1.2-1 [53.5 kB]
  Get:8 http://ports.ubuntu.com/ubuntu-ports jammy/main armhf libreadline8 armhf 8.1.2-1 [128 kB]
  Get:9 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main armhf libsqlite3-0 armhf 3.37.2-2ubuntu0.1 [548 kB]
  Get:10 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main armhf libpython3.10-stdlib armhf 3.10.6-1~22.04.2ubuntu1 [1750 kB]
  Get:11 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main armhf python3.10 armhf 3.10.6-1~22.04.2ubuntu1 [497 kB]
  Get:12 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main armhf libpython3-stdlib armhf 3.10.6-1~22.04 [6910 B]
  Get:13 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main armhf python3 armhf 3.10.6-1~22.04 [22.8 kB]
  debconf: delaying package configuration, since apt-utils is not installed
  Fetched 5933 kB in 3s (2323 kB/s)
  Selecting previously unselected package libpython3.10-minimal:armhf.
  (Reading database ... 
  (Reading database ... 5%
  (Reading database ... 10%
  (Reading database ... 15%
  (Reading database ... 20%
  (Reading database ... 25%
  (Reading database ... 30%
  (Reading database ... 35%
  (Reading database ... 40%
  (Reading database ... 45%
  (Reading database ... 50%
  (Reading database ... 55%
  (Reading database ... 60%
  (Reading database ... 65%
  (Reading database ... 70%
  (Reading database ... 75%
  (Reading database ... 80%
  (Reading database ... 85%
  (Reading database ... 90%
  (Reading database ... 95%
  (Reading database ... 100%
  (Reading database ... 4390 files and directories currently installed.)
  Preparing to unpack .../libpython3.10-minimal_3.10.6-1~22.04.2ubuntu1_armhf.deb ...
  Unpacking libpython3.10-minimal:armhf (3.10.6-1~22.04.2ubuntu1) ...
  Selecting previously unselected package libexpat1:armhf.
  Preparing to unpack .../libexpat1_2.4.7-1ubuntu0.2_armhf.deb ...
  Unpacking libexpat1:armhf (2.4.7-1ubuntu0.2) ...
  Selecting previously unselected package python3.10-minimal.
  Preparing to unpack .../python3.10-minimal_3.10.6-1~22.04.2ubuntu1_armhf.deb ...
  Unpacking python3.10-minimal (3.10.6-1~22.04.2ubuntu1) ...
  Setting up libpython3.10-minimal:armhf (3.10.6-1~22.04.2ubuntu1) ...
  Setting up libexpat1:armhf (2.4.7-1ubuntu0.2) ...
  Setting up python3.10-minimal (3.10.6-1~22.04.2ubuntu1) ...
  Selecting previously unselected package python3-minimal.
  (Reading database ... 
  (Reading database ... 5%
  (Reading database ... 10%
  (Reading database ... 15%
  (Reading database ... 20%
  (Reading database ... 25%
  (Reading database ... 30%
  (Reading database ... 35%
  (Reading database ... 40%
  (Reading database ... 45%
  (Reading database ... 50%
  (Reading database ... 55%
  (Reading database ... 60%
  (Reading database ... 65%
  (Reading database ... 70%
  (Reading database ... 75%
  (Reading database ... 80%
  (Reading database ... 85%
  (Reading database ... 90%
  (Reading database ... 95%
  (Reading database ... 100%
  (Reading database ... 4692 files and directories currently installed.)
  Preparing to unpack .../0-python3-minimal_3.10.6-1~22.04_armhf.deb ...
  Unpacking python3-minimal (3.10.6-1~22.04) ...
  Selecting previously unselected package media-types.
  Preparing to unpack .../1-media-types_7.0.0_all.deb ...
  Unpacking media-types (7.0.0) ...
  Selecting previously unselected package libmpdec3:armhf.
  Preparing to unpack .../2-libmpdec3_2.5.1-2build2_armhf.deb ...
  Unpacking libmpdec3:armhf (2.5.1-2build2) ...
  Selecting previously unselected package readline-common.
  Preparing to unpack .../3-readline-common_8.1.2-1_all.deb ...
  Unpacking readline-common (8.1.2-1) ...
  Selecting previously unselected package libreadline8:armhf.
  Preparing to unpack .../4-libreadline8_8.1.2-1_armhf.deb ...
  Unpacking libreadline8:armhf (8.1.2-1) ...
  Selecting previously unselected package libsqlite3-0:armhf.
  Preparing to unpack .../5-libsqlite3-0_3.37.2-2ubuntu0.1_armhf.deb ...
  Unpacking libsqlite3-0:armhf (3.37.2-2ubuntu0.1) ...
  Selecting previously unselected package libpython3.10-stdlib:armhf.
  Preparing to unpack .../6-libpython3.10-stdlib_3.10.6-1~22.04.2ubuntu1_armhf.deb ...
  Unpacking libpython3.10-stdlib:armhf (3.10.6-1~22.04.2ubuntu1) ...
  Selecting previously unselected package python3.10.
  Preparing to unpack .../7-python3.10_3.10.6-1~22.04.2ubuntu1_armhf.deb ...
  Unpacking python3.10 (3.10.6-1~22.04.2ubuntu1) ...
  Selecting previously unselected package libpython3-stdlib:armhf.
  Preparing to unpack .../8-libpython3-stdlib_3.10.6-1~22.04_armhf.deb ...
  Unpacking libpython3-stdlib:armhf (3.10.6-1~22.04) ...
  Setting up python3-minimal (3.10.6-1~22.04) ...
  Selecting previously unselected package python3.
  (Reading database ... 
  (Reading database ... 5%
  (Reading database ... 10%
  (Reading database ... 15%
  (Reading database ... 20%
  (Reading database ... 25%
  (Reading database ... 30%
  (Reading database ... 35%
  (Reading database ... 40%
  (Reading database ... 45%
  (Reading database ... 50%
  (Reading database ... 55%
  (Reading database ... 60%
  (Reading database ... 65%
  (Reading database ... 70%
  (Reading database ... 75%
  (Reading database ... 80%
  (Reading database ... 85%
  (Reading database ... 90%
  (Reading database ... 95%
  (Reading database ... 100%
  (Reading database ... 5121 files and directories currently installed.)
  Preparing to unpack .../python3_3.10.6-1~22.04_armhf.deb ...
  Unpacking python3 (3.10.6-1~22.04) ...
  Setting up media-types (7.0.0) ...
  Setting up libsqlite3-0:armhf (3.37.2-2ubuntu0.1) ...
  Setting up libmpdec3:armhf (2.5.1-2build2) ...
  Setting up readline-common (8.1.2-1) ...
  Setting up libreadline8:armhf (8.1.2-1) ...
  Setting up libpython3.10-stdlib:armhf (3.10.6-1~22.04.2ubuntu1) ...
  Setting up libpython3-stdlib:armhf (3.10.6-1~22.04) ...
  Setting up python3.10 (3.10.6-1~22.04.2ubuntu1) ...
  Setting up python3 (3.10.6-1~22.04) ...
  Processing triggers for libc-bin (2.35-0ubuntu3.1) ...
  Removing intermediate container 9c1df93cbda8
   ---> b976105ef36a
  Successfully built b976105ef36a
  Successfully tagged run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04:latest
Run container
  WARNING: The requested image's platform (linux/arm/v7) does not match the detected host platform (linux/amd64) and no specific platform was requested
  this step will also run but will reinstall everything
  Python 3.10.6
Here are the logs for step 3
Run uraimo/run-on-arch-action@v2.5.0
Configuring Docker for multi-architecture support
/home/runner/work/_actions/uraimo/run-on-arch-action/v2.5.0/src/run-on-arch.sh /home/runner/work/_actions/uraimo/run-on-arch-action/v2.5.0/Dockerfiles/Dockerfile.armv7.ubuntu22.04 run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04
Build container
  GitHub token provided, caching to ghcr.io/krakinou/runonarch/run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04
  WARNING! Your password will be stored unencrypted in /home/runner/.docker/config.json.
  Configure a credential helper to remove this warning. See
  https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  
  Login Succeeded
  latest: Pulling from krakinou/runonarch/run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04
  Digest: sha256:4ef06c3de1eac1fa18976a946d985e793bdd4bc95e7d6332754b0f218b17ac18
  Status: Image is up to date for ghcr.io/krakinou/runonarch/run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04:latest
  ghcr.io/krakinou/runonarch/run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04:latest
  Sending build context to Docker daemon  69.63kB
  
  Step 1/3 : FROM arm32v7/ubuntu:22.04
   ---> eb792700b748
  Step 2/3 : COPY ./run-on-arch-install.sh /root/run-on-arch-install.sh
   ---> 7ff62b887b06
  Step 3/3 : RUN chmod +x /root/run-on-arch-install.sh && /root/run-on-arch-install.sh
  Warning: rning] The requested image's platform (linux/arm/v7) does not match the detected host platform (linux/amd64) and no specific platform was requested
   ---> Running in 68cc33632e91
  Removing intermediate container 68cc33632e91
   ---> a4521b503491
  Successfully built a4521b503491
  Successfully tagged run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04:latest
  Using default tag: latest
  The push refers to repository [ghcr.io/krakinou/runonarch/run-on-arch-krakinou-runonarch-check-run-on-arch-armv7-ubuntu22-04]
  9d76813aa08e: Preparing
  2bd3b0e1ef93: Preparing
  8d5d171f01dd: Preparing
  8d5d171f01dd: Layer already exists
  2bd3b0e1ef93: Pushed
  9d76813aa08e: Pushed
  latest: digest: sha256:af074a21d4696411f029dcaca470ddcfc9fb124f1dfcdd31f37814b1e303fd0b size: 943
Run container
  WARNING: The requested image's platform (linux/arm/v7) does not match the detected host platform (linux/amd64) and no specific platform was requested
  this step will fail
  /home/runner/work/_actions/uraimo/run-on-arch-action/v2.5.0/src/run-on-arch-commands.sh: line 4: python3: command not found
  Error: The process '/home/runner/work/_actions/uraimo/run-on-arch-action/v2.5.0/src/run-on-arch.sh' failed with exit code 127````
</details>