Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Windows workflow execution fails, paths not resolved #2704

Open
CodeFHD opened this issue Mar 22, 2025 · 6 comments
Open

Windows workflow execution fails, paths not resolved #2704

CodeFHD opened this issue Mar 22, 2025 · 6 comments
Labels
kind/bug Something isn't working

Comments

@CodeFHD
Copy link

CodeFHD commented Mar 22, 2025

Bug report info

act version:            0.2.74
GOOS:                   windows
GOARCH:                 amd64
NumCPU:                 6
Docker host:            DOCKER_HOST environment variable is not set
Sockets found:
        \\.\pipe\docker_engine(broken)
Config files:
        C:\Users\johannes\AppData\Local\act\actrc:
                -P ubuntu-latest=catthehacker/ubuntu:act-latest
                -P ubuntu-22.04=catthehacker/ubuntu:act-22.04
                -P ubuntu-20.04=catthehacker/ubuntu:act-20.04
                -P ubuntu-18.04=catthehacker/ubuntu:act-18.04
Build info:
        Go version:            go1.23.5
        Module path:           github.com/nektos/act
        Main version:          (devel)
        Main path:             github.com/nektos/act
        Main checksum:
        Build settings:
                -buildmode:           exe
                -compiler:            gc
                -ldflags:             -s -w -X main.version=0.2.74 -X main.commit=3f741df6bcf35bafe16247e6dcb3072c5a481977 -X main.date=2025-02-10T06:52:17Z -X main.builtBy=goreleaser
                CGO_ENABLED:          0
                GOARCH:               amd64
                GOOS:                 windows
                GOAMD64:              v1
                vcs:                  git
                vcs.revision:         3f741df6bcf35bafe16247e6dcb3072c5a481977
                vcs.time:             2025-02-10T04:34:35Z
                vcs.modified:         false
Docker Engine:
        Engine version:        28.0.1
        Engine runtime:        runc
        Cgroup version:        1
        Cgroup driver:         cgroupfs
        Storage driver:        overlayfs
        Registry URI:          https://index.docker.io/v1/
        OS:                    Docker Desktop
        OS type:               linux
        OS version:
        OS arch:               x86_64
        OS kernel:             5.15.167.4-microsoft-standard-WSL2
        OS CPU:                6
        OS memory:             15964 MB
        Security options:
                name=seccomp,profile=unconfined


level=info msg=️📣 A newer version of 'act' is available - consider ugrading to 0.2.75.

Command used with act

act -W .github\workflows\wheel-builder.yml --matrix os:windows-latest --matrix python-minor:11 --artifact-server-path C:\Users\johannes\SomePath -P windows-latest=-self-hosted

Describe issue

I am trying to locally run a workflow from the LuxCoreRender/LuxCore repository, see below.

It works on GitHub actions for all OS configurations, and I can run it locally on linux using act (on a seaprate PC, not inside WSL, just to be clear).

Running it on Windows, I am stuck at the following error:

[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11] ⭐ Run Main Configure git for long paths
| /bin/bash: C:/Users/johannes/.cache/act/d64a40e607bb907a/act/workflow/0.sh: No such file or directory

The file exists and contains the command that is supposed to be run for this step of the workflow.

I suspect the error is because the windows path C:/... is not resolved to /mnt/c/... as it would be accessible inside WSL.

I could not find any solution to this problem online so far, neither in the context of act or plain Docker.
I did attempt to reinstall WSL and Docker, but without change.

Any help to solve or further debug this would be appreciated.

Link to GitHub repository

https://github.com/LuxCoreRender/LuxCore/blob/for_v2.10/.github/workflows/wheel-builder.yml

Workflow content

# SPDX-FileCopyrightText: 2024 Howetuft
#
# SPDX-License-Identifier: Apache-2.0

# This action is the 1st part of a larger toolchain. You will find the other
# components in LuxCoreRender/LuxCoreWheels repository


name: LuxCore Python Wheels Builder

on:
  workflow_dispatch:
  workflow_call:
    inputs:
      repository:
        description: 'Repository to check out'
        required: false
        default: ''
        type: string
      ref:
        description: 'The branch, tag or SHA to checkout.'
        required: false
        default: ''
        type: string
      version:
        description: 'The version to build - must comply to semver, or blank for default'
        type: string
    outputs:
      commit:
        description: "The commit that has been checked out"
        value: ${{ jobs.build-wheels.outputs.commit }}
      branch:
        description: "The branch that has been checked out"
        value: ${{ jobs.build-wheels.outputs.branch }}
      attestation-url:
        description: "The url to the attestations"
        value: ${{ jobs.attest-wheels.outputs.attestation-url }}
      version:
        description: "The version actually built"
        value: ${{ jobs.build-wheels.outputs.version }}
  push:

