ラベル Maven の投稿を表示しています。 すべての投稿を表示
ラベル Maven の投稿を表示しています。 すべての投稿を表示

2018年7月15日日曜日

Concourse CIで成果物をMavenリポジトリにアップする

Concourse CIのMaven Resourceを使ってビルド成果物をMavenリポジトリにデプロイする方法です。

ジョブの構成

ジョブは、下の画像のようにアプリケーションをビルドしてnexusにデプロイする構成としています。

ジョブ定義

  • resource_typesで、maven-resourceを定義します。
  • resourcesは、resource_typesで定義したmaven-resourceの設定(urlや接続情報やartifactなど)を行います。
  • jobのtask定義ではリポジトリにデプロイする対象をoutputsで定義します。
  • put定義では、デプロイ対象の成果物(jarとpom)を定義します
# maven-resourceの定義
resource_types:
- name: maven-resource
  type: docker-image
  source:
    repository: nulldriver/maven-resource
    tag: latest

resources:
- name: app
  type: git
  source:
    uri: http://gitbucket:8080/git/root/sample-app.git

# maven-resourceのリソース定義
# urlや接続情報などを設定します
- name: nexus
  type: maven-resource
  source:
    url: http://nexus:8081/repository/maven-releases/
    snapshot_url: http://nexus:8081/repository/maven-snapshots/
    artifact: sample:sample-app:jar
    username: admin
    password: admin123
jobs:
- name: build
  plan:
  - get: app
    trigger: true
  - task: build
    config:
      platform: linux
      image_resource:
        type: docker-image
        source:
          repository: maven
          tag: '3.5.4-jdk-8'
      inputs:
        - name: app
      # putでmavenリポジトリに成果物をデプロイできるようにするためのoutputsの定義
      outputs:
        - name: target
      run:
        path: bash
        args:
        - -c
        - |
          cd app
          mvn clean package -D maven.repo.local=/tmp/.m2/repository
          cp -r target ..
  # jarとpomを指定してリポジトリにデプロイします
  - put: nexus
    params:
      file: target/sample-app*.jar
      pom_file: app/pom.xml
      

ジョブの実行と結果の確認

ジョブを実行すると、下のようなログが出力されてリポジトリに成果物がアップされていることがわかります。

[INFO] --- maven-deploy-plugin:2.7:deploy-file (default-cli) @ standalone-pom ---
Downloading: http://nexus:8081/repository/maven-snapshots/sample/sample-app/1.0.0-SNAPSHOT/maven-metadata.xml
Uploading: http://nexus:8081/repository/maven-snapshots/sample/sample-app/1.0.0-SNAPSHOT/sample-app-1.0.0-20180715.115944-1.jar
Uploaded: http://nexus:8081/repository/maven-snapshots/sample/sample-app/1.0.0-SNAPSHOT/sample-app-1.0.0-20180715.115944-1.jar (1.8 kB at 8.4 kB/s)
Uploading: http://nexus:8081/repository/maven-snapshots/sample/sample-app/1.0.0-SNAPSHOT/sample-app-1.0.0-20180715.115944-1.pom
Uploaded: http://nexus:8081/repository/maven-snapshots/sample/sample-app/1.0.0-SNAPSHOT/sample-app-1.0.0-20180715.115944-1.pom (403 B at 5.2 kB/s)
Downloading: http://nexus:8081/repository/maven-snapshots/sample/sample-app/maven-metadata.xml
Uploading: http://nexus:8081/repository/maven-snapshots/sample/sample-app/1.0.0-SNAPSHOT/maven-metadata.xml
Uploaded: http://nexus:8081/repository/maven-snapshots/sample/sample-app/1.0.0-SNAPSHOT/maven-metadata.xml (766 B at 9.9 kB/s)
Uploading: http://nexus:8081/repository/maven-snapshots/sample/sample-app/maven-metadata.xml
Uploaded: http://nexus:8081/repository/maven-snapshots/sample/sample-app/maven-metadata.xml (276 B at 4.1 kB/s)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

nexusでも成果物がアップされていることが確認できます。


mvnコマンド実行時にローカルリポジトリの場所を指定する

mvnコマンド実行時にローカルリポジトリの場所を指定したい場合はmaven.repo.localシステムプロパティを使用します。

例えば、カレントディレクトリ配下にローカルリポジトリを置きたい場合、mvn test -Dmaven.repo.local=./m2/repositoryのように指定します。

