How to save artifacts in Bitbucket-Pipelines
Asked Answered
P

3

17

I am new to bamboo. What I try to do is collecting all .dacpac files that are created during the build process.

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

The directory structure would be

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

The output of the pipeline says

Successfully generated zip archive /opt/atlassian/pipelines/agent/build/Projects/[ProjectName]/[ProjectName].dacpac

which means there are really files generated during the build process. Have I done something wrong? If no, where would I find those artifacts.

Plio answered 11/10, 2017 at 4:57 Comment(0)
S
11

Unfortunately according to the documentation all artifacts are deleted after the pipeline run:

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

"Once a pipeline completes, whether it succeeds or fails, the artifacts are deleted."

However you can deploy artifacts to the Bitbucket downloads section, or anywhere else:

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/**"
Skijoring answered 18/3, 2018 at 15:47 Comment(1)
This might have changed a lot, but artifacts are not deleted upfront: they are kept for 14 days. Also, the recommended way to upload a file to bitbucket would be with the official pipe bitbucket.org/product/features/pipelines/…Campanulaceous
I
11

In bitbucket-pipelines.yml, whenever you progress to a different "step:", it will reset almost everything and behave independently to a previous step. This is not always obvious, and can be confusing.

In your previous step, you moved into a sub-folder using cd BackgroundCode. When the script progresses to the "artifacts:" step, the current working directory will reset back to its original $BITBUCKET_CLONE_DIR. So you need to cd BackgroundCode again in each step or use a path that's relative to the $BITBUCKET_CLONE_DIR, like this:

artifacts:
 - BackgroundCode/**/*.dacpac

or

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

This will now save the artifact automatically (for 14 days), and you can see it in the "Artifacts" tab at the top.

Invincible answered 29/3, 2019 at 10:47 Comment(0)
S
3

I think one good alternative is to use the bitbuckets download section like previously mentioned, however you can use their dedicated tool instead of using curl and hopping the API will not change and break your pipeline.

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

Compared to curl I think it's safer, easier to setup and easier to maintain. For example, the linked documentation shows 0.1.2 version of the tool, while the newest is 0.3.2, it required me to only update that version number and nothing else to stay up to date. I had to setup app permission key with the write access to my repositories, setup this as pipeline variable, setup my account name as a pipeline variable (the linked documentation described it pretty well) and then add a simple step to my pipeline yaml file. One disadvantage I can think of is that for bigger files curl might be better. So take it as yet another way of doing things, not as the ultimate way of doing everything.

My example yaml, you use some container to build your sources, it, you have your Makefile build step defined, then I rename my output artifact file and postfix a build ID (this way I will have multiple output files in my download section, not just the latest). Then I will make sure the next step will have access to these artifacts by adding the artifacts in the build step:

artifacts:

  • build/output-*.zip

And then the last deploy step will have access to the zip and will upload it for you, their tool doesn't need anything else just 3 variables setup, user name, app key and the file to upload.

For completion the example pipeline 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"
Secern answered 30/11, 2020 at 17:10 Comment(1)
When I was uploading separate files I had to list the 'pipe' section again for that new fileSecern

© 2022 - 2024 — McMap. All rights reserved.