Mavenでのライブラリ管理とAzureArtifact

#お題
大林雄一郎です。
普段、世田谷区の方に常駐しているので知らない方も多いかと思いますｗ

今回はArtifact（Maven）の管理って何？ってところからAzureArtifactを利用してみたい
というおはなしです。

###半年くらい前の話
プロジェクトのライブラリ管理をMavenでやってまして、
それの運用の為にNEXUSサーバとやらを構築させられる。

それ専用のVM立てて接続可能な状態にしてインストールして権限設定いじって・・・
などなどやることが多すぎて初見さんがやると無駄に時間が掛かかる。

###先月の話
しばやん先生の記事を見るつける
ttps://blog.shibayan.jp/entry/20181126/1543219664

すばらC通り越してすばらD
nugetでやられているので、Mavenでやってみようと思った次第。

#ワード
###Artifact
jarとかwarとかdllみたいな配布して利用可能なもの（ライブラリ）
どことなく中二心を擽るような単語
###Maven
プロジェクトとArtifactの関連付を行い（nugetと同様）
また関連したArtifactをもとにビルド、テスト、デプロイなどプロジェクト管理するもの。
###NEXUS
Mavenで管理するArtifactのリポジトリ
一般公開されているライブラリの他に、3rdParty製品（oracleなど）や自作のプロジェクトをアップロードして管理。
###AzureArtifact
AzureDevOpsの機能の一つ、NEXUSサーバと同じものが簡単に構築できそう。

#プロジェクト、Artifact管理構成
↑で書いた自作のプロジェクトを管理する場合、こんな感じになります。

①プロジェクト最新化させたらそれを共有のMAVENリポジトリ（NEXUSサーバ）にjarをアップロード（↓図でチームAの人）
②各チームの人々はローカルのMAVENリポジトリを最新化すると、チームAの最新が取得可能。
③②で取得するのは、そのチームで必要なjarだけ、
　⇒自チームで必要なjarを記載したpomファイル（※1）をローカルで管理する。
　　必要なものだけをNEXUSサーバからローカルへダウンロード、最新化する。

※1 pom
mavenプロジェクトに必要な情報が書かれたもの。
ローカル（自プロジェクト）で必要なライブラリをここで管理

![image.png](https://qiita-image-store.s3.amazonaws.com/0/215570/508c53d2-b035-b9d4-8012-2e4a4a94fe14.png)
ソースコード管理のプロジェクト版て感じですね、１システム作るのに複数プロジェクト、拠点をまたぐ場合にMAVENリポジトリ（NEXUSサーバ）を立てておくと配布が非常に簡単。

しかし、冒頭に書いた通りこのNEXUSサーバの構築がちょいとめんどくさかったので、
AzureArtifactを利用したら構築が簡単なのか試してみました。

#AzureArtifact
↑のNEXUSサーバにあたるものがAzureでサービス化されたもの。
位置づけ的にはAzureDevOpsの１機能みたいです。
今回はMavenに限っていますが、nugetなどももちろん使用可能となっています。

##さっそくつくってみる
※作業マシンにmavenがインストールされている状態です。※

Devopsポータルからチームプロジェクトを選択してfeedを新規作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215570/b6e111b0-c8b5-ec1f-07ef-4977da7f8fcb.png)

Mavenを選択して、Generate Maven credentialsを押す。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215570/2d7c2c51-6bbe-b95c-ad61-6fed90babd93.png)

Generate Maven credentialsで表示されるのが新規作成するリポジトリのkey
これをローカルのsettings.xmlに張り付ける。
⇒Nexusサーバ運用時はここにサーバの接続情報等が記載されている

```settings.xml
<settings>
	<servers>
		<server>
			<id>dev-azure-com-XXXX-aartifact</id>
			<configuration>
				<httpHeaders>
					<property>
						<name>Authorization</name>
						<value>発行された資格情報key
					</property>
				</httpHeaders>
			</configuration>
		</server>
	</servers>
</settings>
```

Mavenアーティファクトを公開する

```cmd
mvn -B archetype:generate -DarchetypeGroupId="org.apache.maven.archetypes" -DgroupId="XXXXX" -DartifactId="YYYYYY"
```
DgroupId、DartifactIdには作成するプロジェクトが分かればよさそう、
Artifactのリポジトリとプロジェクトを紐づける感じ。

pom.xmlの編集
Mavenアーティファクトを作成するとできるワークスペースに、pom.xmlも作成されているため
プロジェクトの情報も書き加える。
ここに必要なライブラリの情報または子プロジェクトの情報を記載する。

```pom.xml
?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>XXXXX</groupId>
	<artifactId>YYYYY</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>
	<description>MMM project.</description>
	<distributionManagement>
		<repository>
			<id>releases</id>
			<url>${repository.url}/maven-releases/</url>
		</repository>
		<snapshotRepository>
			<id>snapshots</id>
			<url>${repository.url}/maven-snapshots/</url>
		</snapshotRepository>
	</distributionManagement>
	<repositories>
		<repository>
			<id>snapshots</id>
			<url>${repository.url}/maven-snapshots/</url>
			<releases>
				<enabled>false</enabled>
			</releases>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</repository>
	</repositories>
	<modules>
		<module></module>
		<module></module>
	</modules>
</project>
```

最後に
mvn deploy、mvn installのコマンドを実行する。
これでAzureArtifactに自プロジェクトのフィードが作成され、pomに書かれているライブラリがインストールされる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215570/08605ecf-6f85-fefa-14b1-12b72dbc2281.png)

この状態になれば、eclipsやSTSでビルド通る状態になります。

#終わりに
結論だけ言えばAzureArtifactを利用した場合、構築は早くできます。
ただし当たり前ですが、mavenの知識がないといけませんね。
現在稼働しているプログラムが起動できる状態にまでしたかったのですが、また次回にしようかな。
だって今日はクリスマスだもの。