在 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