我正在为我的nodejs应用程序使用gitLab CI。在我的YML文件中,我需要调用脚本来构建一个docker镜像。但是我没有使用latest
,而是需要使用项目的当前版本。
可以在存储库的package.json
文件中找到此版本值。
是否可以读取package.json文件的版本值以用当前版本替换latest
?
# ...
variables:
CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE:latest # need version value instead of latest
build:
stage: build
script:
# ...
- cd /opt/core/bundle && docker build -t $CONTAINER_RELEASE_IMAGE .
- docker push $CONTAINER_RELEASE_IMAGE
答案 0 :(得分:10)
我认为从version
中检索package.json
的最简单方法是使用节点本身。
build:
stage: build
script:
- export VERSION=$(node -p "require('./package.json').version")
- export CONTAINER_RELEASE_IMAGE=$CI_REGISTRY_IMAGE:$VERSION
- cd /opt/core/bundle && docker build -t $CONTAINER_RELEASE_IMAGE .
- docker push $CONTAINER_RELEASE_IMAGE
答案 1 :(得分:8)
如果您不反对安装其他软件包,可以使用jq
,这样可以提供更大的灵活性(在Ubuntu和Alpine的存储库中都可用)。
一旦你安装它(例如在Ubuntu上的apt-get update && apt-get install -yqq jq
):
- export VERSION=$(cat package.json | jq -r .version)
- cd /opt/core/bundle && docker build -t $CI_REGISTRY_IMAGE:$VERSION .
- docker push $CI_REGISTRY_IMAGE:$VERSION
答案 2 :(得分:2)
您可能无法在gitlab.yml
中完全执行此操作,遗憾的是,您可以按如下方式创建一个shell脚本并将其检入源代码控制
#!/bin/sh
args=("$@")
CI_REGISTRY_IMAGE=${args[0]}
PACKAGE_VERSION=$(cat package.json \
| grep version \
| head -1 \
| awk -F: '{ print $2 }' \
| sed 's/[",]//g' \
| tr -d '[[:space:]]')
CONTAINER_RELEASE_IMAGE=$CI_REGISTRY_IMAGE\:$PACKAGE_VERSION
cd /opt/core/bundle && docker build -t $CONTAINER_RELEASE_IMAGE .
docker push $CONTAINER_RELEASE_IMAGE
然后在$CI_REGISTRY_IMAGE
gitlab.yml
参数执行此脚本
# ...
build:
stage: build
script:
# ...
- chmod +x script.sh
- ./script.sh $CI_REGISTRY_IMAGE
据我所知,这应该适合你。
Thank you to DarrenN and dbaba on Github for his package.json version extract shell function
答案 3 :(得分:1)
变量:
PACKAGE_VERSION: $(cat package.json | grep version | head -1 | awk -F= "{ print $2 }" | sed 's/[version:,\",]//g' | tr -d '[[:space:]]') `
在你的工作或模板中
.package-template: &package_template
image: docker-hub.registry.integ.fr.auchan.com/docker:latest
stage: package
tags:
- stocks
script:
- export VERSION= ``eval $PACKAGE_VERSION``
- echo "======> Getting VERSION: $VERSION" `
答案 4 :(得分:1)
您可以使用docker获取package.json版本。在此示例中,我们标记并推送了“最新”和package.json版本:
.gitlab-ci.yml
docker-build-master:
# Official docker image.
image: docker:latest
stage: build
services:
- docker:dind
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
script:
- export VERSION=$(docker run --rm -v "$PWD":/app:ro -w /app node:slim node -p "require('./package.json').version")
- docker build --pull -t "$CI_REGISTRY_IMAGE" .
- docker push "$CI_REGISTRY_IMAGE:latest"
- docker image tag "$CI_REGISTRY_IMAGE:latest" "$CI_REGISTRY_IMAGE:$VERSION"
- docker push "$CI_REGISTRY_IMAGE:$VERSION"
only:
- master
答案 5 :(得分:1)
您可以使用YAML锚点功能来设置可以在作业脚本中使用的变量。
.get_version: &get_version
- "export SERVICE_VERSION=$(cat package.json | grep version | head -1 | awk -F: '{ print $2 }' | sed 's/[\",]//g' | tr -d '[[:space:]]')"
- "Current version is: $SERVICE_VERSION"
,然后在脚本部分的某个位置:
.gitlab-ci.yml
:
variables:
CONTAINER_NAME: myService
script:
- echo "My own script"
- *get_version
- docker build --iidfile imageid.txt --cache-from $CONTAINER_NAME:$SERVICE_VERSION -t $CONTAINER_NAME:$SERVICE_VERSION .
- docker push $CONTAINER_NAME:$SERVICE_VERSION