如何在 Bitbucket-Pipelines 中保存工件

Posted

技术标签:

【中文标题】如何在 Bitbucket-Pipelines 中保存工件【英文标题】:How to save artifacts in Bitbucket-Pipelines 【发布时间】:2018-03-22 15:38:32 【问题描述】:

我是竹子新手。我尝试做的是收集在构建过程中创建的所有.dacpac 文件。

image: microsoft/dotnet:latest
pipelines:
 default: 
 - step: 
 script: # Modify the commands below to build your repository. 
 - cd BackgroundCode 
 - dotnet restore 
 - dotnet run 
 artifacts: 
 - '../**/*.dacpac'

目录结构是

'agent/build/Projects/[Projectname]/[Projectname].dacpac'.

管道的输出说

成功生成 zip 存档 /opt/atlassian/pipelines/agent/build/Projects/[ProjectName]/[ProjectName].dacpac

这意味着在构建过程中确实会生成文件。 我做错了什么吗?如果没有,我在哪里可以找到这些文物。

【问题讨论】:

【参考方案1】:

不幸的是,根据文档,管道运行后所有工件都将被删除:

https://confluence.atlassian.com/bitbucket/using-artifacts-in-steps-935389074.html

“一旦管道完成,无论是成功还是失败, 工件被删除。”

但是,您可以将工件部署到 Bitbucket 下载部分或其他任何地方:

https://confluence.atlassian.com/bitbucket/deploy-build-artifacts-to-bitbucket-downloads-872124574.html

- step:
    name: Archive
    script:
      - curl -X POST --user "$BB_AUTH_STRING" "https://api.bitbucket.org/2.0/repositories/$BITBUCKET_REPO_OWNER/$BITBUCKET_REPO_SLUG/downloads" --form files=@"something/**"

【讨论】:

【参考方案2】:

在 bitbucket-pipelines.yml 中,每当您进入不同的“step:”时,它都会重置几乎所有内容并独立于上一步。这并不总是显而易见的,而且可能会令人困惑。

在上一步中,您使用cd BackgroundCode 移入了一个子文件夹。 当脚本进行到“artifacts:”步骤时,当前工作目录将重置回原来的$BITBUCKET_CLONE_DIR。因此,您需要在每个步骤中再次cd BackgroundCode 或使用relative to the $BITBUCKET_CLONE_DIR 的路径,如下所示:

artifacts:
 - BackgroundCode/**/*.dacpac

step2:
 - cd BackgroundCode
 # List the files relative to the 'BackgroundCode' directory
 - find . -iname '*.dacpac'

这将自动保存工件(保存 7 天),您可以在顶部的“工件”标签中看到它。

【讨论】:

【参考方案3】:

我认为一个不错的选择是使用前面提到的 bitbuckets 下载部分,但是您可以使用他们的专用工具而不是使用 curl,并且跳跃 API 不会改变和破坏您的管道。

https://support.atlassian.com/bitbucket-cloud/docs/deploy-build-artifacts-to-bitbucket-downloads/

与 curl 相比,我认为它更安全、更易于设置和更易于维护。例如,链接文档显示该工具的 0.1.2 版本,而最新的是 0.3.2,它只要求我更新该版本号,而无需其他任何东西来保持最新。我必须使用对我的存储库的写访问权限设置应用程序权限密钥,将其设置为管道变量,将我的帐户名称设置为管道变量(链接的文档描述得很好),然后在我的管道 yaml 文件中添加一个简单的步骤。我能想到的一个缺点是,对于更大的文件,curl 可能会更好。所以把它当作另一种做事的方式,而不是做所有事情的终极方式。

我的示例 yaml,您使用一些容器来构建源代码,它,您定义了 Makefile 构建步骤,然后我重命名我的输出工件文件并后缀构建 ID(这样我的下载中将有多个输出文件部分,而不仅仅是最新的)。然后我将通过在构建步骤中添加工件来确保下一步可以访问这些工件:

神器:

构建/输出-*.zip

然后最后一个部署步骤将可以访问 zip 并为您上传,他们的工具不需要其他任何东西,只需 3 个变量设置、用户名、应用程序密钥和要上传的文件。

为了完成示例管道 yaml:

image: <SOMETHING>

pipelines:
  default:
    - step:
        name: 'Build'
        script:
          - make all
          - mv build/output.zip build/output-$BITBUCKET_BUILD_NUMBER.zip
        artifacts:
          - build/output-*.zip

    - step:
        name: 'Deploy the output into the download section'
        script:
          - pipe: atlassian/bitbucket-upload-file:0.3.2
            variables:
              BITBUCKET_USERNAME: $BITBUCKET_USERNAME
              BITBUCKET_APP_PASSWORD: $BITBUCKET_APP_PASSWORD
              FILENAME: "build/output-$BITBUCKET_BUILD_NUMBER.zip"

【讨论】:

当我上传单独的文件时,我不得不再次为该新文件列出“管道”部分

以上是关于如何在 Bitbucket-Pipelines 中保存工件的主要内容,如果未能解决你的问题,请参考以下文章

来自 Docker 映像的 Bitbucket 管道缺少 NPM 模块

Docker BitBucket管道中缺少区域设置nl_NL

尝试将元数据添加到对象时,AWS S3 管道中的“无效 JSON”

如何在图像中找到明亮区域(以及如何在图像中找到阴影区域)

在QGIS中如何添加天地图的WMTS

如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?