如何使用 gitlab-ci.yml 在 gitlab 中更新 JSON 文件的内容?

Posted

技术标签:

【中文标题】如何使用 gitlab-ci.yml 在 gitlab 中更新 JSON 文件的内容?【英文标题】:How to update content of JSON file in gitlab using gitlab-ci.yml? 【发布时间】:2021-11-13 23:16:45 【问题描述】:

我正在为特定版本的浏览器构建 docker 映像并将其推送到 AWS ecr。 运行 docker push 命令后,我想在 gitlab 的 JSON 文件中更新 status = deployed。 在 push 命令之后,更改状态的命令被 gitlab 跳过。该命令在我的本地机器上运行,但在 gitlab 中被跳过

下面是 gitlab-ci.yml 文件中的脚本

publish-firefox:
  image: 
    name: amazon/aws-cli:2.2.38
    entrypoint: [""]
  services:
    - docker:dind
  before_script:
    - amazon-linux-extras install -y docker
    - aws --version
    - docker --version
    - yum install jq -y
  script:
    - cd /builds/firefox-dockerfile
    - aws ecr get-login-password | docker login --username AWS --password-stdin $DOCKER_REGISTRY_DEV       
    - > 
       jq -c '.[]' firefox-versions.json | while read i; do
          STATUS=$(echo $i | jq -r .STATUS)
          FIREFOX_VERSION=$(echo $i | jq -r .FIREFOX_VERSION)
          GECKODRIVER_VERSION=$(echo $i | jq -r .GECKODRIVER_VERSION)
          if [[ "$STATUS" != "deployed" ]]
          then
              docker build -t $DOCKER_REGISTRY_DEV/$APP_NAME:"$FIREFOX_VERSION" --build-arg FIREFOX_VERSION="$FIREFOX_VERSION" --build-arg GECKODRIVER_VERSION="$GECKODRIVER_VERSION" .
              docker push $DOCKER_REGISTRY_DEV/$APP_NAME:"$FIREFOX_VERSION"
              tmp=$(mktemp)
              cat firefox-versions.json | jq --arg a "$STATUS" '.[].STATUS = "deployed"' firefox-versions.json >"$tmp" && mv "$tmp" firefox-versions.json
          else
              if [[ "$STATUS" = "deployed" ]]; then
                  echo 'Firefox-'"$FIREFOX_VERSION"' is already created and pushed to ECR'
              fi
          fi
      done

JSON 文件 = firefox-versions.json

[
    
        "FIREFOX_VERSION": "79.0b9",
        "GECKODRIVER_VERSION": "0.29.1",
        "STATUS": "deployed"
    ,
    
        "FIREFOX_VERSION": "88.0b8",
        "GECKODRIVER_VERSION": "0.29.1",
        "STATUS": ""
    
]

谁能帮我解决这个问题?

【问题讨论】:

您可能需要展示您的 gitlab 管道配置。 CI镜像上安装jq了吗? 是的,它已安装 您的.gitlab-ci.yml 文件(或您显示的sn-p)无效。脚本部分中的 -> 导致了问题。我不确定这是否应该是命令的一部分,但是要在脚本(或 before_script 和 after_script)部分中运行的命令需要以 - 开头。 script 部分只是一个命令数组,在 yml 中,一个数组用 - 标记。由于该命令没有-,因此它不包含在命令数组中,也不会被执行。 正如我所提到的,直到docker push $DOCKER_REGISTRY_DEV/$APP_NAME:"$FIREFOX_VERSION" 我的代码正在运行。之后它只跳过cat firefox-versions.json | jq --arg a "$STATUS" '.[].STATUS = "deployed"' firefox-versions.json >"$tmp" && mv "$tmp" firefox-versions.json这个命令。因此,脚本部分不是问题 【参考方案1】:

问题已解决: 在cat firefox-versions.json | jq --arg a "$STATUS" '.[].STATUS = "deployed"' firefox-versions.json >"$tmp" && mv "$tmp" firefox-versions.json 命令之后,我添加了 git token 及其命令来提交和推送 json 文件到 GitLab

【讨论】:

以上是关于如何使用 gitlab-ci.yml 在 gitlab 中更新 JSON 文件的内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 gitlab-runner 从指定文件中读取而不是 .gitlab-ci.yml?

如何使用 gitlab-ci.yml 在 gitlab 中更新 JSON 文件的内容?

如何将存储库中的文件复制到用于作业的 Docker 容器中,在 gitlab-ci.yml

如何在 gitlab-ci.yml 中使用带有 SonarQube.Scanner.MSBuild.exe 的 Gitlab 变量

如何创建一个工件,以便它可以在 .gitlab-ci.yml 中下载

如何排除 gitlab-ci.yml 更改触发作业