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.ymlversion: 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.ymlversion: 0.0
os: linux
files:
- source: target/calendar.war
destination: /usr/share/tomcat/webapps/
이제 나중에 Code 시리즈를 만들면 좋은 느낌으로 Java 앱이 배포 될 것입니다!
누군가의 참고가 되면・・・
Reference
이 문제에 관하여(Java Code 시리즈를 사용한 CI/CD), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ha_ru/items/4e06ce0b9a2ca7eeb65a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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.ymlversion: 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.ymlversion: 0.0
os: linux
files:
- source: target/calendar.war
destination: /usr/share/tomcat/webapps/
이제 나중에 Code 시리즈를 만들면 좋은 느낌으로 Java 앱이 배포 될 것입니다!
누군가의 참고가 되면・・・
Reference
이 문제에 관하여(Java Code 시리즈를 사용한 CI/CD), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ha_ru/items/4e06ce0b9a2ca7eeb65a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
만드는 앱은 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 앱이 배포 될 것입니다!
누군가의 참고가 되면・・・
Reference
이 문제에 관하여(Java Code 시리즈를 사용한 CI/CD), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ha_ru/items/4e06ce0b9a2ca7eeb65a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)