🔨

AWS CodeBuildで手動インストールしたJDKを利用する

2024/12/28に公開

発生は稀だと思いますが、Javaアプリケーションのbuildで利用しているJDKをAWS Codebuildのimageに手動インストールする必要が生じました。

英語文献も含めていくつか記事があったのですが、AWS公式の処理を真似た点において、本記事が一番確実な方法と思われます。(2024/12時点)

過去の同様の内容にトライしている記事

amazon web services - How to install different Java OpenJDK version on AWS CodeBuild standard image - Stack Overflow

利用したimageは以下です

  • aws/codebuild/amazonlinux2-x86_64-standard:5.0

前提)AWS Codebuild imageのpre install されているJDK

利用するimageによって異なりますが、AWSの提供するCodebuild imageでは以下のruntimeが利用できます。(2024/12時点)

  • corretto8
  • corretto11
  • corretto17
  • corretto21

https://docs.aws.amazon.com/codebuild/latest/userguide/available-runtimes.html

利用するruntimeは、build定義(一般的にはbuildspec.yml ファイル)に記載します。

version: 0.2
phases:
  install:
    runtime-versions:
      java: corretto15

https://docs.aws.amazon.com/codebuild/latest/userguide/runtime-versions.html

これらのruntime以外のJDKを今回は利用します。

CodeBuildでのruntimeの利用の動作

当初独自JDKを利用する時に指定がうまくいきませんでした。
そこで、default runtimeを指定時のCodeBuildのログを確認すると、以下のような処理を実行していました。

[Container] 2024/11/11 10:30:03.958011 Running command echo "Installing corretto(OpenJDK) version 8 ..."
Installing corretto(OpenJDK) version 8 ...

[Container] 2024/11/11 10:30:03.962886 Running command export JAVA_HOME="$JAVA_8_HOME"

[Container] 2024/11/11 10:30:03.967415 Running command export JRE_HOME="$JRE_8_HOME"

[Container] 2024/11/11 10:30:03.971473 Running command export JDK_HOME="$JDK_8_HOME"

[Container] 2024/11/11 10:30:03.975638 Running command for tool_path in "$JAVA_HOME"/bin/*;
 do tool=`basename "$tool_path"`;
  if [ $tool != 'java-rmi.cgi' ];
  then
   rm -f /usr/bin/$tool /var/lib/alternatives/$tool \
    && update-alternatives --install /usr/bin/$tool $tool $tool_path 20000;
  fi;
done

このログを参照して、結局AWSの方でも特定のruntimeのJDKPATHを指定して切り替えているのだと理解し、以下の通り実行しました。

version: 0.2
phases:
  install:
    commands:
      # 利用するJDKを揃えるため内部利用のJDKを手動でインストール
      - echo "===== check the default java version(to be changed) ====="
      - java -version
      - tar -xzf /opt/[target_jdk].tar.gz -C /opt/
      - echo "configure java command"
      - export JAVA_HOME=/opt/[target_jdk]
      - echo $JAVA_HOME
      - export PATH=$JAVA_HOME/bin:$PATH
      - export JRE_HOME="$JAVA_HOME"
      - echo $JRE_HOME
      - export JDK_HOME="$JAVA_HOME"
      - echo $JDK_HOME
      - java -version
      # システム全体で手動インストールしたjavaを利用するように変更
      - |-
        for tool_path in "$JAVA_HOME"/bin/*;
         do tool=`basename "$tool_path"`;
          if [ $tool != 'java-rmi.cgi' ];
          then
           rm -f /usr/bin/$tool /var/lib/alternatives/$tool \
            && update-alternatives --install /usr/bin/$tool $tool $tool_path 200;
          fi;
        done
      - java -version
      - javac -version

この方法で、独自に指定したJDKをCodeBuildで利用できるようになりました。

補足) alternativesコマンドについて

今回初めて知ったのですが、利用するライブラリのversionを切り替えに利用する alternatives コマンドがあります。

JDKの切り替え処理でもこのコマンドを利用しています

【Java】複数バージョンのJavaを切り替えて使う方法 #Linux - Qiita
alternatives経由でJavaを使うならjavacも指定しよう #Linux - Qiita
alternativesコマンドでJavaのバージョンを切り替える@Java - tanakahdaのプログラマ手帳
javaのalternatives切り替えメモ - nori3tsu's blog

Discussion