본문 바로가기

AWS

[CodeBuild] 실습해보기

AWS 에서는 CI(지속적인 통합)툴로 CodeBuild라는 서비스를 제공해주고 있습니다. 이미 오픈소스로 유명한 젠킨스 CI, Travis CI 등 여러가지 CI툴이 있지만 기존에 AWS를 사용하고 있는 분들이라면 CodeBuild도 한번쯤 사용해보면 좋을것 같습니다. 실습 내용은 aws 공식 문서를 바탕으로 작성되었습니다!

1. S3 버킷 생성하기

먼저, S3 버킷을 두개 생성을 해줍니다. 하나는 빌드 입력에 사용되는 버킷이고 다른 하나는 빌드 출력을 저장할 때 사용되는 버킷입니다.
aws에서 s3 서비스를 검색 후 버킷 만들기를 클릭하면 아래의 그림과 같이 '버킷 만들기' 팝업이 뜹니다. 버킷 이름은 원하는대로 하신 후 생성을 합니다. (저는 codebuild-study-input-bucket, codebuild-study-output-bucket으로 각각 생성했습니다.)

  • 참고: Codebuild와 bucket은 동일한 리전에 속해야 됩니다.

S3 bucket 생성

2. 소스 코드를 생성하여 빌드하기

빌드 대상이 되는 소스코드를 작성합니다. intellij나 visual studio code와 같은 툴을 사용해서 작성합시다!

2-1. 프로젝트의 구조는 다음과 같습니다.

[root path]
    `--- src
         `--- main
              `--- java
                     `--- MessageUtil.java
         `--- test
              `--- java
                     `--- TestMessageUtil.java
    `--- pom.xml
    `--- buildspec.yml

2-2. [root path]/src/main/java/MessageUtil.java 파일을 작성합니다.

public class MessageUtil {
  private String message;

  public MessageUtil(String message) {
    this.message = message;
  }

  public String printMessage() {
    System.out.println(message);
    return message;
  }

  public String salutationMessage() {
    message = "Hi!" + message;
    System.out.println(message);
    return message;
  }
}

2-3. [root path]/src/test/java/TestMessageUtil.java 파일을 작성합니다.

import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;

public class TestMessageUtil {

  String message = "Robert";    
  MessageUtil messageUtil = new MessageUtil(message);

  @Test
  public void testPrintMessage() {      
    System.out.println("Inside testPrintMessage()");     
    assertEquals(message,messageUtil.printMessage());
  }

  @Test
  public void testSalutationMessage() {
    System.out.println("Inside testSalutationMessage()");
    message = "Hi!" + "Robert";
    assertEquals(message,messageUtil.salutationMessage());
  }
}

2-4. [root path]/pom.xml 파일을 작성합니다.

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>messageUtil</artifactId>
  <version>1.0</version>
  <packaging>jar</packaging>
  <name>Message Utility Java Sample App</name>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>    
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
      </plugin>
    </plugins>
  </build>
</project>
  • maven은 pom.xml에 따라 MessageUtil.java 및 TestMessageUtil.java 파일을 messageUtil-1.0.jar 파일로 변환한 후 테스트를 실행합니다.

3. 빌드 사양 생성하기

다음으로 빌드 사양 파일을 생성합니다. 빌드 사양 파일은 CodeBuild가 빌드를 실행하는데 사용되는 YAML 형식의 파일을 말합니다. 이 파일에 명시된 내용 대로 CodeBuild가 빌드를 수행하기 때문에 반드시 작성을 해줘야 됩니다.

3-1. [root path]/buildspec.yml 파일을 작성합니다.

version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto11
  pre_build:
    commands:
      - echo Nothing to do in the pre_build phase...
  build:
    commands:
      - echo Build started on `date`
      - mvn install
  post_build:
    commands:
      - echo Build completed on `date`
artifacts:
  files:
    - target/messageUtil-1.0.jar
  • version은 사용 중인 빌드 사양 표준의 버전을 나타냅니다. 현재 최신 버전인 0.2를 사용합니다.
  • phases는 빌드 단계를 나타냅니다. 빌드 단계의 이름(install, pre_build, post_build)는 변경할 수 없고 새로 생성할 수도 없습니다.
  • phases.build 단계에서 mvn install 명령이 실행되면서 maven이 java 클래스 파일을 컴파일 및 테스트하고 컴파일된 java 클래스 파일을 빌드 출력 결과물에 패키지하도록 지시합니다.
  • CodeBuild는 각 단계마다 나열된 순서로 지정된 명령을 실행합니다.
  • artifacts는 CodeBuild가 출력 버킷에 업로드하는 빌드 출력 결과물을 나타냅니다. files는 빌드 출력에 포함할 파일을 나타냅니다. 따라서 CodeBuild는 target 디렉터리의 messageUtil-1.0.jar파일을 버킷에 업로드 합니다.

4. 소스코드를 입력 버킷에 추가하기

소스코드 및 buildspec.yml 파일을 입력 버킷에 업로드 합니다. 입력 버킷에 업로드하기 위해 지금까지 작성한 파일을 모두 압축하여 MessageUtil.zip 파일을 생성합니다.

4-1. MessageUtil.zip 파일의 구조

MessageUtil.zip
    `--- src
         `--- main
              `--- java
                     `--- MessageUtil.java
         `--- test
              `--- java
                     `--- TestMessageUtil.java
    `--- pom.xml
    `--- buildspec.yml
  • 중요: 압축할 때 root 디렉터리는 포함시키지 않고 하위 디렉터리 및 파일만 포함합니다!
  • 참고: 만약, 입력 버킷을 이용하지 않고 CodeCommit, Github 등의 원격 저장소를 이용할 경우 buildspec.yml 파일을 저장소 루트에 생성해서 프로젝트의 일부로 포함을 시키고 따로 이들을 묶어 zip파일을 생성하지 않습니다.