実行例

システムプロパティで指定した場所にローカルリポジトリが作られているのがわかります。

$ ls .m2
ls: '.m2' にアクセスできません: そのようなファイルやディレクトリはありません

$ mvn package -Dmaven.repo.local=./.m2/repository
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------------------< sample:sample-app >--------------------------
[INFO] Building sample-app 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
*************************************** 省略 ***************************************
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:25 min
[INFO] Finished at: 2018-07-15T06:37:10+09:00
[INFO] ------------------------------------------------------------------------

$ ls .m2
repository

2018年3月6日火曜日

Versions Maven Pluginを使ってparentのバージョンを変更する

org.codehaus.mojo:versions-maven-plugin:2.5:update-parent
で参照可能な最新バージョンに変更できる。

parentVersionを使用して、バージョン番号の範囲を指定できる。

例えば、下のように1.0.0か1.1.0のように指定する。
org.codehaus.mojo:versions-maven-plugin:2.5:update-parent -DparentVersion=[1.0.0,1.1.0]

2018年1月31日水曜日

Versions Maven Pluginを使ってバージョン番号からSNAPSHOTを削除する

setゴール実行時にremoveSnapshotにtrueを指定することで、SNAPSHOTが削除できる。
「1.0.0-SNAPSHOT」の場合は、「1.0.0」になる。
mvn org.codehaus.mojo:versions-maven-plugin:2.5:set -DremoveSnapshot=true

2018年1月30日火曜日

Apache Maven Clean Pluginを使ってデフォルト以外のファイルを削除する

Apache Maven Clean Pluginでは、project.build.directoryなどを自動的にクリーニングしてくれるけど、それ以外のファイルをクリーニングしたい場合がある。
その場合は、下のようにconfigurationにfilesetesを指定する。

この例では、「プロジェクトディレクトリ/temp」配下の「*.log」がクリーニング対象になる。
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-clean-plugin</artifactId>
  <version>3.0.0</version>
  <configuration>
    <filesets>
      <fileset>
        <directory>temp</directory>
        <includes>
          <include>*.log</include>
        </includes>
      </fileset>
    </filesets>
  </configuration>
</plugin>

2015年8月29日土曜日

Maven pluginでプロジェクトのビルドアウトプットに依存する方法

Guide to Maven Classloadingによると、Maven pluginはPlugin classloaderでクラスがロードされます。
プラグインのdependenciesに設定されたライブラリはロードされるけど、プラグインが設定されたプロジェクトのビルドアウトプットやdependenciesに設定されたライブラリを見ることはできない。

どうしても、プラグインからプロジェクトのビルドアウトプットを参照できないとダメなときは、Mojoでカスタムクラスローダを使ってロードする必要がある。例えば、Mojoから使うライブラリがClassオブジェクトを要求する場合なんかは、自分でカスタムクラスローダ使って頑張る必要がある。

Stackoverflowいい解決案があるので、これを参考に対応するのがよい。→Maven plugin can't load class

自分は、最も+1された回答を参考にしてみました。
やった内容は、大きくしたの2点になります。

MavenProjectをMojoにインジェクトする

Mojoのフィールドで、MavenProjectを受け取ります。
    @Parameter(defaultValue = "${project}", required = true, readonly = true)
    private MavenProject project;

カスタムクラスローダを使ってクラスをロードする

MavenProjectのgetRuntimeClasspathElementsを使って、クラスパスに設定されているパスを取得して、カスタムクラスローダを作ります。
getRuntimeClasspathElementsが返す値は、MojoアノテーションのrequiresDependencyResolution属性に指定した値によって変わります。
属性を指定しない場合は、target/classesだけが取得されます。ResolutionScope.RUNTIMEを設定すると、dependenciesに設定したライブラリも取得されます。
    private URLClassLoader createClassLoader() {
        List runtimeClasspathElements;
        try {
            runtimeClasspathElements = project.getRuntimeClasspathElements();
        } catch (DependencyResolutionRequiredException e) {
            throw new RuntimeException(e);
        }

        final URL[] urls = runtimeClasspathElements.stream()
                .peek(s -> System.out.println("classpath:" + s))
                .map(s -> {
            try {
                return new File(s).toURI().toURL();
            } catch (MalformedURLException e) {
                throw new RuntimeException(e);
            }
        }).toArray(URL[]::new);
        return new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());
    }