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

tquggr8v  于 2023-02-18  发布在  Node.js
关注(0)|答案(7)|浏览(209)

我在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
j13ufse2

j13ufse21#

我认为从package.json检索version的最简单方法是使用node本身。

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=标志并将表达式 Package 在console.log(...)中。

rggaifut

rggaifut2#

如果你不反对安装额外的软件包,你可以使用jq,它允许更多的灵活性(在Ubuntu和Alpine的仓库中都有).一旦你安装了它(例如Ubuntu上的apt-get update && apt-get install -yqq jq):

- export VERSION=$(jq -r .version package.json)
- cd /opt/core/bundle && docker build -t $CI_REGISTRY_IMAGE:$VERSION .
- docker push $CI_REGISTRY_IMAGE:$VERSION
6vl6ewon

6vl6ewon3#

变量:

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" `
o3imoua4

o3imoua44#

仅仅在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

然后在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

to94eoyn

to94eoyn5#

你可以使用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
xzabzqsa

xzabzqsa6#

您可以使用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
exdqitrt

exdqitrt7#

也许这会对其他人有用,我用grep做了这件事:

export PACKAGE_VERSION=$(grep -Po '(?<="version".{1} )"[0-9\.]+"' package.json | sed 's/\"//g')

相关问题