Skip to content

Instantly share code, notes, and snippets.

@jslee02
Last active November 7, 2024 17:04
Show Gist options
  • Save jslee02/3f94ad9528a50868b80ddbbc909af50b to your computer and use it in GitHub Desktop.
Save jslee02/3f94ad9528a50868b80ddbbc909af50b to your computer and use it in GitHub Desktop.
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
REM Requirements:
REM pixi global install conda-build
REM conda install -c conda-forge python-libarchive-c
REM conda update conda
REM conda update --all
REM Define symbols for statuses (colors are limited in batch scripts)
SET SUCCESS=[OK]
SET SKIPPED=[SKIP]
SET FAILED=[FAIL]
REM Initialize variables
SET "FORCE_UPLOAD=false"
SET "USER_OR_ORG="
SET "UPLOAD=false"
SET "CPU_COUNT="
REM Parse command-line options
:parse_args
IF "%~1"=="" GOTO end_parse_args
IF "%~1"=="-f" (
SET "FORCE_UPLOAD=true"
SHIFT
GOTO parse_args
)
IF "%~1"=="--force" (
SET "FORCE_UPLOAD=true"
SHIFT
GOTO parse_args
)
IF "%~1"=="-u" (
SHIFT
SET "USER_OR_ORG=%~1"
SHIFT
GOTO parse_args
)
IF "%~1"=="--user" (
SHIFT
SET "USER_OR_ORG=%~1"
SHIFT
GOTO parse_args
)
IF "%~1"=="-c" (
SHIFT
SET "CPU_COUNT=%~1"
SHIFT
GOTO parse_args
)
IF "%~1"=="--cpu-count" (
SHIFT
SET "CPU_COUNT=%~1"
SHIFT
GOTO parse_args
)
IF "%~1"=="--upload" (
SET "UPLOAD=true"
SHIFT
GOTO parse_args
)
ECHO Unknown option: %~1
ECHO Usage: %0 [-f|--force] [-u|--user USER_OR_ORG] [-c|--cpu-count CPU_COUNT] [--upload]
EXIT /B 1
GOTO parse_args
:end_parse_args
REM Determine USER_OR_ORG
IF NOT DEFINED USER_OR_ORG (
IF NOT "%ANACONDA_USER_OR_ORG%"=="" (
SET "USER_OR_ORG=%ANACONDA_USER_OR_ORG%"
)
)
IF NOT DEFINED USER_OR_ORG (
IF EXIST "%USERPROFILE%\.anaconda_user_or_org" (
FOR /F "usebackq tokens=*" %%i IN ("%USERPROFILE%\.anaconda_user_or_org") DO SET "USER_OR_ORG=%%i"
)
)
IF NOT DEFINED USER_OR_ORG (
SET /P "USER_OR_ORG=Enter Anaconda username or organization name: "
)
REM Cache the USER_OR_ORG value for future use
ECHO %USER_OR_ORG%>"%USERPROFILE%\.anaconda_user_or_org"
REM Determine CPU_COUNT
IF NOT DEFINED CPU_COUNT (
IF NOT "%BUILD_CPU_COUNT%"=="" (
SET "CPU_COUNT=%BUILD_CPU_COUNT%"
)
)
IF NOT DEFINED CPU_COUNT (
IF EXIST "%USERPROFILE%\.cpu_count" (
FOR /F "usebackq tokens=*" %%i IN ("%USERPROFILE%\.cpu_count") DO SET "CPU_COUNT=%%i"
)
)
IF NOT DEFINED CPU_COUNT (
SET /P "CPU_COUNT=Enter CPU count (number of cores to use for building): "
)
REM Cache the CPU_COUNT value for future use
ECHO %CPU_COUNT%>"%USERPROFILE%\.cpu_count"
REM Export CPU_COUNT
SET "CPU_COUNT=%CPU_COUNT%"
REM Define patterns in the desired order
SET "PATTERNS=win_64*;win_32*"
REM Collect configs matching the patterns
SET "CONFIGS="
FOR %%P IN (%PATTERNS%) DO (
FOR /F "delims=" %%G IN ('DIR /B ".ci_support\%%P.yaml" 2^>nul') DO (
SET "CONFIGS=!CONFIGS! %%G"
)
)
REM Remove leading space from CONFIGS
SET "CONFIGS=%CONFIGS:* =%"
REM Create build_artifacts directory if it doesn't exist
IF NOT EXIST "build_artifacts" (
MKDIR "build_artifacts"
)
REM Initialize counters and lists
SET /A "SUCCEEDED_BUILDS=0"
SET /A "SKIPPED_BUILDS=0"
SET /A "FAILED_BUILDS=0"
SET "SUCCEEDED_LIST="
SET "SKIPPED_LIST="
SET "FAILED_LIST="
REM Total number of builds
SET /A "TOTAL_BUILDS=0"
FOR %%G IN (%CONFIGS%) DO (
SET /A "TOTAL_BUILDS+=1"
)
SET /A "CURRENT_INDEX=0"
ECHO [ Starting Builds ]
ECHO ----------------------------------------
ECHO Total configurations to build: %TOTAL_BUILDS%
ECHO Using CPU_COUNT: %CPU_COUNT%
ECHO.
FOR %%G IN (%CONFIGS%) DO (
SET /A "CURRENT_INDEX+=1"
SET "CONFIG=%%G"
SET "CONFIG_NAME=!CONFIG:.yaml=!"
SET "PROGRESS=<%CURRENT_INDEX%/%TOTAL_BUILDS%>"
IF EXIST "build_artifacts\conda-forge-build-done-!CONFIG_NAME!" (
ECHO !PROGRESS! %SKIPPED% Skipped !CONFIG_NAME!
SET /A "SKIPPED_BUILDS+=1"
SET "SKIPPED_LIST=!SKIPPED_LIST! !CONFIG_NAME!"
ECHO.
) ELSE (
ECHO !PROGRESS! Building !CONFIG_NAME!...
REM Run the build
conda-build recipe -m ".ci_support\!CONFIG!" -c conda-forge --croot output --no-build-id > "build_artifacts\!CONFIG_NAME!-log.txt" 2>&1
IF !ERRORLEVEL! EQU 0 (
ECHO !PROGRESS! %SUCCESS% Build succeeded: !CONFIG_NAME!
SET /A "SUCCEEDED_BUILDS+=1"
SET "SUCCEEDED_LIST=!SUCCEEDED_LIST! !CONFIG_NAME!"
) ELSE (
ECHO !PROGRESS! %FAILED% Build failed: !CONFIG_NAME!
SET /A "FAILED_BUILDS+=1"
SET "FAILED_LIST=!FAILED_LIST! !CONFIG_NAME!"
)
REM If --upload is passed, run upload.bat
IF /I "%UPLOAD%"=="true" (
ECHO !PROGRESS! Uploading !CONFIG_NAME!...
CALL upload.bat
)
ECHO.
)
)
REM Zip the log files
REM Ensure you have a zip utility like 7-Zip installed and in PATH
REM For example, using 7-Zip:
IF EXIST "build_artifacts\log_files.zip" DEL "build_artifacts\log_files.zip"
7z a -tzip "build_artifacts\log_files.zip" "build_artifacts\*-log.txt" >nul
REM Print build summary
ECHO.
ECHO ----------------------------------------
ECHO [ BUILD SUMMARY ]
ECHO ----------------------------------------
ECHO.
ECHO Total Builds Attempted: %TOTAL_BUILDS%
ECHO %SUCCESS% Succeeded: %SUCCEEDED_BUILDS%
ECHO %SKIPPED% Skipped: %SKIPPED_BUILDS%
ECHO %FAILED% Failed: %FAILED_BUILDS%
ECHO.
IF %SUCCEEDED_BUILDS% GTR 0 (
ECHO %SUCCESS% Succeeded Builds:
FOR %%A IN (%SUCCEEDED_LIST%) DO (
ECHO - %%A
)
ECHO.
)
IF %SKIPPED_BUILDS% GTR 0 (
ECHO %SKIPPED% Skipped Builds:
FOR %%A IN (%SKIPPED_LIST%) DO (
ECHO - %%A
)
ECHO.
)
IF %FAILED_BUILDS% GTR 0 (
ECHO %FAILED% Failed Builds:
FOR %%A IN (%FAILED_LIST%) DO (
ECHO - %%A
)
ECHO.
)
ENDLOCAL
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment