CircleCI의 machine Executor에서 build 작업에서 deploy 작업으로 파일 전달(Workspace)

개요



CircleCI machine Executor를 사용하여 "Docker 빌드 ~ 배포"를 수행하는 프로젝트에서 build job에서 생성 된 파일/디렉토리를 deploy job에 전달하는 단계를 적어 둡니다.

방법(결론)



작업 사이에 Workspace를 통해 배포에 필요한 파일/디렉토리를 공유합니다.

persist_to_workspace



후속 deploy job에 제공할 파일/디렉토리를 Workspace에 업로드합니다.

특히 빌드 작업의 마지막 단계에서 persist_to_workspace를 실행합니다.

config.yml
      - persist_to_workspace:
          root: .
          paths:
            - ./app/build
            - ./app/deps
  • root:
  • 루트를 만들 컨테이너의 디렉토리.
  • 절대 경로(또는 working_directory의 상대 경로) 형태로 지정합니다.

  • paths:
  • 루트의 상대 경로에서 jobs간에 공유하려는 파일/디렉토리를 지정합니다.


  • attach_workspace



    Workspace에 저장된 데이터를 attach_workspace로 가져옵니다.

    .circleci/config.yml
          - attach_workspace:
              at: .
    
  • at:
  • 절대 경로(또는 working_directory의 상대 경로) 형태로 지정합니다.


  • 보충 설명



    CircleCI jobs는 격리 된 개별 환경에서 실행되는 사양입니다.

    .circleci/config.yml
    # 例:build jobで生成されたファイルは、そのままではdeploy jobには渡らない
    jobs:
      build:
        ...: ...
    
      deploy:
        ...: ...
    
    

    그 때문에, 특정의 job의 결과를 다른 job로 사용하기 위해서는, 이러한 「Workspace로 데이터 공유한다」등의 방법으로 전달을 실시하는 처리가 필요합니다.



    (이미지 인용: CircleCI/Jobs overview )



    실행 환경


  • macOS
  • GitHub (CircleCI와 협력)

  • 상황


    .
    ├── .circleci/
    │   └── config.yml
    ├── app
    │   ├── Dockerfile
    │   ├── (build/)
    │   ├── (deps/)
    │   └── moge.json
    └── docker-compose.yml
    
  • (빌드)
    build job중, docker-compose build 에 의해 생성된 빌드 파일군을 저장하고 있습니다
  • (deps)
    의사 코드 moge deps.get를 실행하면 app/moge.json에 설명 된 종속 패키지가 생성되어 deps 디렉토리에 저장됩니다.
  • npm install package.json 설명 패키지를 node_modules/에 저장하는 것과 동일한 이미지입니다


  • 코드



    .circleci/config.yml
    version: 2.1
    
    orbs:
      # 擬似Orb
      deploy-orb: deploy-orb/deploy-orb@latest
    
    executors:
      machine-executor:
        machine:
          image: ubuntu-1604:202010-01
    
    workflows:
      version: 2
      build-deploy:
        jobs:
          - build
          - deploy:
              requires:
                - build
    
    jobs:
      build:
        executor:
          name: machine-executor
        steps:
          - checkout
          - run:
              name: Build Docker container
              command: |
                set -x
                docker-compose build
          - run:
              name: Moge deps.get
              command: |
                set -x
               # 擬似コード(依存パッケージ取得)
                docker-compose run --rm app bash -c "moge deps.get"
          - run:
              name: Up Docker container
              command: docker-compose up -d
          - run:
              name: Moge test
              command: |
                set -x
               # 擬似コード(テスト実行)
                docker-compose exec app bash -c "moge test"
          - persist_to_workspace:
              root: .
              paths:
                - ./app/build
                - ./app/deps
          - run:
              name: Finish build
              command: echo "Finish build"
      deploy:
        executor:
          name: machine-executor
        steps:
          - checkout
          - attach_workspace:
              at: .
          - run:
              name: Check files/directories
              command: |
                set -x
                pwd && ls -a && ls app
          - run:
              name: Container push and release
              working_directory: app
              command: |
             # 擬似コード(本番環境へビルドコンテナをデプロイ)
                deploy-orb/install-and-push-release -a $YOUR_APP_NAME
          - run:
              name: Finish deploy
              command: echo "Finish deploy"
    

    (참고)


  • CircleCI
  • Using Workflows to Schedule Jobs
    h tps : // / rc ぇ시. 이 m/도 cs/2.0/을 rkfぉws/
  • Orbs, Jobs, Steps, and Workflows
    htps : // 해 rc ぇ시. 이 m / 두 cs / 2.0 / 조 bs-s ps /
  • Choosing an Executor Type
    h tps : // / rc ぇ시. 이 m / 두 cs / 2.0 / 네, rty ぺ s /

  • 좋은 웹페이지 즐겨찾기