From 2038b209a701cfab9ad031ac84047623f3594d7d Mon Sep 17 00:00:00 2001 From: Dirk Legler Date: Wed, 15 Feb 2017 20:49:47 +0100 Subject: [PATCH] Custom deployment: Update pip, see https://github.com/Azure/azure-storage-python/issues/219 --- .deployment | 2 + deploy.cmd | 183 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100755 .deployment create mode 100755 deploy.cmd diff --git a/.deployment b/.deployment new file mode 100755 index 0000000..aad9ec1 --- /dev/null +++ b/.deployment @@ -0,0 +1,2 @@ +[config] +command = deploy.cmd diff --git a/deploy.cmd b/deploy.cmd new file mode 100755 index 0000000..240ee10 --- /dev/null +++ b/deploy.cmd @@ -0,0 +1,183 @@ +@if "%SCM_TRACE_LEVEL%" NEQ "4" @echo off + +:: ---------------------- +:: KUDU Deployment Script +:: Version: 1.0.11 +:: ---------------------- + +:: Prerequisites +:: ------------- + +:: Verify node.js installed +where node 2>nul >nul +IF %ERRORLEVEL% NEQ 0 ( + echo Missing node.js executable, please install node.js, if already installed make sure it can be reached from current environment. + goto error +) + +:: Setup +:: ----- + +setlocal enabledelayedexpansion + +SET ARTIFACTS=%~dp0%..\artifacts + +IF NOT DEFINED DEPLOYMENT_SOURCE ( + SET DEPLOYMENT_SOURCE=%~dp0%. +) + +IF NOT DEFINED DEPLOYMENT_TARGET ( + SET DEPLOYMENT_TARGET=%ARTIFACTS%\wwwroot +) + +IF NOT DEFINED NEXT_MANIFEST_PATH ( + SET NEXT_MANIFEST_PATH=%ARTIFACTS%\manifest + + IF NOT DEFINED PREVIOUS_MANIFEST_PATH ( + SET PREVIOUS_MANIFEST_PATH=%ARTIFACTS%\manifest + ) +) + +IF NOT DEFINED KUDU_SYNC_CMD ( + :: Install kudu sync + echo Installing Kudu Sync + call npm install kudusync -g --silent + IF !ERRORLEVEL! NEQ 0 goto error + + :: Locally just running "kuduSync" would also work + SET KUDU_SYNC_CMD=%appdata%\npm\kuduSync.cmd +) +goto Deployment + +:: Utility Functions +:: ----------------- + +:SelectPythonVersion + +IF DEFINED KUDU_SELECT_PYTHON_VERSION_CMD ( + call %KUDU_SELECT_PYTHON_VERSION_CMD% "%DEPLOYMENT_SOURCE%" "%DEPLOYMENT_TARGET%" "%DEPLOYMENT_TEMP%" + IF !ERRORLEVEL! NEQ 0 goto error + + SET /P PYTHON_RUNTIME=<"%DEPLOYMENT_TEMP%\__PYTHON_RUNTIME.tmp" + IF !ERRORLEVEL! NEQ 0 goto error + + SET /P PYTHON_VER=<"%DEPLOYMENT_TEMP%\__PYTHON_VER.tmp" + IF !ERRORLEVEL! NEQ 0 goto error + + SET /P PYTHON_EXE=<"%DEPLOYMENT_TEMP%\__PYTHON_EXE.tmp" + IF !ERRORLEVEL! NEQ 0 goto error + + SET /P PYTHON_ENV_MODULE=<"%DEPLOYMENT_TEMP%\__PYTHON_ENV_MODULE.tmp" + IF !ERRORLEVEL! NEQ 0 goto error +) ELSE ( + SET PYTHON_RUNTIME=python-2.7 + SET PYTHON_VER=2.7 + SET PYTHON_EXE=%SYSTEMDRIVE%\python27\python.exe + SET PYTHON_ENV_MODULE=virtualenv +) + +goto :EOF + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Deployment +:: ---------- + +:Deployment +echo Handling python deployment. + +:: 1. KuduSync +IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" ( + call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_SOURCE%" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd" + IF !ERRORLEVEL! NEQ 0 goto error +) + +IF NOT EXIST "%DEPLOYMENT_TARGET%\requirements.txt" goto postPython +IF EXIST "%DEPLOYMENT_TARGET%\.skipPythonDeployment" goto postPython + +echo Detected requirements.txt. You can skip Python specific steps with a .skipPythonDeployment file. + +:: 2. Select Python version +call :SelectPythonVersion + +pushd "%DEPLOYMENT_TARGET%" + +:: 3. Create virtual environment +IF NOT EXIST "%DEPLOYMENT_TARGET%\env\azure.env.%PYTHON_RUNTIME%.txt" ( + IF EXIST "%DEPLOYMENT_TARGET%\env" ( + echo Deleting incompatible virtual environment. + rmdir /q /s "%DEPLOYMENT_TARGET%\env" + IF !ERRORLEVEL! NEQ 0 goto error + ) + + echo Creating %PYTHON_RUNTIME% virtual environment. + %PYTHON_EXE% -m %PYTHON_ENV_MODULE% env + IF !ERRORLEVEL! NEQ 0 goto error + + copy /y NUL "%DEPLOYMENT_TARGET%\env\azure.env.%PYTHON_RUNTIME%.txt" >NUL +) ELSE ( + echo Found compatible virtual environment. +) + +:: 4. Install packages +echo Upgrade pip package. +env\scripts\python -m pip install pip --upgrade +IF !ERRORLEVEL! NEQ 0 goto error +echo Pip install requirements. +env\scripts\pip install -r requirements.txt + +IF !ERRORLEVEL! NEQ 0 goto error + +REM Add additional package installation here +REM -- Example -- +REM env\scripts\easy_install pytz +REM IF !ERRORLEVEL! NEQ 0 goto error + +:: 5. Copy web.config +IF EXIST "%DEPLOYMENT_SOURCE%\web.%PYTHON_VER%.config" ( + echo Overwriting web.config with web.%PYTHON_VER%.config + copy /y "%DEPLOYMENT_SOURCE%\web.%PYTHON_VER%.config" "%DEPLOYMENT_TARGET%\web.config" +) + +:: 6. Django collectstatic +IF EXIST "%DEPLOYMENT_TARGET%\manage.py" ( + IF EXIST "%DEPLOYMENT_TARGET%\env\lib\site-packages\django" ( + IF NOT EXIST "%DEPLOYMENT_TARGET%\.skipDjango" ( + echo Collecting Django static files. You can skip Django specific steps with a .skipDjango file. + IF NOT EXIST "%DEPLOYMENT_TARGET%\static" ( + MKDIR "%DEPLOYMENT_TARGET%\static" + ) + env\scripts\python manage.py collectstatic --noinput --clear + ) + ) +) + +popd + +:postPython + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +goto end + +:: Execute command routine that will echo out when error +:ExecuteCmd +setlocal +set _CMD_=%* +call %_CMD_% +if "%ERRORLEVEL%" NEQ "0" echo Failed exitCode=%ERRORLEVEL%, command=%_CMD_% +exit /b %ERRORLEVEL% + +:error +endlocal +echo An error has occurred during web site deployment. +call :exitSetErrorLevel +call :exitFromFunction 2>nul + +:exitSetErrorLevel +exit /b 1 + +:exitFromFunction +() + +:end +endlocal +echo Finished successfully.