jobs:
  build-wheels:
    name: Build wheel ${{ matrix.os }}-3.${{ matrix.python-minor }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        python-minor: [9, 10, 11, 12, 13]
        os: [ubuntu-latest, windows-latest, macos-13, macos-14]
        #python-minor: [ 9 ]
        #python-minor: [ 12]
        #os: [macos-14]
        #python-minor: [ 11]
        #os: [windows-latest]
        #python-minor: [ 11]
        #os: [macos-13]
    env:
      # Reminder: report all variables here to CIBW_ENVIRONMENT_PASS_LINUX
      BUILD_TYPE: Release
      CXX_VERSION: 20
      GCC_VERSION: 14
      GLIBC_VERSION: 2_28
      GH_TOKEN: ${{ github.token }}
      PYTHON_MINOR: ${{ matrix.python-minor }}
    outputs:
      commit: ${{ steps.current-commit.outputs.commit }}
      branch: ${{ steps.current-commit.outputs.branch }}
      version: ${{ steps.output-version.outputs.version }}

    steps:

      - name: Configure git for long paths
        shell: bash
        if: runner.os == 'Windows'
        run: git config --system core.longpaths true

      - name: Checkout main repository (standard context)
        if: ${{ !env.ACT }}
        uses: actions/checkout@v4
        with:
          repository: ${{ inputs.repository }}
          ref: ${{ inputs.ref }}

      - name: Checkout main repository (act context)
        if: env.ACT
        uses: actions/checkout@v4

      - name: Get current commit
        id: current-commit
        run: |
          echo "commit=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
          echo "branch=$(git symbolic-ref HEAD)" >> $GITHUB_OUTPUT
          echo "commit=$(git rev-parse HEAD)"
          echo "branch=$(git symbolic-ref HEAD)"

      - name: Find workspace
        shell: bash
        run: |
          case ${{ runner.os }} in
            Linux) _workspace="/project";;
            Windows) _workspace=$(cygpath -u $GITHUB_WORKSPACE);;
            macOS) _workspace="$GITHUB_WORKSPACE";;
            *) echo "Unhandled os ${{ runner.os }}";exit 64;;
          esac
          echo "WORKSPACE=${_workspace}" >> $GITHUB_ENV

      - name: Set Conan parameters
        shell: bash
        run: |
            _build_type=$(echo "${{ env.BUILD_TYPE }}" | tr '[:upper:]' '[:lower:]')
            _conan_home="${{ env.WORKSPACE }}/.conan2"
            echo "CONAN_PRESET=conan-${_build_type}" >> $GITHUB_ENV
            echo "CONAN_HOME=${_conan_home}" >> $GITHUB_ENV

      - name: Configure ccache
        uses: actions/github-script@v7
        with:
          script: |
            const workspace = String.raw`${{ github.workspace }}`;

            const envVariables = {
                'cache-variant': String.raw`ccache`,
                'CMAKE_CXX_COMPILER_LAUNCHER': String.raw`ccache`,
                'CMAKE_C_COMPILER_LAUNCHER': String.raw`ccache`,
                'CCACHE_CONFIGPATH': String.raw`${workspace}/ccache.conf`,
                'CCACHE_DIR': String.raw`${workspace}/.ccache`,
                'CCACHE_DEBUGDIR': String.raw`${workspace}/ccache-debug`,
                'CCACHE_LOGFILE': String.raw`${workspace}/ccache.log`
            };

            for (const [key, value] of Object.entries(envVariables)) {
                core.exportVariable(key, value);
            }

      # Update apt: needed to install ccache
      - name: Update apt (Linux)
        if: runner.os == 'Linux'
        shell: bash
        run: |
          sudo apt-get update -y

      - name: ccache
        uses: hendrikmuhs/ccache-action@v1.2
        with:
          create-symlink: false
          variant: ${{ env.cache-variant }}
          key: cpl-${{ matrix.os }}-${{ matrix.python-minor}}
          restore-keys: cpl-${{ matrix.os }}-${{ matrix.python-minor}}-
          max-size: 5G
          verbose: 1

      - name: Prepare msvc
        if: runner.os == 'Windows'
        uses: ilammy/msvc-dev-cmd@v1

      - name: Prepare Linux
        if: runner.os == 'Linux'
        shell: bash
        run: |
          _V=${{ env.GCC_VERSION }}
          _T=/opt/rh/gcc-toolset-${_V}/root

          echo "TOOLSET_ROOT=${_T}" >> $GITHUB_ENV
          echo "CXX=${_T}/usr/bin/g++" >> $GITHUB_ENV
          echo "CC=${_T}/usr/bin/gcc" >> $GITHUB_ENV
          echo "AR=${_T}/usr/bin/ar" >> $GITHUB_ENV
          echo "RANLIB=${_T}/usr/bin/ranlib" >> $GITHUB_ENV

      - name: Set MacOS deployment target
        if: runner.os == 'macOS'
        uses: actions/github-script@v7
        with:
          script: |
            if ('${{ runner.arch }}' == 'X64') {
              target = '10.15';
              arch='x86_64';
            }
            else if ('${{ env.PYTHON_MINOR }}' != '8') {
              target = '11.0';
              arch='armv8';
            }
            else {
              target = '12.0';
              arch='armv8';
            }
            core.exportVariable('MACOSX_DEPLOYMENT_TARGET', target);
            core.exportVariable('PKG_ARCH', arch);

      # TODO: The following block is an ugly hack but, at the moment (2025-02-25),
      # scikit-build-core lacks a preset parameter, so this is the only way
      # I found to pass a calculated environment var to CMake build step
      - name: Set M4 env var
        if: runner.os != 'Windows'
        uses: actions/github-script@v7
        with:
          script: |
            if ('${{ runner.arch }}' == 'X64') {
              arch = 'x86_64'
            } else {
              arch = 'armv8'
            }
            base = '${{ env.WORKSPACE }}/out/dependencies/full_deploy/host/m4/1.4.19/Release/'
            core.exportVariable('M4', base + arch + '/bin/m4')

      - name: Export version for scikit-build-core
        shell: python
        run: |
          import json
          if (input_version := "${{ inputs.release-version }}"):
            result = input_version
          else:
            with open("luxcore.json") as in_file:
              default_version = json.load(in_file)["DefaultVersion"]
            result = ".".join(default_version[i] for i in ("major", "minor", "patch"))
            if (prerelease := default_version["prerelease"]):
              result = f"{result}-{prerelease}"

          print(f"Version: {result}")

          with open("SKVERSION", "w+") as out_file:
            out_file.write(result)

      - name: Output version
        id: output-version
        shell: bash
        run: |
          _version=$(cat SKVERSION)
          echo "version=${_version}" >> "$GITHUB_OUTPUT"


      # Build wheel
      - name: Build wheels
        uses: pypa/cibuildwheel@v2.22.0
        env:
          CIBW_BUILD_FRONTEND: build
          CIBW_BUILD_VERBOSITY: 1
          CIBW_BUILD: cp3${{ matrix.python-minor }}-*
          CIBW_SKIP: "*musllinux*"
          CIBW_ARCHS: auto64
          CIBW_MANYLINUX_X86_64_IMAGE: quay.io/pypa/manylinux_${{ env.GLIBC_VERSION }}_x86_64
          CIBW_ENVIRONMENT: >
            SKBUILD_CMAKE_ARGS='--preset conan-default;--log-level=VERBOSE;-DLUXCORE_VERSION=${{ steps.output-version.outputs.version }};-G Ninja Multi-Config'
            SKBUILD_CMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }}
            #LUX_GENERATOR='Ninja'
          CIBW_ENVIRONMENT_PASS_LINUX: |
            CC
            CXX
            BUILD_TYPE
            GCC_VERSION
            SANITIZE
            ASAN_PATH
            RUNNER_OS
            RUNNER_ARCH
            WORKSPACE
            CMAKE_CXX_COMPILER_LAUNCHER
            CMAKE_C_COMPILER_LAUNCHER
            PYTHON_MINOR
            BOOST_INSTALL_LAYOUT
            SPDLOG_FMT_EXTERNAL
            CXX_VERSION
            CONAN_HOME
            CONAN_PRESET
            M4
          CIBW_BEFORE_ALL_LINUX: |
            # Install toolchain (gcc, ccache...)
            dnf install -y epel-release
            dnf install -y almalinux-release-devel
            dnf install -y ccache
            dnf install -y sudo  # for gtk3...
            dnf install -y perl-IPC-Cmd perl-Digest-SHA

            # Manylinux_2_34 compatibility
            if [[ ${{ env.GLIBC_VERSION }} != 2_28 ]]; then
              dnf install -y perl-FindBin perl-lib
            fi

            pip install conan && make deps

          CIBW_BEFORE_ALL_MACOS: |
            pip install conan && make deps

          CIBW_BEFORE_ALL_WINDOWS: |
            pip install conan && make deps


          CIBW_REPAIR_WHEEL_COMMAND_LINUX: |
            paths=$(find /project -type d -wholename "*/lib" -print0 | xargs -0 realpath | tr "\n" ":")
            LD_LIBRARY_PATH=$paths:$LD_LIBRARY_PATH
            echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}"
            export LD_LIBRARY_PATH

            ## Check build data
            unzip {wheel} -d /tmp/wheel

            auditwheel \
              --verbose repair -w {dest_dir} \
              --plat manylinux_${{ env.GLIBC_VERSION }}_x86_64 \
              --only-plat \
              ${{ env.BUILD_TYPE == 'Release' && '--strip' || '' }} \
              {wheel}

          CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: |
            bash.exe ${{ env.WORKSPACE }}/scripts/repair_wheel_windows.sh '{wheel}' '{dest_dir}' '%VCToolsRedistDir%%Platform%' '${{ env.WORKSPACE }}'
          CIBW_REPAIR_WHEEL_COMMAND_MACOS: |
            cp {wheel} ${{ env.WORKSPACE }}
            paths=$(find ${{ env.WORKSPACE }} -type d -wholename "*/lib" -print0 | xargs -0 realpath | tr "\n" ":")
            DYLD_LIBRARY_PATH=$paths:$DYLD_LIBRARY_PATH
            echo "DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}"
            export DYLD_LIBRARY_PATH
            delocate-listdeps -v {wheel}
            delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel}
          CIBW_TEST_COMMAND_LINUX: pyluxcoretest
          CIBW_TEST_COMMAND_WINDOWS: pyluxcoretest
          CIBW_TEST_COMMAND_MACOS: |
            if [[ ${{ matrix.os }} == 'macos-13' ]]; then
              # Only for Intel: ARM runner raises an OpenCL driver issue
              pyluxcoretest
            fi
          CIBW_CONTAINER_ENGINE: >
            docker;
            create_args:
              --mount type=bind,source=${{ env.CCACHE_DIR }},target=/root/.ccache

        with:
            package-dir: .
            output-dir: wheelhouse
            config-file: "{package}/pyproject.toml"


      - name: Save dependency cache
        if: always()
        id: cache-deps-save
        uses: actions/cache/save@v4
        with:
          path: conan-cache
          key: deps-${{ matrix.os }}-${{ matrix.python-minor}}-${{ hashFiles('**/conan-cache') }}

      #- name: Setup tmate session
        #uses: mxschmitt/action-tmate@v3

      #- name: Setup tmate session (debug)
        #if: ${{ failure() }}
        #uses: mxschmitt/action-tmate@v3

      # Upload artifacts
      - uses: actions/upload-artifact@v4
        id: upload
        with:
          name: cibw-wheels-${{ matrix.os }}-${{ matrix.python-minor }}
          path: ./wheelhouse/*.whl

  attest-wheels:
    needs: [build-wheels]
    runs-on: ubuntu-latest
    permissions:
      attestations: write
      id-token: write
    outputs:
      attestation-url: ${{ steps.attestation-step.outputs.attestation-url }}

    steps:
      - uses: actions/download-artifact@v4
        if: ${{ !env.ACT }}
        with:
          pattern: cibw-wheels-*
          path: ${{ github.workspace }}/dist
          merge-multiple: false

      - name: Generate artifact attestations
        id: attestation-step
        if: ${{ !env.ACT }}
        uses: actions/attest-build-provenance@v2
        with:
          subject-path: ${{ github.workspace }}/dist/*

Relevant log output

time="2025-03-22T13:23:41+01:00" level=info msg="Using docker host 'npipe:////./pipe/docker_engine', and daemon socket 'npipe:////./pipe/docker_engine'"
time="2025-03-22T13:23:41+01:00" level=info msg="Start server on http://192.168.178.20:34567"
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11] ⭐ Run Set up job
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11]   ✅  Success - Set up job
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11]   ☁  git clone 'https://github.com/actions/checkout' # ref=v4
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11]   ☁  git clone 'https://github.com/actions/github-script' # ref=v7
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11]   ☁  git clone 'https://github.com/hendrikmuhs/ccache-action' # ref=v1.2
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11]   ☁  git clone 'https://github.com/ilammy/msvc-dev-cmd' # ref=v1
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11]   ☁  git clone 'https://github.com/actions/github-script' # ref=v7
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11]   ☁  git clone 'https://github.com/actions/github-script' # ref=v7
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11]   ☁  git clone 'https://github.com/pypa/cibuildwheel' # ref=v2.22.0
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11] ⭐ Run Pre Build wheels
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11]   ☁  git clone 'https://github.com/actions/setup-python' # ref=v5
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11]   ✅  Success - Pre Build wheels
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11]   ☁  git clone 'https://github.com/actions/cache' # ref=v4
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11]   ☁  git clone 'https://github.com/actions/upload-artifact' # ref=v4
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11] 🧪  Matrix: map[os:windows-latest python-minor:11]
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11] ⭐ Run Main Configure git for long paths
| /bin/bash: C:/Users/johannes/.cache/act/2836420ea4013eaf/act/workflow/0.sh: No such file or directory
                                                                                                       [LuxCore Python Wheels Builder/Build wheel windows-latest-3.11]   ❌  Failure - Main Configure git for long paths
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11] exit status 1
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11] ⭐ Run Main Save dependency cache
| Cannot find: node in PATH
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11]   ❌  Failure - Main Save dependency cache
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11] Cannot find: node in PATH
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11] ⭐ Run Complete job
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11]   ✅  Success - Complete job
[LuxCore Python Wheels Builder/Build wheel windows-latest-3.11] 🏁  Job failed
Error: Job 'Build wheel ${{ matrix.os }}-3.${{ matrix.python-minor }}' failed

Additional information

No response

@CodeFHD CodeFHD added the kind/bug Something isn't working label Mar 22, 2025
@ChristopherHX
Copy link
Contributor

FYI you need bash.exe of mingw, msys, cygwin, or the one of git for windows in your PATH before system32.
Removing wsl2 removes before system32 requirement

wsl bash can work if you use a custom shell and do some magic, but this is not act specific at all.

@CodeFHD
Copy link
Author

CodeFHD commented Mar 22, 2025

Thanks! That seems to have helped.

I had a fresh installation of cygwin, but it was not on path. bash.exe was only found in system32. (neither from mingw or git for windows.)
After appending C:\cygwin64\bin to the beginning of path, the error disappeared.

I still get another error causing the workflow to fail. I will investigate further. If that seems unrelated to the path issue, I will close this.

@CodeFHD
Copy link
Author

CodeFHD commented Mar 22, 2025

Update: I do get a similar error in a later step when another github action is called. (pypa/cibuildwheel)

| C:/Users/johannes/.cache/act/b20426c31cd08834/act/workflow/15-composite-cibw.sh: line 3: C:\Users\johannes\.cache\act\tool_cache\Python\3.12.9\x64\python.exe: command not found

It appears the output ${{ steps.python.outputs.python-path }} in this line https://github.com/pypa/cibuildwheel/blob/462c99589a225e8c44a682e210bdd74b90be512c/action.yml#L37C10-L37C49 hasn't been converted. This is generated by actions/setup-python@v5

[EDIT 23.03.: Edited the path because due to markdown it was not dispalyed correctly - backslash before .cache was not displayed.]

@ChristopherHX
Copy link
Contributor

It appears the output ${{ steps.python.outputs.python-path }} in this line https://github.com/pypa/cibuildwheel/blob/462c99589a225e8c44a682e210bdd74b90be512c/action.yml#L37C10-L37C49 hasn't been converted

  • For me is looking C:\Users\johannes.cache\act\tool_cache\Python\3.12.9\x64\python.exe perfectly correct on windows
  • Is python.exe not in this filepath? This is the correct tool_cache folder.
  • Is the bash used by windows-latest different and accept this syntax?

Act does not aim to alter outputs generated by actions, the shell path used forward slashes / just because someone opened an issue here and this increases compatibility a bit for some bash for windows.

@CodeFHD
Copy link
Author

CodeFHD commented Mar 23, 2025

That's exactly the point (again): The path is valid, and python.exe is there.

I have tested the Cygwin-bash, which is now the first on PATH. While it generally accepts Windows-Style paths, it seems to require either single-forward- or double-back-slash everywhere except after the drive letter:

  • C:/Users/johannes is valid
  • C:\\Users\\johannes is valid
  • C:\Users\\johannes is valid
  • C:\Users\johannes is NOT valid

You had suggested shells provided by mingw, git, or msys as further alternatives. I could try to supply those and see if they respond differently.

If that doesn't work, I suppose I should follow-up with and issue at actions/setup-python, based on your last comment?

P.S.: There was a small markdown error in the path (johannes.cache should have been johannes\.cache). Just to not spark confusion, I will edit it above.

@CodeFHD
Copy link
Author

CodeFHD commented Mar 26, 2025

I had no further success with other shells.

Reported this upstream to actions/setup-python:
actions/setup-python#1066

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kind/bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants