Java Code 시리즈를 사용한 CI/CD

소개



전직 활동시 포트폴리오로서 Java를 사용한 애플리케이션을 만들었습니다.
GitHub에 소스 코드를 푸시하면 AWS의 EC2에 배포되도록 환경을 만들 때 메모를 남기려고합니다.

Code 시리즈의 작성 방법 등은 다른 기사를 참조해 주시고, 본 기사에서는

・배포될 때 자동으로 프로덕션 환경의 설정 파일로 전개되도록 하고 싶다! !

가 되었을 때에, 각종 설정 파일(Maven의 pom.xml이나, CodeBuild의 buildspec.yml, CodeDeploy의 appspec.yml)의 쓰는 방법에 대해 살짝 접해 가고 싶습니다.

누군가의 참고가 되면 다행입니다.

※환경 작성으로부터 본 기사의 집필에 시간이 비어 버렸기 때문에, 추억하면서 기재하고 있습니다. 잘못이 있어도 어쩔 수 없어・・・

처리 흐름



GitHub로 코드 푸시 → CodePipeline 시작 → CodeBuild에서 소스 코드 빌드 (& 테스트) → CodeDeploy로 EC2에 배포

이미지 다이어그램





내가 한 일



만드는 앱은 Maven 프로젝트로 만들었습니다.

디렉토리 구성은 다음과 같습니다.
アプリケーションディレクトリ
 |-- pom.xml
 |-- buildspec.yml                               ←CodeBuildで使用
 |-- appspec.yml                                 ←CodeDeployで使用
 |-- src
       |-- main
       |     |-- java
       |           |-- modelとかcontroller
       |     |-- config
       |           |-- honban                    ←本番用の設定ファイルを配置
       |                 `-- context.xml とか
       |           |-- local                     ←ローカル用の設定ファイルを配置
       |                 `-- context.xml とか
       |-- test
             |-- java
                   |-- modelテストコードとか



로컬 환경과 프로덕션 환경에서는 DB 연결 파라미터가 다르기 때문에 빌드 시의 파라미터로 로컬인지 프로덕션인지를 나누어 빌드할 수 있도록 pom.xml을 작성합니다.

pom.xml (발췌)
  <build>
    <finalName>calendar</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.1</version>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.2.2</version>
            <configuration>
                <webResources>
                    <resource>
                        <directory>${contextxml.path}</directory>  ←ここでcontext.xmlのパスを変えれるようにしている。実際のパスは下記のprofileの部分で指定
                        <targetPath>META-INF</targetPath>
                        <filtering>true</filtering>
                        <includes>
                            <include>context.xml</include>
                        </includes>
                    </resource>
                    <resorce>
                        <directory>${loggingproperties.path}</directory>
                        <filtering>true</filtering>
                        <includes>
                            <include>logging.properties</include>
                        </includes>
                    </resorce>
                </webResources>
            </configuration>
        </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
        <id>local</id>  ←ビルド時にlocalを引数で渡すと、このprofileセクションの値が使用される
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <contextxml.path>src/main/config/local</contextxml.path>
            <loggingproperties.path>src/main/config/local</loggingproperties.path>
        </properties>
    </profile>
    <profile>
        <id>honban</id>  ←ビルド時にhonbanを引数で渡すと、このprofileセクションの値が使用される
        <properties>
            <contextxml.path>src/main/config/honban</contextxml.path>
            <loggingproperties.path>src/main/config/honban</loggingproperties.path>
        </properties>
    </profile>
  </profiles>


CodeBuild에서 빌드 동작을 정의하는 buildspec.yml은 다음과 같이 만들었습니다.

buildspec.yml
version: 0.2

env:
  variables:
    S3_BUILD_OUTPUT_BUCKET: "calendardeploybucket"

phases:
  install:
    runtime-versions:
      java: corretto8
    commands:
      # treeコマンドを使いたいのでインストール
      - yum install -y tree

  pre_build:
    commands:
      - echo Nothing to do in the pre_build phase...
      - mvn clean
  build:
    commands:
      - echo Build started on `date`
      # maven実行(honban用でパッケージ。今回はテストスキップ。。)
      - mvn package -P honban -DskipTests=true

      # ソース,java,mavenのバージョンを出力
      - echo "--------------------------------------------------" >> version.txt
      - echo "SourceVersion:"$CODEBUILD_RESOLVED_SOURCE_VERSION >> version.txt
      - java -version 2>> version.txt
      - mvn -version >>version.txt
      - echo "--------------------------------------------------" >> version.txt

  post_build:
    commands:
      - echo Build completed on `date`

      # treeコマンドで確認
      - tree >>tree.txt
      - aws s3 cp tree.txt s3://$S3_BUILD_OUTPUT_BUCKET
      # version.txtの移動
      - aws s3 cp version.txt s3://$S3_BUILD_OUTPUT_BUCKET
      # warファイルとappspec.xmlを一つのZIPファイルに固める
      - zip -r ./calendar.zip ./target/calendar.war ./appspec.yml
      # S3にzipファイルをアップロード
      # - aws s3 cp ./calendar.zip s3://$S3_BUILD_OUTPUT_BUCKET

artifacts:
  files:
    - target/calendar.war
    - appspec.yml
  discard-paths: no


여러가지, 다른 사이트를 참고로 한 개소가 있습니다만・・・
위의 buildspec.yml에서 중요한 것은 빌드 명령으로 mvn package -P honban -DskipTests=true 를 실행하는 것입니다.
-P 옵션으로 honban을 지정하면 pom.xml의 profile에 지정된 경로의 파일이 사용됩니다.
테스트는 정상이면 건너 뛰지 않고 실행하십시오. .

또한 CodeBuild에서 빌드한 war 파일은 S3에 저장하지만, 그 때 후속 CodeDeploy가 사용하는 appspec.yml도 함께 zip 파일에 넣고 있습니다.
zip으로 굳을 때 CodeBuild가 원래 파일을 찾을 수 있도록 artifacts 섹션에서 mvn 명령으로 작성된 war 파일뿐만 아니라 appspec.yml도 지정합니다.

여기가 가장 집착한 것 같습니다. .

다음은 CodeDeploy에서 사용하는 appspec.yml입니다.

appspec.yml
version: 0.0
os: linux
files:
  - source: target/calendar.war
    destination: /usr/share/tomcat/webapps/

이제 나중에 Code 시리즈를 만들면 좋은 느낌으로 Java 앱이 배포 될 것입니다!

누군가의 참고가 되면・・・

좋은 웹페이지 즐겨찾기