首页 > 解决方案 > GITLAB-CI:仅当 pom 版本是快照或其 git 标签时才部署到 DEV

问题描述

我正在使用 gitlab 管道将 maven 构建的 WAR 文件部署到 tomcat。

仅当版本是快照或提交是 git 标签时,我才想部署到 DEV。我尝试过使用规则并且只有/除外

我现在有这个:

Deploy to DEV:
    rules:
        - if: $CI_COMMIT_TAG
    environment:
        name: DEV
        on_stop: Undeploy from DEV
    variables:
        GIT_STRATEGY: none

这种工作,它仅在标签已提交时才部署的部分。但是我如何确保它是一个快照呢?

标签: mavengitlabgitlab-ci

解决方案


正如文档中所写,主要困难是:

在创建管道之前对提供的每个表达式进行评估。

所以我认为我们不能使用WAR_VERSION环境变量来创建(或不创建)“部署到 DEV”作业的管道。所以一个可能的解决方法可能是这样的:

.xmllint:
  image: "registry.gitlab.com/ebaque/spring-sample/alpine-xmllint:latest"

Deploy to DEV:
  stage: deploy
  extends: .xmllint
  script: 
    - WAR_VERSION=$(cat pom.xml | sed '2 s/xmlns=".*"//g' | xmllint --xpath 'string(//project/version)' -)
    - if ! [[ $WAR_VERSION =~ .*SNAPSHOT ]] || [[ -z $CI_COMMIT_TAG ]]; then exit 0; fi
    - ...

我们可以利用xmllint来解析pom.xml文件并获取version值。然后我们可以使用正则表达式来检查这个字符串是否SNAPSHOT在其中。xmllint没有使用 中的命名空间pom.xml,所以我必须在解析文件之前去掉它的值。

如果没有(或者如果这不是 a $CI_COMMIT_TAG),那么我们退出作业,或者我们显示一条消息,以便部署不会静默失败(此时由您决定)。这不是很好,因为工作总是被创造出来的,但这是一种实现方式。

仅供参考,这里是我为示例中使用的图像编写的 Dockerfile:

FROM alpine:latest

RUN apk add --no-cache libxml2 libxml2-utils bash

我在这里唯一没有测试的是|| [[ $CI_COMMIT_TAG ]],因此您可能需要修复这部分if语句。


推荐阅读