динамически устанавливать глобальные переменные в gitlab-ci - PullRequest
1 голос
/ 13 марта 2020

Я хочу установить некоторые переменные, получая значения из файла pom. xml. Эти переменные должны быть глобальными, потому что они будут использоваться на нескольких этапах и заданиях.

Согласно документации gitlab-ci, я могу устанавливать глобальные переменные двумя различными способами:

  1. с использованием оператора переменной:

    variable:  
     pom_artifactID: $(grep -m1 '<artifactId>' pom.xml | cut -d '<' -f2  |cut -d '>' -f2)
    
  2. Использование сценария "before":

     before_script:
       - pom_artifactID=$(grep -m1 '<artifactId>' pom.xml | cut -d '<' -f2  |cut -d '>' -f2)
       - pom_artifactVersion=$(grep -m1 '<version>' pom.xml | cut -d '<' -f2  |cut -d '>' -f2)
       - pom_packaging=$(grep -m1 '<packaging>' pom.xml | cut -d '<' -f2  |cut -d '>' -f2)
       - pom_finalName=$({ grep -m1 '<finalName>' pom.xml |  cut -d '<' -f2 | cut -d '>' -f2; [ ${PIPESTATUS[0]} -eq 0 ] && true || echo ${pom_artifactID}-${pom_artifactVersion}.$pom_packaging}; })
    

Первый не работать, потому что gitlab-ci не оценивает $ (command), поэтому pom_artifactID становится литералом "$ (grep -m1 '' pom. xml | cut -d '<' -f2 | cut -d '>' -f2) "

Второй также не работает, потому что" before_script "использует команду" grep ", а некоторые docker образы, используемые в моем конвейере, имеют старую версию grep.

Есть еще один способ установить глобальные переменные для передачи переменных между этапами и заданиями?

1 Ответ

1 голос
/ 13 марта 2020

Передача значений между заданиями и этапами

В настоящее время GitLab не может передавать переменную среды между этапами или заданиями.
Но есть запрос для этого: https://gitlab.com/gitlab-org/gitlab/-/issues/22638

Текущий обходной путь - использовать артефакты - в основном передавать файлы.
У нас был похожий вариант использования - получить Java версию приложения из pom.xml и передать ее на различные задания позже в конвейере.

Как мы это сделали в .gitlab-ci.yml:

stages:
  - prepare
  - package

variables:
  VARIABLES_FILE: ./variables.txt  # "." is required for image that have sh not bash

get-version:
  stage: build
  script:
    - APP_VERSION=...
    - echo "export APP_VERSION=$APP_VERSION" > $VARIABLES_FILE
  artifacts:
    paths:
      - $VARIABLES_FILE
package:
  stage: package
  script:
    - source $VARIABLES_FILE
    - echo "Use env var APP_VERSION here as you like ..."


Извлечение значений из pom.xml

Кстати, лучше обрабатывать xml.pom как XML для извлечения значений из pom.xml, а не из простого grep, потому что XML элементы потенциально могут занимать несколько строк.

Существует по крайней мере несколько вариантов, примеры :

  1. Использовать XPath в xmllint инструменте от libxml2-utils
get-version:
  image: ubuntu
  script:
    - apt-get update
    - apt-get install -y libxml2-utils
    - APP_VERSION=`xmllint --xpath '/*[local-name()="project"]/*[local-name()="version"]/text()' $POM_FILE`
Использование python xml обработка
get-version:
  image: python3
  script:
    - APP_VERSION=$(python3 -c "import xml.etree.ElementTree as ET; print(ET.parse(open('pom.xml')).getroot().find('{http://maven.apache.org/POM/4.0.0}version').text)")
...