使用 PyBuilder 部署到 GCloud 时检查先决条件 "no uncommitted changes"

Check for prerequisite "no uncommitted changes" when deploying to GCloud with 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...我哪里错了?

提前致谢!

在深入研究 PyBuilderutilssubprocess 之后,我得到了这个解决方案:

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 which return 在 repo 中的当前更改列表中(包括隐藏——记得将 target/* 添加到你的 .gitignore 文件中) .如果列表不为空,我会提出一个 MissingPrerequisiteException 来停止读取 "Missing prerequisite for uncommitted changes required by deploy".

的任务执行

整个任务现在如下所示:

@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 主机地址。希望对您有所帮助!