4-2. MessageUtil.zip 파일을 입력 버킷에 업로드 합니다.

S3 bucket에 zip 파일 업로드

5. 빌드 프로젝트 만들기

aws 서비스 중 CodeBuild 검색 후 빌드 프로젝트 생성을 클릭하여 프로젝트를 생성합니다.

  • 프로젝트 이름과 간략한 설명을 입력합니다. 입력 소스로 버킷을 이용하는 경우 배지를 활성화 할 수 없기 때문에 활성하에 체크를 하지 않습니다.

  • 소스 공급자로 S3를 선택 후 앞에서 미리 생성해 놓았던 버킷명을 입력해줍니다. 버킷에서는 파일을 객체로 관리하기 때문에 S3 객체에는 미리 업로드 해놓은 MessageUtil.zip 파일을 입력해줍니다.


  • 그림과 같이 환경을 설정해 주고 새 역할을 생성해 줍니다. 역할의 경우 프로젝트 별로 따로 관리를 해주는게 좋습니다.

  • 빌드 사양을 입력하는 부분입니다. buildspec.yml 파일로 빌드 사양을 관리하기 때문에 파일 사용을 체크하고 이름은 buildspec.yml로 입력해줍니다.


  • 아티팩트는 S3를 선택하고 미리 생성해 놓은 출력 버킷명을 입력해줍니다. 이름과 경로는 따로 입력하지 않습니다.

  • 로그의 경우 기본으로 설정된 CloudWatch 로그를 선택하고 프로젝트를 생성합니다.

6. 빌드 실행하기

빌드 프로젝트를 성공적으로 생성했으면 이제 실제로 빌드를 실행해볼 차례입니다.

  • CodeBuild 대시보드에서 빌드 시작을 클릭합니다.

  • 빌드 구성은 기본으로 두고 빌드 시작을 클릭합니다.

이상으로 AWS CodeBuild의 기본적인 학습을 진행해 보았습니다. 좀 더 다양한 샘플이나 정보는 AWS 공식 문서를 참고해주세요.

'AWS' 카테고리의 다른 글

AWS EC2 시작하기  (0) 2017.11.19