1. 개요

CodeBuild를 통해 빌드해보자.


2. 참고문서


3. CodeBuild 생성

3-1. 프로젝트 구성

  • 이름 입력

3-2. 빌드 대상

  • S3, CodeCommit 등에서 선택

3-3. 환경 이미지

  • CodeBuild가 제공하는 이미지를 사용하거나 도커 이미지 지정
  • 각 언어 별 버전 선택, 예를 들어 자바라면 6, 7, 8 중에 선택 가능하다.

3-4. 이 빌드 프로젝트의 아티팩트를 넣을 위치

  • S3 정보 입력
  • 이름을 비우면 프로젝트 이름으로 자동 설정된다.
  • 네임스페이스 유형을 빌드 ID로 선택하면 S3 경로 상에 (빌드ID) 가 추가된다. 예: (버킷이름)/(빌드ID)/myApp.war 이다. 만약 매번 동일 위치에서 output을 만들어내고 싶으면 네임스페이스 유형을 선택하지 않는다.
  • 그러면 해당 CodeBuild 정책에 다음과 같은 내용이 포함된다. (s3-codebuild-myapp 이라는 버킷 지정시임)
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::s3-codebuild-myapp/*"
            ],
            "Action": [
                "s3:PutObject"
            ]
        }

[ 참고 : 아티팩트란? (출처: https://www.lesstif.com/pages/viewpage.action?pageId=18219542) ]

아티팩트는 소프트웨어 개발 프로젝트를 진행하면서 생성하는 다양한 산출물을 의미한다. 각종 설계 문서, 유즈 케이스, UML 다이어그램, 소스 코드, 소스를 빌드하여 생성된 라이브러리나 실행 파일도 모두 아티팩트에 속한다. 자바 프로젝트를 빌드할 때 많이 사용되는 메이븐(maven) 에서는 빌드로 생성되는 프로젝트의 결과물을 의미하며 아티팩트는 자바 프로젝트의 성격에 따라 다르지만 일반적으로는 .jar, .war, .ear 등의 확장자를 갖게 된다. .jar 확장자를 갖는 자바 라이브러리는 아티팩트의 일종이므로 이번 장에서 라이브러리라고 할 경우 아티팩트와 동일한 의미로 이해하면 된다.

** AWS 도큐먼트에 따르면 Output 위치를 다음과 같이 잡을 수 있다고 한다.

  •     CODEPIPELINE: The build project will have build output generated through AWS CodePipeline.
  •     NO_ARTIFACTS: The build project will not produce any build output.
  •     S3: The build project will store build output in Amazon Simple Storage Service (Amazon S3).

그러나 본인의 콘솔에서는 오직 Code Pipeline 연계는 보이지 않고 오직 S3와 No artifiact만 보인다.

3-5. 역할 (Role) 설정


4. zip 파일 패키징

CodeDeploy 연결을 위해서는 zip 파일 패키징이 필요하다. (war 파일은 사용 불가) 다음과 같이 output을 zip으로 생성한다.

  1. [고급 설정 표시] 에서 아티팩트 패키지를 zip 으로 선택
  2. [아티팩트: 이 빌드 프로젝트의 아티팩트를 넣을 위치]에서 이름을 xxxxxx...zip 으로 변경 (이대로 이름이 생성되므로 .zip이 아니면, 예를 들어 myApp이라고 적으면 그냥 myApp이 생김)
  3. 파일명이 실제 떨어지는 파일명인지 확인 (특히 pom.xml의 버전 등)

5. 문제 해결

5-1. buildspec.yml: no such file or directory

CodeCommit으로부터 빌드할 때 Repository 바로 아래에 buildspec.yml 파일이 존재하는지 확인이 필요하다.

version: 0.1

phases:
  post_build:
    commands:
      - echo Build completed on `date`
      - mvn package
artifacts:
  files:
    - target/myApp.war
  discard-paths: yes

5-2. No matching artifact paths found

[Container] 2018/01/12 04:32:40 Phase complete: POST_BUILD Success: true
[Container] 2018/01/12 04:32:40 Phase context status code: Message: 
[Container] 2018/01/12 04:32:40 Preparing to copy artifacts
[Container] 2018/01/12 04:32:40 Expanding base directory path: .
[Container] 2018/01/12 04:32:40 Assembling file list
[Container] 2018/01/12 04:32:40 Expanding .
[Container] 2018/01/12 04:32:40 Expanding artifact file paths for base directory .
[Container] 2018/01/12 04:32:40 Assembling file list
[Container] 2018/01/12 04:32:40 Expanding target/myApp.war
[Container] 2018/01/12 04:32:40 Skipping invalid artifact path target/myApp.war
[Container] 2018/01/12 04:32:40 Phase complete: UPLOAD_ARTIFACTS Success: false
[Container] 2018/01/12 04:32:40 Phase context status code: CLIENT_ERROR Message: No matching artifact paths found
[Container] 2018/01/12 04:32:43 Runtime error (*errors.errorString: No matching artifact paths found)

5-2-1.

이 에러때문에 고생을 좀 많이 했는데. 구글링해도 마땅한 답이 나오지 않았다.

UPLOAD_ARTIFACTS 부분에서 에러가 났는데, 물론 아티팩트를 생성하지 않는 옵션을 선택하면 에러는 발생하지 않았다. 다만 어떠한 output도 생기지 않는다..

참고로 선택 가능한 옵션은 다음과 같다.

  • CODEPIPELINE: The build project will have build output generated through AWS CodePipeline.
  • NO_ARTIFACTS: The build project will not produce any build output.
  • S3: The build project will store build output in Amazon Simple Storage Service (Amazon S3).

원인은 -(버전) 이 빠진 것이다.

Amazon S3 > (버킷이름) / (빌드번호) / myApp

  1. buildspec.yml에서 target/myApp.war 를 target/myApp-1.0.0-BUILD-SNAPSHOT.war 으로 수정
  2. CodeBuild 상에서 프로젝트 설정을 할 때 [아티팩트: 이 빌드 프로젝트의 아티팩트를 넣을 위치] 부분에서 경로는 myApp이라고 명시적으로 지정한 것 때문이었다. 이 부분을 그냥 공란으로 비우고 저장한 후 다시 빌드했더니 에러도 안났고 S3로 업로드도 잘됐다.

하위에 myApp-1.0.0-BUILD-SNAPSHOT.war 가 생성됨을 확인할 수 있었다.

5-2-2.

  • pom.xml의 (ArtifactId)-(버전).war
  • buildspec.xml의 아티팩트

가 동일한지 확인해야 한다. 간혹 pom.xml에 ArtifactId와 다른 이름을 넣어서 계속 에러나는 경우가 있다.