Проверьте обязательное условие "нет незавершенных изменений" при развертывании в GCloud с PyBuilder

Я пытаюсь написать задачу deploy образ Docker для Kubernetes, который проверяет наличие предварительных условий (таких как наличие docker, gcloud и git) и отсутствия незафиксированных изменений.

Вот что я собрал до сих пор:

@task("deploy", description="Deploy the Docker image to Kubernetis")
@depends("build")
def deploy(project, logger):
    assert_can_execute(['docker', '-v'], 'docker', 'deploy')
    assert_can_execute(['gcloud', '-v'], 'gcloud', 'deploy')
    assert_can_execute(['git', '-version'], 'git', 'deploy')
    assert_can_execute(['zsh',
        'if [[ ! -z $(git diff --stat) ]] || [[ ! -z $(git diff --stat --cached) ]]; then return 127; else return 0; fi'
    ], 'no uncommitted changes', 'deploy')

    logger.info("Deploying Docker image '{0}'".format(project.name))
    subprocess.check_output(
        'docker build -t <remote>/{0}-service:latest .'.format(project.name), shell=True)
    subprocess.check_output(
        'gcloud docker -- push <remote>/{0}-service:latest'.format(project.name), shell=True)

Задача на самом деле разворачивается правильно, но я не смог проверить, нет ли незафиксированных изменений для работы... Я не смог найти достаточно документации о assert_can_execute... Кто-нибудь может помочь?

Инкриминируемое утверждение следующее:

    assert_can_execute(['zsh',
        'if [[ ! -z $(git diff --stat) ]] || [[ ! -z $(git diff --stat --cached) ]]; then return 127; else return 0; fi'
    ], 'no uncommitted changes', 'deploy')

Обратите внимание, что если я запускаю код на консоли, я правильно получаю уровень ошибки 0, если нет незафиксированных изменений и 127 в противном случае... Где я ошибаюсь?

Заранее спасибо!

1 ответ

Решение

Покопавшись немного больше в PyBuilder"s utils а также subprocessЯ закончил с этим решением:

assert_can_execute(['git', '-version'], 'git', 'deploy')
logger.info("Deploying Docker image '{0}'".format(project.name))
if subprocess.check_output('git status --show-stash --short', shell=True):
    raise MissingPrerequisiteException('for uncommitted changes', 'deploy')

Более подробно я сначала проверяю наличие git в командной строке. Затем я уведомляю, что развертывание начинается. В конце концов я бегу git status --show-stash --short которые возвращаются в списке текущих изменений в репо (включая тайник - не забудьте добавить target/* на ваш .gitignore файл). Если список не пустой, я поднимаю MissingPrerequisiteException остановить выполнение задачи, которое гласит "Отсутствует предварительное условие для незафиксированных изменений, необходимых для развертывания".

Вся задача теперь выглядит следующим образом:

@task("deploy", description="Deploy the Docker image to Kubernetis")
@depends("build")
def deploy(project, logger):
    assert_can_execute(['docker', '-v'], 'docker', 'deploy')
    assert_can_execute(['gcloud', '-v'], 'gcloud', 'deploy')
    assert_can_execute(['git', '-version'], 'git', 'deploy')
    logger.info("Deploying Docker image '{0}'".format(project.name))
    if subprocess.check_output('git status --show-stash --short', shell=True):
        raise MissingPrerequisiteException('for uncommitted changes', 'deploy')
    subprocess.check_output(
        'docker build -t <remote>/{0}-service:latest .'.format(project.name), shell=True)
    subprocess.check_output(
        'gcloud docker -- push <remote>/{0}-service:latest'.format(project.name), shell=True)

где <remote> является адресом хоста Kubernetes. Надеюсь, поможет!

Другие вопросы по тегам