1. 概要

このチュートリアルでは、継続的インテグレーション/継続的展開(CI / CD)プロセスを確認し、その重要な部分を実装します。

単純なSpring Bootアプリケーションを作成し、それを共有Gitリポジトリにプッシュします。 その後、建物統合サービスを使用してビルドし、Dockerイメージを作成して、Dockerリポジトリにプッシュします。

最後に、アプリケーションをPaaSサービス(Heroku)に自動的にデプロイします。

2. バージョン管理

CI / CDの重要な部分は、コードを管理するためのバージョン管理システムです。 さらに、ビルドとデプロイの手順を結び付けるリポジトリホスティングサービスが必要です。

現在最も人気があり、無料で使用できるため、VCSとして Git を選択し、リポジトリプロバイダーとしてGitHubを選択しましょう。

まず、GitHubでアカウントを作成する必要があります。

さらに、Gitリポジトリを作成する必要があります。 baeldung-ci-cd-processという名前を付けましょう。 また、他のサービスに無料でアクセスできるようになるため、パブリックリポジトリを選択しましょう。 最後に、README.mdを使用してリポジトリを初期化します。

リポジトリが作成されたので、プロジェクトをローカルに複製する必要があります。 これを行うには、ローカルコンピューターで次のコマンドを実行します。

git clone https://github.com/$USERNAME/baeldung-ci-cd-process.git

これにより、コマンドを実行したディレクトリでプロジェクトが初期化されます。 現時点では、README.mdファイルのみが含まれている必要があります。

3. アプリケーションの作成

このセクションでは、プロセスに参加する単純なSpring Bootアプリケーションを作成します。 また、ビルドツールとしてMavenを使用します。

まず、バージョン管理リポジトリのクローンを作成したディレクトリでプロジェクトを初期化します。

たとえば、 Spring Initializer を使用して、webおよびactuatorモジュールを追加することでこれを行うことができます。

3.1. アプリケーションを手動で作成する

または、spring-boot-starter-webおよびspring-boot-starter-actuatorの依存関係を手動で追加できます。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

1つ目はRESTエンドポイントを導入することであり、2つ目はヘルスチェックエンドポイントを導入することです。

さらに、アプリケーションの実行を可能にするプラグインを追加しましょう。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

最後に、Spring Bootメインクラスを追加しましょう。

@SpringBootApplication
public class CiCdApplication {

    public static void main(String[] args) {
        SpringApplication.run(CiCdApplication.class, args);
    }
}

3.2. 押す

Spring Initializrを使用する場合でも、プロジェクトを手動で作成する場合でも、変更をコミットしてリポジトリにプッシュする準備が整いました。

次のコマンドでそれを実行しましょう。

git add .
git commit -m 'Initialize application'
git push

これで、変更がリポジトリに存在するかどうかを確認できます。

4. ビルド自動化

CI / CDプロセスの別の部分は、プッシュされたコードをビルドしてテストするサービスです。

ここではTravisCI を使用しますが、どの構築サービスでも同様に機能します。

4.1. Mavenラッパー

まず、 MavenWrapperをアプリケーションに追加します。 Spring Initializrを使用した場合、デフォルトで含まれているため、この部分をスキップできます。

アプリケーションディレクトリで、次のことを実行しましょう。

mvn -N io.takari:maven:0.7.7:wrapper

これにより、Mavenの代わりに使用できるmvnwおよびmvnw.cmdファイルを含むMavenラッパーファイルが追加されます。

Travis CIには独自のMavenがありますが、他の構築サービスにはない場合があります。 このMavenラッパーは、どちらの状況にも備えるのに役立ちます。 また、開発者は自分のマシンにMavenをインストールする必要はありません。

4.2. 建築サービス

その後、GitHubアカウントでサインインして、TravisCIにアカウントを作成しましょう。 今後は、GitHubでプロジェクトへのアクセスを許可する必要があります。

次に、TravisCIでのビルドプロセスを説明する.travis.ymlファイルを作成する必要があります。 ほとんどの構築サービスでは、リポジトリのルートにあるそのようなファイルを作成できます。

この例では、Java11とMavenWrapperを使用してアプリケーションをビルドするようにTravisに指示しましょう。

language: java
jdk:
  - openjdk11
script:
  - ./mvnw clean install

言語のプロパティは、Javaを使用することを示しています。

jdk プロパティは、DockerHubからダウンロードするDockerイメージ(この場合は openjdk11 )を示します。

スクリプトプロパティは、実行するコマンドを示します。Mavenラッパーを使用します。

最後に、変更をリポジトリにプッシュする必要があります。 TravisCIは自動的にビルドをトリガーする必要があります。

5. Dockerizing

このセクションでは、アプリケーションを使用してDockerイメージを作成し、CDプロセスの一部としてDockerHubでホストします。 これにより、どのマシンでも簡単に実行できるようになります。

5.1. Dockerイメージのリポジトリ

まず、イメージ用のDockerリポジトリを作成する必要があります。

DockerHubでアカウントを作成しましょう。 また、適切なフィールドに入力して、プロジェクトのリポジトリ作成しましょう。

  • 名前: baeldung-ci-cd-process
  • 可視性:公開
  • ビルド設定:GitHub

5.2. Dockerイメージ

これで、Dockerイメージを作成してDockerHubにプッシュする準備が整いました。

まず、 jib-maven-plugin を追加して、アプリケーションを含むイメージを作成し、Dockerリポジトリにプッシュします( DockerHubUsername を正しいユーザー名に置き換えます)。

