Передача значений между заданиями и этапами
В настоящее время 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 элементы потенциально могут занимать несколько строк.
Существует по крайней мере несколько вариантов, примеры :
- Использовать 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)")