第6章 制限された環境でのアーティファクトリポジトリーの使用

テクノロジースタックを設定することで、自己署名証明書を使用して、インハウスリポジトリーからアーティファクトを扱うことができます。

6.1. Maven アーティファクトリポジトリーの使用

Maven は、2 つの場所で定義されているアーティファクトをダウンロードします。

  • プロジェクトの pom.xml ファイルで定義されるアーティファクトリポジトリー。pom.xml でのリポジトリーの設定は、Red Hat CodeReady Workspaces に固有のものではありません。詳細は、POM に関する Maven ドキュメントを参照してください。
  • settings.xml ファイルで定義されるアーティファクトリポジトリー。デフォルトでは、settings.xml`~/.m2/settings.xml にあります。

6.1.1. settings.xmlでのリポジトリーの定義

example.server.org で独自のアーティファクトリポジトリーを指定するには、settings.xml ファイルを使用します。settings.xml が Maven ツールを使用するすべてのコンテナーにあることを確認します。特に、これが Maven コンテナーおよび Java プラグインコンテナーにあることを確認します。

デフォルトで、settings.xml は、Maven および Java プラグインコンテナーの永続ボリューム上にある <home dir>/.m2 ディレクトリーにあり、一時モードではない場合はワークスペースを再起動するたびにファイルを再作成する必要はありません。

Maven ツールを使用する別のコンテナーがあり、このコンテナーで <home dir>/.m2 フォルダーを共有する場合は、devfile でこの特定のコンポーネントのカスタムボリュームを指定する必要があります。

apiVersion: 1.0.0
metadata:
  name: MyDevfile
components:
  - type: chePlugin
    alias: maven-tool
    id: plugin/id
    volumes:
    - name: m2
      containerPath: <home dir>/.m2

手順

  1. example.server.org でアーティファクトリポジトリーを指定するには、settings.xml ファイルを使用します。

    <settings>
      <profiles>
        <profile>
          <id>my-nexus</id>
          <pluginRepositories>
            <pluginRepository>
               <id>my-nexus-snapshots</id>
               <releases>
                 <enabled>false</enabled>
               </releases>
               <snapshots>
                 <enabled>true</enabled>
               </snapshots>
               <url>http://example.server.org/repository/maven-snapshots/</url>
            </pluginRepository>
            <pluginRepository>
               <id>my-nexus-releases</id>
               <releases>
                 <enabled>true</enabled>
               </releases>
               <snapshots>
                 <enabled>false</enabled>
               </snapshots>
               <url>http://example.server.org/repository/maven-releases/</url>
            </pluginRepository>
          </pluginRepositories>
          <repositories>
            <repository>
               <id>my-nexus-snapshots</id>
               <releases>
                 <enabled>false</enabled>
               </releases>
               <snapshots>
                 <enabled>true</enabled>
               </snapshots>
               <url>http://example.server.org/repository/maven-snapshots/</url>
            </repository>
            <repository>
               <id>my-nexus-releases</id>
               <releases>
                 <enabled>true</enabled>
               </releases>
               <snapshots>
                 <enabled>false</enabled>
               </snapshots>
               <url>http://example.server.org/repository/maven-releases/</url>
            </repository>
          </repositories>
        </profile>
      </profiles>
      <activeProfiles>
        <activeProfile>my-nexus</activeProfile>
      </activeProfiles>
    </settings>

6.1.2. ワークスペース全体での Maven settings.xml ファイルの定義

すべてのワークスペースで独自の settings.xml ファイルを使用するには、ワークスペースと同じプロジェクトに (任意の名前の) Secret オブジェクトを作成します。Secret のデータセクションに、必要な settings.xml の内容を追加します (同じディレクトリーに存在するはずの他のファイルも含まれる可能性があります)。「シークレットをファイルとしてワークスペースコンテナーにマウントする」 に従ってこの Secret にラベルおよびアノテーションを付けます。これにより、Secret の内容はワークスペース Pod にマウントされます。この Secret を使用するには、それ以前に実行されているワークスペースをすべて再起動する必要があります。

前提条件

これは、プライベート認証情報を Maven リポジトリーに設定するために必要です。詳細は、Maven ドキュメントの Settings.xml#Servers を参照してください。

この settings.xml をマウントするには、以下を実行します。

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                              https://maven.apache.org/xsd/settings-1.0.0.xsd">
  <servers>
    <server>
      <id>repository-id</id>
      <username>username</username>
      <password>password123</password>
    </server>
  </servers>
</settings>

手順

  1. settings.xml を base64 に変換します。

    $ cat settings.xml | base64
  2. 出力を新規ファイル secret.yaml にコピーし、必要なアノテーションおよびラベルも定義します。

    apiVersion: v1
    kind: Secret
    metadata:
      name: maven-settings-secret
      labels:
        app.kubernetes.io/part-of: che.eclipse.org
        app.kubernetes.io/component: workspace-secret
      annotations:
        che.eclipse.org/automount-workspace-secret: "true"
        che.eclipse.org/mount-path: /home/jboss/.m2
        che.eclipse.org/mount-as: file
    type: Opaque
    data:
      settings.xml: PHNldHRpbmdzIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9TRVRUSU5HUy8xLjAuMCIKICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1NFVFRJTkdTLzEuMC4wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2Qvc2V0dGluZ3MtMS4wLjAueHNkIj4KICA8c2VydmVycz4KICAgIDxzZXJ2ZXI+CiAgICAgIDxpZD5yZXBvc2l0b3J5LWlkPC9pZD4KICAgICAgPHVzZXJuYW1lPnVzZXJuYW1lPC91c2VybmFtZT4KICAgICAgPHBhc3N3b3JkPnBhc3N3b3JkMTIzPC9wYXNzd29yZD4KICAgIDwvc2VydmVyPgogIDwvc2VydmVycz4KPC9zZXR0aW5ncz4K
  3. このシークレットをクラスターに作成します。

    $ oc  apply -f secret.yaml
  4. 新規ワークスペースを起動します。maven コンテナーには、元の内容を含む /home/jboss/.m2/settings.xml ファイルが含まれます。

6.1.2.1. OpenShift 3.11 および OpenShift <1.13

OpenShift 3.11 では、同じパスに複数のボリュームマウントを含めることができないため、ボリュームのある devfile を /home/jboss/.m2 におき、シークレットを /home/jboss/.m2/settings.xml に置くことで競合を解決できます。これらのクラスターでは、/home/jboss/.m2/repository が devfile の maven リポジトリーのボリュームとして使用されます。

apiVersion: 1.0.0
metadata:
  ...
components:
 - type: dockerimage
   alias: maven
   image: maven:3.11
   volumes:
     - name: m2
       containerPath: /home/jboss/.m2/repository
   ...

6.1.3. Maven プロジェクトでの自己署名証明書の使用

内部アーティファクトリポジトリーには、多くの場合、Java でデフォルトで信頼される認証局によって署名された証明書がありません。主に、企業内の認証局によって署名されるか、または自己署名されます。これらの証明書を Java トラストストアに追加して、これらを受け入れるようにツールを設定します。

手順

  1. リポジトリーサーバーからサーバー証明書ファイルを取得します。通常、管理者は内部アーティファクトサーバーの証明書を OpenShift シークレットとして提供する必要があります (信頼できない TLS 証明書の CodeReady Workspaces へのインポート を参照してください)。関連するサーバー証明書は、ワークスペース内のすべてのコンテナーの /public-certs にマウントされます。

    1. 元の Java トラストストアファイルをコピーします。

      $ mkdir /projects/maven
      $ cp $JAVA_HOME/lib/security/cacerts /projects/maven/truststore.jks
      $ chmod +w /projects/maven/truststore.jks
    2. 証明書の Java トラストストアファイルへのインポート

      $ keytool -import -noprompt -file /public-certs/nexus.cer -alias nexus -keystore /projects/maven/truststore.jks -storepass changeit
      Certificate was added to keystore
  2. トラストストアファイルを追加します。

    • Maven コンテナーで以下を実行します。

      1. javax.net.ssl システムプロパティーを MAVEN_OPTS 環境変数に追加します。

          - mountSources: true
            alias: maven
            type: dockerimage
            ...
            env:
               -name: MAVEN_OPTS
                value: >-
                  -Duser.home=/projects/maven -Djavax.net.ssl.trustStore=/projects/maven/truststore.jks -Djavax.net.ssl.trustStorePassword=changeit
      2. ワークスペースを再起動します。
    • Java プラグインコンテナーで以下を実行します。

      devfile で、Java 言語サーバーの javax.net.ssl システムプロパティーを追加します。

      components:
        - id: redhat/java11/latest
          type: chePlugin
          preferences:
            java.jdt.ls.vmargs: >-
              -noverify -Xmx1G -XX:+UseG1GC -XX:+UseStringDeduplication
              -Duser.home=/projects/maven
              -Djavax.net.ssl.trustStore=/projects/maven/truststore.jks
              -Djavax.net.ssl.trustStorePassword=changeit
      [...]