在 gitLab CI YML 中获取 package.json 的值
Get value of package.json in gitLab CI YML
我正在为我的 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
不幸的是,您可能无法仅在 gitlab.yml
中执行此操作,您可以按如下方式创建 shell 脚本并将其签入源代码管理
#!/bin/sh
args=("$@")
CI_REGISTRY_IMAGE=${args[0]}
PACKAGE_VERSION=$(cat package.json \
| grep version \
| head -1 \
| awk -F: '{ print }' \
| 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
然后用gitlab.yml
中的$CI_REGISTRY_IMAGE
参数执行这个脚本
# ...
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
如果您不反对安装额外的包,您可以使用 jq
,它允许更多的灵活性(在 Ubuntu 和 Alpine 的存储库中可用)。
安装后(例如 apt-get update && apt-get install -yqq jq
on Ubuntu):
- export VERSION=$(jq -r .version package.json)
- cd /opt/core/bundle && docker build -t $CI_REGISTRY_IMAGE:$VERSION .
- docker push $CI_REGISTRY_IMAGE:$VERSION
变量:
PACKAGE_VERSION: $(cat package.json | grep version | head -1 | awk -F= "{ print }" | 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" `
您可以使用 docker 获取 package.json 版本。在此示例中,我们使用 "latest" 和 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
我认为从 package.json
中检索 version
的最简单方法是使用节点本身。
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
-p
/--print
标志表示计算表达式并打印结果。它在功能上等同于使用 -e
/--eval=
标志并将表达式包装在 console.log(...)
.
中
您可以使用 YAML 锚点功能来设置可在作业脚本中使用的变量。
.get_version: &get_version
- "export SERVICE_VERSION=$(cat package.json | grep version | head -1 | awk -F: '{ print }' | 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
我正在为我的 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
不幸的是,您可能无法仅在 gitlab.yml
中执行此操作,您可以按如下方式创建 shell 脚本并将其签入源代码管理
#!/bin/sh
args=("$@")
CI_REGISTRY_IMAGE=${args[0]}
PACKAGE_VERSION=$(cat package.json \
| grep version \
| head -1 \
| awk -F: '{ print }' \
| 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
然后用gitlab.yml
$CI_REGISTRY_IMAGE
参数执行这个脚本
# ...
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
如果您不反对安装额外的包,您可以使用 jq
,它允许更多的灵活性(在 Ubuntu 和 Alpine 的存储库中可用)。
安装后(例如 apt-get update && apt-get install -yqq jq
on Ubuntu):
- export VERSION=$(jq -r .version package.json)
- cd /opt/core/bundle && docker build -t $CI_REGISTRY_IMAGE:$VERSION .
- docker push $CI_REGISTRY_IMAGE:$VERSION
变量:
PACKAGE_VERSION: $(cat package.json | grep version | head -1 | awk -F= "{ print }" | 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" `
您可以使用 docker 获取 package.json 版本。在此示例中,我们使用 "latest" 和 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
我认为从 package.json
中检索 version
的最简单方法是使用节点本身。
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
-p
/--print
标志表示计算表达式并打印结果。它在功能上等同于使用 -e
/--eval=
标志并将表达式包装在 console.log(...)
.
您可以使用 YAML 锚点功能来设置可在作业脚本中使用的变量。
.get_version: &get_version
- "export SERVICE_VERSION=$(cat package.json | grep version | head -1 | awk -F: '{ print }' | 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