아티팩트를 다른 스테이지로 어떻게 전달할 수 있습니까?


107

.gitlab-ci.yml 파일과 함께 GitLab CI를 사용하여 별도의 스크립트로 다른 단계를 실행하고 싶습니다. 첫 번째 단계는 테스트를 수행하기 위해 이후 단계에서 사용해야하는 도구를 생성합니다. 생성 된 도구를 이슈로 선언했습니다.

이제 이후 단계 작업에서 해당 도구를 어떻게 실행할 수 있습니까? 올바른 경로는 무엇이며 주변에 어떤 파일이 있습니까?

예를 들어 첫 번째 단계는 artifacts / bin / TestTool / TestTool.exe를 빌드하고 해당 디렉토리에는 다른 필수 파일 (DLL 및 기타)이 포함되어 있습니다. 내 .gitlab-ci.yml 파일은 다음과 같습니다.

releasebuild:
  script:
    - chcp 65001
    - build.cmd
  stage: build
  artifacts:
    paths:
      - artifacts/bin/TestTool/

systemtests:
  script:
    - chcp 65001
    - WHAT TO WRITE HERE?
  stage: test

관련이있는 경우 빌드 및 테스트는 Windows에서 실행됩니다.

답변:


102

사용 dependencies. 이 구성 테스트 단계에서는 빌드 단계에서 생성 된 추적되지 않은 파일을 다운로드합니다.

build:
  stage: build
  artifacts:
    untracked: true
  script:
    - ./Build.ps1

test:
  stage: test
  dependencies: 
    - build
  script:
    - ./Test.ps1

9
마침내 작동하게되었습니다! 여기서 핵심은 종속성이 아티팩트와 함께 사용되어야한다는 것입니다. 포함 된 아티팩트 만 후속 단계에서 사용할 수 있습니다. 말할 필요도없이 업로드되는 내용에 대해 보수적이어야합니다. 나는 expire_in을 사용한다고 말할 것이다. 그렇지 않으면 많은 스토리지가 낭비 될 수 있습니다. 이러한 아티팩트는 빌드 작업 / 단계 / 단계에서 gitlab에 업로드되고 테스트에서 다운로드됩니다.
ravikanth

18
정말로 의존성을 사용해야합니까? Gitlab 문서 상태 Note that artifacts from all previous stages are passed by default.. 문제는 언제 종속성을 사용해야 하는가입니다.

2
문서는 아주 잘이 최대를 지 웁니다 docs.gitlab.com/ee/ci/yaml/#dependencies
chetbox

3
모든 이전 단계의 @Josef 아티팩트 가 기본적으로 전달됩니다 (이전 작업이 아님)
Vivek

1
현재 작업에 이전 단계의 모든 아티팩트가 필요하지 않은 경우 @Josef. 빌드 단계에서 생성 된 10GB의 바이너리가 있지만 최종 단계에서 성공적인 빌드에 대한 이메일 만 전송한다고 가정 해 보겠습니다.이 작업을 위해 10GB를 모두 다운로드 할 필요는 없습니다
Ezh

50

모든 이전 단계의 아티팩트가 기본적으로 전달되므로 올바른 순서로 단계를 정의하기 만하면됩니다. 이해하는 데 도움이 될 수있는 아래 예를 시도해보세요.

image: ubuntu:18.04

stages:
  - build_stage
  - test_stage
  - deploy_stage

build:
  stage: build_stage
  script:
    - echo "building..." >> ./build_result.txt
  artifacts:
    paths:
    - build_result.txt
    expire_in: 1 week

unit_test:
  stage: test_stage
  script:
    - ls
    - cat build_result.txt
    - cp build_result.txt unittest_result.txt
    - echo "unit testing..." >> ./unittest_result.txt
  artifacts:
    paths:
    - unittest_result.txt
    expire_in: 1 week

integration_test:
  stage: test_stage
  script:
    - ls
    - cat build_result.txt
    - cp build_result.txt integration_test_result.txt
    - echo "integration testing..." >> ./integration_test_result.txt
  artifacts:
    paths:
    - integration_test_result.txt
    expire_in: 1 week

deploy:
  stage: deploy_stage
  script:
    - ls
    - cat build_result.txt
    - cat unittest_result.txt
    - cat integration_test_result.txt

여기에 이미지 설명 입력

다른 단계의 작업간에 아티팩트 를 전달하는 경우 문서 에서 설명한대로 아티팩트 와 함께 종속성 을 사용 하여 아티팩트 를 전달할 수 있습니다 .

그리고 더 간단한 예 :

image: ubuntu:18.04

build:
  stage: build
  script:
    - echo "building..." >> ./result.txt
  artifacts:
    paths:
    - result.txt
    expire_in: 1 week

unit_test:
  stage: test
  script:
    - ls
    - cat result.txt
    - echo "unit testing..." >> ./result.txt
  artifacts:
    paths:
    - result.txt
    expire_in: 1 week

deploy:
  stage: deploy
  script:
    - ls
    - cat result.txt

아주 명확한 설명 감사합니다. 단계에서 이전 단계의 아티팩트와 동일한 이름으로 아티팩트의 이름을 지정하면 원본 아티팩트를 덮어 쓰나요?
Michael Osofsky

1
@MichaelOsofsky 동일한 이름으로 아티팩트의 이름을 지정할 수 있습니다. 원본 아티팩트는 동일한 이름을 가진 다음 단계의 아티팩트가 덮어 쓰지 않습니다. 다음 단계는 이전 단계의 아티팩트 만 다운로드하며 그 사본입니다. 주로 단위 테스트와 통합이 병렬로 실행되기 때문에 예제에서 다르게 이름을 지정합니다. .eg 통합 테스트 작업을 제거하면 모든 작업이 순서대로 실행되고 혼동없이 모든 아티팩트에 동일한 이름을 사용할 수 있습니다. 참고로 한 가지 더 예를 들어 답변을 업데이트합니다.
Chuan

귀하의 예에서는 result.txt에 추가하고 있음을 알 수 있습니다. unit_test 작업에서 result.txt를 덮어 쓴 경우 작업 배포가 작업 빌드의 result.txt 내용에 액세스 할 수 없다고 가정합니다. 스크립트에서 이런 유형의 버그를 일으키지 않도록 요청하는 것입니다.
Michael Osofsky

1
로그에 따르면 배포 단계는 빌드 및 테스트 단계에서 result.txt를 모두 다운로드하지만 나중 단계는 이전 단계를 덮어 씁니다.
Chuan

1
BTW, 원본 아티팩트는 건드리지 않고 항상 CI / CD-> 파이프 라인에서 다운로드 할 수 있습니다. 그런 다음 오른쪽 아티팩트 드롭 다운 버튼을 클릭하면 모든 단계의 모든 아티팩트를 찾을 수 있습니다.
Chuan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.