【问题标题】:Upload jest code coverage results to codecov during google cloud build在谷歌云构建期间将笑话代码覆盖率结果上传到 codecov
【发布时间】:2020-04-07 09:03:29
【问题描述】:

我正试图弄清楚如何将我的笑话代码覆盖率报告上传到 codecov。 从那里documentation

bash <(curl -s https://codecov.io/bash) -t token

所以我尝试使用以下cloudbuild.yaml从云构建步骤运行 bash 脚本

steps:
  - name: node:10.15.1
    entrypoint: npm
    args: ["install"]
  - name: node:10.15.1
    entrypoint: npm
    args: ["test", "--", "--coverage"]
  - name: 'gcr.io/cloud-builders/curl'
    entrypoint: bash
    args: ['<(curl -s https://codecov.io/bash)', '-t', '$_CODECOV_TOKEN']
  - name: node:10.15.1
    entrypoint: npm
    args: ["run", "build:production"]

我收到以下错误:

Step #2: bash: <(curl -s https://codecov.io/bash): No such file or directory

显然是因为 &lt;(curl -s https://codecov.io/bash) 在我希望它被执行时被解释为字符串。

编辑:

我已将构建步骤更改为以下内容:

  - name: "gcr.io/cloud-builders/curl"
    entrypoint: bash
    args: ["./scripts/codecov-upload.bash", "$_CODECOV_TOKEN"]

并添加了一个文件codecov-upload.bash

bash <(curl -s https://codecov.io/bash) -t $1

运行我的云构建时,codecov bash 上传器成功启动。但是,我无法将报告上传到 clodecov。

这是来自 codecov bash 上传器的日志:

Step #2: Test Suites: 1 passed, 1 total
Step #2: Tests:       1 passed, 1 total
Step #2: Snapshots:   1 passed, 1 total
Step #2: Time:        28.981s
Step #2: Ran all test suites.
Finished Step #2
Starting Step #3
Step #3: Already have image (with digest): gcr.io/cloud-builders/curl
Step #3: /dev/fd/63: option requires an argument -- t
Step #3: 
Step #3:   _____          _
Step #3:  / ____|        | |
Step #3: | |     ___   __| | ___  ___ _____   __
Step #3: | |    / _ \ / _` |/ _ \/ __/ _ \ \ / /
Step #3: | |___| (_) | (_| |  __/ (_| (_) \ V /
Step #3:  \_____\___/ \__,_|\___|\___\___/ \_/
Step #3:                               Bash-tbd
Step #3: 
Step #3: 
Step #3: x> No CI provider detected.
Step #3:     Testing inside Docker? http://docs.codecov.io/docs/testing-with-docker
Step #3:     Testing with Tox? https://docs.codecov.io/docs/python#section-testing-with-tox
Step #3:     project root: .
Step #3: /dev/fd/63: line 897: git: command not found
Step #3: /dev/fd/63: line 897: hg: command not found
Step #3:     Yaml not found, that's ok! Learn more at http://docs.codecov.io/docs/codecov-yaml
Step #3: ==> Running gcov in . (disable via -X gcov)
Step #3: ==> Python coveragepy not found
Step #3: ==> Searching for coverage reports in:
Step #3:     + .
Step #3:     -> Found 3 reports
Step #3: ==> Detecting git/mercurial file structure
Step #3: ==> Reading reports
Step #3:     + ./coverage/clover.xml bytes=163786
Step #3:     + ./coverage/coverage-final.json bytes=444241
Step #3:     + ./coverage/lcov.info bytes=71582
Step #3: ==> Appending adjustments
Step #3:     http://docs.codecov.io/docs/fixing-reports
Step #3:     + Found adjustments
Step #3: ==> Gzipping contents
Step #3: ==> Uploading reports
Step #3:     url: https://codecov.io
Step #3:     query: branch=&commit=&build=&build_url=&name=&tag=&slug=&service=&flags=&pr=&job=
Step #3:     -> Pinging Codecov
Step #3: https://codecov.io/upload/v4?package=bash-tbd&token=secret&branch=&commit=&build=&build_url=&name=&tag=&slug=&service=&flags=&pr=&job=
Step #3:     -> Uploading
Step #3:     X> Failed to upload
Step #3:     -> Sleeping for 30s and trying again...
Step #3:     -> Pinging Codecov
Step #3: https://codecov.io/upload/v4?package=bash-tbd&token=secret&branch=&commit=&build=&build_url=&name=&tag=&slug=&service=&flags=&pr=&job=
Step #3:     -> Uploading
Step #3:     X> Failed to upload
Step #3:     -> Sleeping for 30s and trying again...
Step #3:     -> Pinging Codecov
Step #3: https://codecov.io/upload/v4?package=bash-tbd&token=secret&branch=&commit=&build=&build_url=&name=&tag=&slug=&service=&flags=&pr=&job=
Step #3:     -> Uploading
Step #3:     X> Failed to upload
Step #3:     -> Sleeping for 30s and trying again...
Step #3:     -> Pinging Codecov
Step #3: https://codecov.io/upload/v4?package=bash-tbd&token=secret&branch=&commit=&build=&build_url=&name=&tag=&slug=&service=&flags=&pr=&job=
Step #3:     -> Uploading
Step #3:     X> Failed to upload
Step #3:     -> Sleeping for 30s and trying again...
Step #3:     -> Uploading to Codecov
Step #3:     HTTP 400
Step #3: missing required properties: [&#39;commit&#39;]
Finished Step #3
Starting Step #4
Step #4: Already have image: node:10.15.1
Step #4: 

我注意到日志中有两件事:

1. Step #3: /dev/fd/63: option requires an argument -- t
2. Step #3: missing required properties: [&#39;commit&#39;]

在搜索修复数字 2 时,我在 SO 上找到以下内容: codecov.io gives error in combination with Bitbucket pipelines

答案似乎是我的容器中没有安装 git。

所以我尝试使用 docker 制作自定义容器映像:

Dockerfile:

FROM gcr.io/cloud-builders/curl
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y git

所以我构建了图像:

build -t "gcr.io/[PROJECT_ID]/builder .

并更新我的构建步骤以使用此图像:

  • 名称:“gcr.io/$PROJECT_ID/builder” 入口点:bash 参数:["./scripts/codecov-upload.bash"]

但是使用使用该 dockerfile 创建的图像会返回相同的错误。

也许该自定义映像的 Dockerfile 不正确?还是我错过了其他东西?

我的代码在 github 上可用:https://github.com/thdk/timesheets/tree/feat/112-1

【问题讨论】:

    标签: docker jestjs yaml code-coverage google-cloud-build


    【解决方案1】:

    answer from Ajordatan answer on the community of codecov 和查看source code of the codecov batch uploader 之后,我发现 bash 上传器需要一些环境变量才能工作。

    我已更改cloudbuild.yaml 中的构建步骤以包含环境变量。这些值包含在default substition variables from google cloud build 中。

    - name: 'gcr.io/cloud-builders/curl'
      entrypoint: bash
      args: ['-c', 'bash <(curl -s https://codecov.io/bash)']
      env:
      - 'VCS_COMMIT_ID=$COMMIT_SHA'
      - 'VCS_BRANCH_NAME=$BRANCH_NAME'
      - 'VCS_PULL_REQUEST=$_PR_NUMBER'
      - 'CI_BUILD_ID=$BUILD_ID'
      - 'CODECOV_TOKEN=$_CODECOV_TOKEN' # _CODECOV_TOKEN is user user substituion variable specified in my cloud build trigger
    

    这似乎有效,除了来自 bash 上传者的警告:

    Step #3: /dev/fd/63: line 897: git: command not found
    Step #3: /dev/fd/63: line 897: hg: command not found
    

    所以我不得不从 curl 镜像开始使用我自己的构建镜像并添加 git。

    Dockerfile:

    FROM gcr.io/cloud-builders/curl
    RUN apt-get update && \
        apt-get upgrade -y && \
        apt-get install -y git
    

    并构建图像:

    docker build -t "gcr.io/[PROJECT_ID]/builder .
    

    所以我最终的cloudbuild.yaml 文件是:

    steps:
      - name: node:10.15.1
        entrypoint: npm
        args: ["install"]
      - name: node:10.15.1
        entrypoint: npm
        args: ["test", "--", "--coverage"]      
      - name: node:10.15.1
        entrypoint: npm
        args: ["run", "build:production"]
      - name: "gcr.io/$PROJECT_ID/builder"
        entrypoint: bash
        args: ['-c', 'bash <(curl -s https://codecov.io/bash)']
        env:
        - 'VCS_COMMIT_ID=$COMMIT_SHA'
        - 'VCS_BRANCH_NAME=$BRANCH_NAME'
        - 'VCS_PULL_REQUEST=$_PR_NUMBER'
        - 'CI_BUILD_ID=$BUILD_ID'
        - 'CODECOV_TOKEN=$_CODECOV_TOKEN'
    

    【讨论】:

    • 这是一个了不起且有用的答案。它肯定会对其他人有所帮助,别忘了在问题创建 48 小时后接受它!
    【解决方案2】:

    正如previous question 的回答中所说,命令不是在shell 中执行的,因此管道和重定向等操作不可用。

    this accepted answer 中有一个示例说明如何使用重定向。适应您的需求,我认为应该是这样的:

    - name: 'gcr.io/cloud-builders/curl'
      entrypoint: bash
      args: ['-c', 'bash <(curl -s https://codecov.io/bash) -t $_CODECOV_TOKEN']
    

    我不确定您是否能够从那里检索$_CODECOV_TOKEN,但您应该尝试一下。

    关于您的第二次尝试,错误 /dev/fd/63: option requires an argument -- t 提示我未检索到 $_CODECOV_TOKEN 中的值,因此它抱怨参数 -t 中缺少值。无论如何,在这种情况下,我觉得 /dev/fd/63it isn't executable 以来一直抱怨这一点很奇怪。

    也许一个可行的解决方法是将文件下载到您的存储库并从那里执行它。我知道这样下载的脚本不会在每次部署时都是最新的,但它会起作用。

    【讨论】:

    • 感谢您的回复,我会尽快尝试。 $_CODECOV_TOKEN 是从我在谷歌云构建中的构建触发器设置注入的替换变量。
    • 在您编写脚本时运行脚本有效,但是,我遇到了与使用自己的 codecov-upload.bash 脚本时相同的错误。我想我现在已经想通了,我已经尝试在下面撰写我的答案的所有信息。
    猜你喜欢
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多