выполнение миграций как часть конвейера выпуска службы приложений MS Azure для веб-приложения Django

Мне интересно, есть ли у кого-нибудь опыт интеграции команды python manage.py migrate в конвейер выпуска MS Azure. Приложение развертывается с использованием конвейера CI / CD через DevOps. В части конвейера выпуска приложение развертывается на трех разных этапах (разработка, тестирование и продвижение). Мне не удалось интегрировать команду migrate в процесс развертывания. Я попытался добиться этого с помощью встроенного скрипта после развертывания:

/antenv/bin/python /home/site/wwwroot/manage.py collectstatic
/antenv/bin/python /home/site/wwwroot/manage.py migrate

Если я запускаю вышеуказанные команды в среде песочницы через SSH, они выполняются успешно. Однако включение их в конвейер выпуска в качестве сценария после развертывания вызывает следующую ошибку:

2020-03-22T19:00:32.8641689Z Standard error from script: 
2020-03-22T19:00:32.8727872Z ##[error]/home/site/VSTS_PostDeployment_1321584903618191/kuduPostDeploymentScript.sh: 1: /home/site/VSTS_PostDeployment_1321584903618191/kuduPostDeploymentScript.sh: /antenv/bin/python: not found
/home/site/VSTS_PostDeployment_1321584903618191/kuduPostDeploymentScript.sh: 2: /home/site/VSTS_PostDeployment_1321584903618191/kuduPostDeploymentScript.sh: /antenv/bin/python: not found

2020-03-22T19:01:34.3372528Z ##[error]Error: Unable to run the script on Kudu Service. Error: Error: Executed script returned '127' as return code. Error: /home/site/VSTS_PostDeployment_1321584903618191/kuduPostDeploymentScript.sh: 1: /home/site/VSTS_PostDeployment_1321584903618191/kuduPostDeploymentScript.sh: /antenv/bin/python: not found
/home/site/VSTS_PostDeployment_1321584903618191/kuduPostDeploymentScript.sh: 2: /home/site/VSTS_PostDeployment_1321584903618191/kuduPostDeploymentScript.sh: /antenv/bin/python: not found

Я также попытался запустить приведенный выше встроенный скрипт как:

manage.py collectstatic
manage.py migrate

Но безрезультатно.

На основании документации Oryx кажется, что manage.py collectstatic выполняется, но не manage.py migrate

Будем очень признательны за любые идеи или предложения! Заранее спасибо.


person davjfish    schedule 23.03.2020    source источник


Ответы (2)


Поскольку мы хотим иметь возможность использовать инфраструктуру конвейера выпуска в Azure DevOps, мы не можем использовать startUpCommand: python3.6 manage.py migrate, потому что в DevOps нет файла YAML, связанного с выпуском (по крайней мере, пока). Вместо этого в итоге сработало:

  1. Создание файла сценария в репозитории проекта. Я назвал файл Procfile.sh. В этот файл я добавил следующие две строки кода:
python manage.py migrate
python manage.py collectstatic --no-input
  1. Добавьте новую переменную в конфигурацию веб-приложения, которая указывает на этот файл:
 {
    "name": "POST_BUILD_SCRIPT_PATH",
    "slotSetting": false,
    "value": "Procfile.sh"
  }

Если вы запускаете команду collectstatic в своем скрипте, вы также захотите запретить движку Oryx запускать его:

{
    "name": "DISABLE_COLLECTSTATIC",
    "slotSetting": false,
    "value": "true"
  },

Дополнительные сведения см. В документации Oryx.

person davjfish    schedule 27.03.2020

При использовании Django вы обычно хотите перенести модели данных с помощью manage.py migrate после развертывания кода приложения. Для этой цели вы можете добавить startUpCommand с помощью сценария после развертывания:

startUpCommand:  python3.6 manage.py migrate

Подробнее см. В официальный документ.

person Hugh Lin    schedule 24.03.2020
comment
Спасибо за ваш ответ. Я попробовал то, что было предложено выше, и получил следующие ошибки в выводе журнала: 2020-03-24T11:46:54.0274181Z ##[error]Error: Unable to run the script on Kudu Service. Error: Error: Executed script returned '127' as return code. Error: /home/site/VSTS_PostDeployment_1401585050340838/kuduPostDeploymentScript.sh: 1: /home/site/VSTS_PostDeployment_1401585050340838/kuduPostDeploymentScript.sh: startUpCommand:: Permission denied - person davjfish; 24.03.2020
comment
Вы можете попробовать использовать chmod, чтобы предоставить скрипту разрешения на выполнение в качестве обходного пути. См. Этот документ и аналогичный case. - person Hugh Lin; 26.03.2020