在gitLab CI YML中获取package.json的值

时间:2017-04-02 07:40:16

标签: node.js yaml gitlab-ci package.json

我正在为我的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

6 个答案:

答案 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