name: Build Conda-Pack Environment on: workflow_dispatch: inputs: branch: description: '选择要构建的分支' required: true default: 'dev' type: string platforms: description: '选择构建平台 (逗号分隔): linux-64, osx-64, osx-arm64, win-64' required: false default: 'win-64' type: string jobs: build-conda-pack: strategy: fail-fast: false matrix: include: - os: ubuntu-latest platform: linux-64 env_file: unilabos-linux-64.yaml script_ext: sh - os: macos-13 # Intel platform: osx-64 env_file: unilabos-osx-64.yaml script_ext: sh - os: macos-latest # ARM64 platform: osx-arm64 env_file: unilabos-osx-arm64.yaml script_ext: sh - os: windows-latest platform: win-64 env_file: unilabos-win64.yaml script_ext: bat runs-on: ${{ matrix.os }} defaults: run: shell: bash -l {0} steps: - name: Check if platform should be built id: should_build run: | if [[ -z "${{ github.event.inputs.platforms }}" ]]; then echo "should_build=true" >> $GITHUB_OUTPUT elif [[ "${{ github.event.inputs.platforms }}" == *"${{ matrix.platform }}"* ]]; then echo "should_build=true" >> $GITHUB_OUTPUT else echo "should_build=false" >> $GITHUB_OUTPUT fi - uses: actions/checkout@v4 if: steps.should_build.outputs.should_build == 'true' with: ref: ${{ github.event.inputs.branch }} fetch-depth: 0 - name: Setup Miniconda if: steps.should_build.outputs.should_build == 'true' uses: conda-incubator/setup-miniconda@v3 with: miniconda-version: 'latest' python-version: '3.11.11' channels: conda-forge,robostack-staging,uni-lab,defaults channel-priority: strict activate-environment: unilab auto-activate: false auto-update-conda: false show-channel-urls: true - name: Install conda-pack if: steps.should_build.outputs.should_build == 'true' run: | conda install -c conda-forge conda-pack -y - name: Install unilabos and dependencies if: steps.should_build.outputs.should_build == 'true' run: | echo "Installing unilabos and dependencies to unilab environment..." conda install uni-lab::unilabos -c uni-lab -c robostack-staging -c conda-forge -y - name: Get latest ros-humble-unilabos-msgs version if: steps.should_build.outputs.should_build == 'true' id: msgs_version run: | INSTALLED_VERSION=$(conda list ros-humble-unilabos-msgs | grep ros-humble-unilabos-msgs | awk '{print $2}') echo "installed_version=$INSTALLED_VERSION" >> $GITHUB_OUTPUT echo "Installed ros-humble-unilabos-msgs version: $INSTALLED_VERSION" - name: Check for newer ros-humble-unilabos-msgs if: steps.should_build.outputs.should_build == 'true' run: | echo "Checking for available ros-humble-unilabos-msgs versions..." conda search ros-humble-unilabos-msgs -c uni-lab -c robostack-staging -c conda-forge --info || echo "Search completed" echo "Updating ros-humble-unilabos-msgs to latest version..." conda update ros-humble-unilabos-msgs -c uni-lab -c robostack-staging -c conda-forge -y || echo "Already at latest version" - name: Install latest unilabos from source if: steps.should_build.outputs.should_build == 'true' run: | echo "Uninstalling existing unilabos..." pip uninstall unilabos -y || echo "unilabos not installed via pip" echo "Installing unilabos from source (branch: ${{ github.event.inputs.branch }})..." pip install . echo "Verifying installation..." pip show unilabos - name: Display environment info if: steps.should_build.outputs.should_build == 'true' run: | echo "=== Environment Information ===" conda env list echo "" echo "=== Installed Packages ===" conda list | grep -E "(unilabos|ros-humble-unilabos-msgs)" || conda list echo "" echo "=== Python Packages ===" pip list | grep unilabos || pip list - name: Verify environment integrity if: steps.should_build.outputs.should_build == 'true' run: | echo "Verifying Python version..." python -c "import sys; print(f'Python version: {sys.version}')" echo "Verifying unilabos import..." python -c "import unilabos; print(f'UniLabOS version: {unilabos.__version__}')" || echo "Warning: Could not import unilabos" echo "Checking critical packages..." python -c "import rclpy; print('ROS2 rclpy: OK')" echo "Running comprehensive verification script..." python scripts/verify_installation.py || echo "Warning: Verification script reported issues" echo "Environment verification complete!" - name: Pack conda environment if: steps.should_build.outputs.should_build == 'true' run: | echo "Packing unilab environment with conda-pack..." conda pack -n unilab -o unilab-env-${{ matrix.platform }}.tar.gz --ignore-missing-files echo "Pack file created:" ls -lh unilab-env-${{ matrix.platform }}.tar.gz - name: Prepare distribution package (scripts + environment) if: steps.should_build.outputs.should_build == 'true' run: | echo "==========================================" echo "Creating distribution package..." echo "Platform: ${{ matrix.platform }}" echo "==========================================" mkdir -p dist-package # Copy packed environment echo "Adding: unilab-env-${{ matrix.platform }}.tar.gz" cp unilab-env-${{ matrix.platform }}.tar.gz dist-package/ # Copy installation script (platform specific) if [ "${{ matrix.platform }}" == "win-64" ]; then echo "Adding: install_unilab.bat" cp scripts/install_unilab.bat dist-package/ else echo "Adding: install_unilab.sh" cp scripts/install_unilab.sh dist-package/ chmod +x dist-package/install_unilab.sh fi # Copy verification script echo "Adding: verify_installation.py" cp scripts/verify_installation.py dist-package/ # Create README echo "Creating: README.txt" cat > dist-package/README.txt << 'EOFREADME' UniLabOS Conda-Pack Environment ================================ This package contains a pre-built UniLabOS environment. Installation Instructions: -------------------------- Windows: 1. Extract unilab-pack-win-64.zip 2. Double-click install_unilab.bat (or run in cmd) 3. Follow the prompts macOS/Linux: 1. Extract unilab-pack-{platform}.tar.gz 2. Run: bash install_unilab.sh 3. Follow the prompts The installation script will: - Automatically find your conda installation - Extract the environment to conda's envs/unilab directory - Run conda-unpack to finalize setup After installation: conda activate unilab python verify_installation.py Package Contents: - install_unilab script (automatic installation) - unilab-env-{platform}.tar.gz (packed environment) - verify_installation.py (verification tool) - README.txt (this file) Branch: ${{ github.event.inputs.branch }} Platform: ${{ matrix.platform }} Python: 3.11.11 Build Date: $(date -u +"%Y-%m-%d %H:%M:%S UTC") EOFREADME echo "" echo "Distribution package contents:" ls -lh dist-package/ echo "" - name: Create final distribution archive (ZIP/TAR.GZ) if: steps.should_build.outputs.should_build == 'true' run: | echo "==========================================" if [ "${{ matrix.platform }}" == "win-64" ]; then echo "Creating Windows ZIP archive..." echo "Archive: unilab-pack-win-64.zip" echo "Contents: install_unilab.bat + unilab-env-win-64.tar.gz + extras" cd dist-package powershell -Command "Compress-Archive -Path * -DestinationPath ../unilab-pack-${{ matrix.platform }}.zip -Force" cd .. else echo "Creating Unix/Linux TAR.GZ archive..." echo "Archive: unilab-pack-${{ matrix.platform }}.tar.gz" echo "Contents: install_unilab.sh + unilab-env-${{ matrix.platform }}.tar.gz + extras" tar -czf unilab-pack-${{ matrix.platform }}.tar.gz -C dist-package . fi echo "==========================================" echo "" echo "Final package created:" ls -lh unilab-pack-* echo "" if [ "${{ matrix.platform }}" == "win-64" ]; then echo "Users can now:" echo " 1. Download unilab-pack-win-64.zip" echo " 2. Extract it" echo " 3. Run install_unilab.bat" else echo "Users can now:" echo " 1. Download unilab-pack-${{ matrix.platform }}.tar.gz" echo " 2. Extract it: tar -xzf unilab-pack-${{ matrix.platform }}.tar.gz" echo " 3. Run: bash install_unilab.sh" fi echo "" - name: Upload distribution package if: steps.should_build.outputs.should_build == 'true' uses: actions/upload-artifact@v4 with: name: unilab-pack-${{ matrix.platform }}-${{ github.event.inputs.branch }} path: unilab-pack-* retention-days: 90 if-no-files-found: error - name: Display package info if: steps.should_build.outputs.should_build == 'true' run: | echo "==========================================" echo "Build Summary" echo "==========================================" echo "Platform: ${{ matrix.platform }}" echo "Branch: ${{ github.event.inputs.branch }}" echo "Python version: 3.11.11" echo "" echo "Package contents:" if [ "${{ matrix.platform }}" == "win-64" ]; then echo " - unilab-pack-${{ matrix.platform }}.zip" else echo " - unilab-pack-${{ matrix.platform }}.tar.gz" fi echo " - unilab-env-${{ matrix.platform }}.tar.gz (packed environment)" echo " - install_unilab script" echo " - verify_installation.py" echo " - README.txt" echo "" echo "Package size:" ls -lh unilab-pack-* 2>/dev/null || ls -lh unilab-env-${{ matrix.platform }}.tar.gz echo "" echo "Download the artifact and run the install script!" echo "=========================================="