<profile>
    <id>deploy-docker</id>
    <properties>
        <maven.deploy.skip>true</maven.deploy.skip>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>2.2.0</version>
                <configuration>
                    <to>
                        <image>${DockerHubUsername}/baeldung-ci-cd-process</image>
                        <tags>
                            <tag>${project.version}</tag>
                            <tag>latest</tag>
                        </tags>
                    </to>
                </configuration>
            </plugin>
        </plugins>
    </build>
</profile>

デフォルトのビルドでトリガーされないように、Mavenプロファイルの一部として追加しました。

さらに、画像に2つのタグを指定しました。 プラグインの詳細については、Jibに関するの記事をご覧ください。

今後は、ビルドファイル( .travis.yml )を調整しましょう。

before_install:
  - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
  - docker pull openjdk:11-jre-slim-sid

script:
  - ./mvnw clean install
  - ./mvnw deploy jib:build -P deploy-docker

これらの変更により、ビルドサービスはアプリケーションをビルドする前にDockerHubにログインします。 さらに、プロファイルを使用してdeployフェーズを実行します。 そのフェーズでは、アプリケーションがイメージとしてDockerリポジトリにプッシュされます。

最後に、ビルドサービスでDOCKER_PASSWORD変数とDOCKER_USERNAME変数を定義する必要があります。 Travis CIでは、これらの変数はビルド設定の一部として定義できます。

それでは、変更をVCSにプッシュしましょう。 ビルドサービスは、変更を加えてビルドを自動的にトリガーする必要があります。

ローカルで実行することで、Dockerイメージがリポジトリにプッシュされているかどうかを確認できます。

docker run -p 8080:8080 -t $DOCKER_USERNAME/baeldung-ci-cd-process

これで、 http:// localhost:8080 / actuator/health。にアクセスしてヘルスチェックにアクセスできるようになります。

6. コード分析

CI / CDプロセスに次に含めるのは、静的コード分析です。 このようなプロセスの主な目標は、最高のコード品質を確保することです。 たとえば、十分なテストケースがないことや、セキュリティ上の問題があることを検出できます。

CodeCov と統合して、テストカバレッジについて通知します。

まず、GitHubプロファイルを使用してCodeCovにログインし、統合を確立する必要があります。

次に、コードに変更を加える必要があります。 jacocoプラグインを追加することから始めましょう。

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.5</version>
    <executions>
        <execution>
            <id>default-prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

プラグインは、CodeCovで使用されるテストレポートを生成する役割を果たします。

次に、ビルドサービスファイル( .travis.yml )のスクリプトセクションを調整する必要があります。

script:
  - ./mvnw clean org.jacoco:jacoco-maven-plugin:prepare-agent install
  - ./mvnw deploy jib:build -P deploy-docker

after_success:
  - bash <(curl -s https://codecov.io/bash)

clean installフェーズ中にトリガーするようにjacocoプラグインに指示しました。 さらに、 after_success セクションが含まれています。このセクションは、ビルドが成功した後にレポートをCodeCovに送信します。

今後は、アプリケーションにテストクラスを追加する必要があります。 たとえば、メインクラスのテストである可能性があります。

@SpringBootTest
class CiCdApplicationIntegrationTest {

    @Test
    public void contextLoads() {

    }
}

最後に、変更をプッシュする必要があります。 ビルドをトリガーし、リポジトリに関連するCodeCovプロファイルでレポートを生成する必要があります。

7. アプリケーションの展開

プロセスの最後の部分として、アプリケーションをデプロイします。 Dockerイメージを使用できるので、どのサービスにもデプロイできます。 たとえば、クラウドベースのPaaSまたはIaaSにデプロイできます。

最小限のセットアップで済むPaaSであるHerokuにアプリケーションをデプロイしましょう。

まず、アカウントを作成してから、ログインする必要があります。

次に、作成しましょうアプリケーションスペース Herokuで名前を付けます baeldung-ci-cd-process 。 アプリケーションの名前は一意である必要があるため、別の名前を使用する必要がある場合があります。

最も単純なソリューションであるため、HerokuとGitHubを統合してデプロイします。 ただし、Dockerイメージを使用するパイプラインを作成することもできます。

今後は、pomにherokuプラグインを含める必要があります。

<profile>
    <id>deploy-heroku</id>
    <properties>
        <maven.deploy.skip>true</maven.deploy.skip>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>com.heroku.sdk</groupId>
                <artifactId>heroku-maven-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <appName>spring-boot-ci-cd</appName>
                    <processTypes>
                        <web>java $JAVA_OPTS -jar -Dserver.port=$PORT target/${project.build.finalName}.jar</web>
                    </processTypes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</profile>

Dockerと同様に、Mavenプロファイルの一部として追加しました。 さらに、webセクションに起動コマンドが含まれています。

次に、ビルドサービスファイル( .travis.yml )を調整して、アプリケーションをHerokuにもデプロイする必要があります。

script:
  - ./mvnw clean install
  - ./mvnw heroku:deploy jib:build -P deploy-heroku,deploy-docker

さらに、構築サービスのHEROKU_API_KEY変数にHerokuAPI-KEYを追加しましょう。

最後に、変更をコミットしましょう。 ビルドが完了したら、アプリケーションをHerokuにデプロイする必要があります。

https://baeldung-ci-cd-process.herokuapp.com/actuator/healthにアクセスして確認できます

8. 結論

この記事では、CI/CDプロセスの重要な部分とその準備方法を学びました。

まず、GitHubにGitリポジトリを準備し、そこにアプリケーションをプッシュしました。 次に、Travis CIをビルドツールとして使用して、そのリポジトリからアプリケーションをビルドしました。

その後、Dockerイメージを作成し、DockerHubにプッシュしました。

次に、静的コード分析を担当するサービスを追加しました。

最後に、アプリケーションをPaaSにデプロイしてアクセスしました。

いつものように、これらの例のコードは、GitHubから入手できます。