Danny Michelin
Danny Michelin

Reputation: 100

How to delete artifacts directory on gitlab runner after uploading them to gitlab?

I'm trying to create a gitlab job that shows a metric for test code coverage. To do that, I'm creating a .coverage file and placing it in a directory that uploads artifacts. In a subsequent stage the artifacts are downloaded and consumed by a coverage tool to produce a coverage report. I noticed that the artifacts are not deleted when the gitlab runner finishes the job and are bloating my filesystem. How can I remove the artifacts directory after the artifacts are uploaded?

Here's what we currently have

stages:
    - test
    - build

before_script:
    - export GITLAB_ARTIFACT_DIR="$(pwd)"/artifacts

[...]

some-test:
    stage: test
    script:
        - [some script that puts something in ${GITLAB_ARTIFACTS_DIR}
    artifacts:
        expire_in: 4 days
        paths:
            - artifacts/
some-other-test:
    stage: test
    script:
        - [some script that puts something in ${GITLAB_ARTIFACTS_DIR}
    artifacts:
        expire_in: 4 days
        paths:
            - artifacts/

[...]
coverage:
    stage: build
    before_script: 
    script: 
        - [our coverage script]
    coverage: '/TOTAL.*\s+(\d+%)$/'
    artifacts:
        expire_in: 4 days
        paths:
            - artifacts/
        when: always
[...]
after_script:
    - sudo rm -rf "${GITLAB_ARTIFACT_DIR}"

According to https://gitlab.com/gitlab-org/gitlab-runner/issues/4146 after_script does not have access to before_script or scripts environment variables.

Upvotes: 2

Views: 5765

Answers (1)

Nicolas Pepinster
Nicolas Pepinster

Reputation: 6219

A solution could be to use cache and artifact simultaneously.

This config will create a new directory depending of the job id ($CI_JOB_ID) for each job execution :

stages:
- test

remote:
  stage: test
  script :
      - mkdir cache-$CI_JOB_ID
      - echo hello> cache-$CI_JOB_ID/foo.txt
  cache:
      key: build-cache
      paths:
      - cache-$CI_JOB_ID/
  artifacts:
      paths:
      - cache-$CI_JOB_ID/foo.txt
      expire_in: 1 week

At the next run, the previous cache-$CI_JOB_ID will be removed and replace by a new directory (as the $CI_JOB_ID will be different). This will keep only one instance of your cached file until the next job execution.

Note : you need to prefix the directory name with cache- otherwise the .gitlab-ci.yml is invalid.

Upvotes: 2

Related Questions