Jar を作り、Azure Artifacts を利用して成果物を配布する

# はじめに

記載情報は CI/CD に関連します。  
実務上関わった環境・機能を身近な情報としてお届けしたく、投稿をはじめました。  
各学習上、お金のかからない方法を選択していきます。

以下の手順を実施することで、ライブラリ開発者が Jar の Library を作り、Azure Artifacts を利用して成果物を配布する工程を模倣します。

## 対象者と関連環境・機能

この記事は下記のような人を対象にしています。

- CI/CD 初学者
- プログラミング初学者
- 駆け出しエンジニア

記載している環境・機能は以下です。

- Java
- Spring Tool Suite 4
- gradlew
- Azure DevOps
- Azure Artifacts

## 準備

|  No | 参照 URL                                                                                                                            |
| --: | ----------------------------------------------------------------------------------------------------------------------------------- |
|   1 | [CI/CD とは?](https://qiita.com/wf-kenji-ikeda/items/bfb6d5e21b33d0cca83b)                                                          |
|   2 | [Azure Devops (Artifacts) を無償、無料で使う](https://qiita.com/wf-kenji-ikeda/items/9c21859d8b5b6a63246e)                          |
|   3 | [Spring Tool Suite 4 インストール、Spring Initializr 、gradlew の利用](https://qiita.com/wf-kenji-ikeda/items/d00766da8a4076ec43ed) |
|   4 | [Spring Boot Web アプリケーションを作る](https://qiita.com/wf-kenji-ikeda/items/1e64e44094ce8a1d997f)                               |

## ライブラリ開発者のつもりで Library 作成

「Hello LibraryJar!」と出力する Library 想定のソースです。
Spring Web サンプルアプリからの呼び出しを行うことを考えています。  
（内容紹介は[「Hello LibraryJar!」](https://github.com/oad3/library-jar/blob/main/src/main/java/com/library/LibraryJar.java)と出力するだけなので、省略させていただきます。）

### ソース

本作業実施後の状態となります。  
[library-jar](https://github.com/oad3/library-jar)

## 起動可能な Jar

Library 想定ではあるのですが稼働確認しながら進める都合上、起動可能にしています。
gradlew による jar 作成か、jar コマンドによる jar 作成を行います。  
(やっている内容は同等となるためどちらでも OK。出力場所が異なるのでご注意。)

### gradlew による jar 作成

```gradlew
> cd \library-jar
library-jar> gradlew build

BUILD SUCCESSFUL in 3s
2 actionable tasks: 1 executed, 1 up-to-date

library-jar> java -jar ./build/libs/library-jar.jar
 =========================================
 Hello LibraryJar!
 =========================================
```

### jar コマンドによる jar 作成

```jar command
> cd \library-jar\bin
library-jar\bin> jar -cvfm ../library-jar.jar ../manifest.mf ./com/library/\*.class
st.mf ./com/library/\*.class
マニフェストが追加されました
com/library/LibraryJar.classを追加中です(入=1193)(出=645)(45%収縮されました)
library-jar\bin> java -jar ../library-jar.jar
 =========================================
 Hello LibraryJar!
 =========================================
```

## Azure Artifacts へパブリッシュ

gradlew で、[publishing タスク](https://github.com/oad3/library-jar/blob/main/build.gradle)を実行することで Azure Artifacts へパブリッシュを行います。

順番としては大きく以下3点。
- 「[maven-publish プラグイン](https://docs.gradle.org/current/userguide/publishing_maven.html)を利用することで、gradle publish コマンドを利用できるようする
- 本記事では gradlew で publish コマンドを実行
- 結果 publishing タスクが処理される


ローカル環境からのパブリッシュ時には「vstsMavenAccessToken」というトークンにて認証を行いますが、こちらは各自で設定頂く必要があります。

### publish タスク

build.gradle

```publishing
plugins {
	id 'java'
	id 'maven-publish'
}

・・・略

publishing {
	publications {
		myPublication(MavenPublication) {
			groupId 'LibraryJar-groupId'
			artifactId 'library-jar'
			version '0.0.2'				 // Your package version
			artifact 'library-jar.jar'	//Example: *./target/myJavaClasses.jar*
		}
	}

	// Repositories *to* which Gradle can publish artifacts
	repositories {
		maven {
			url 'https://pkgs.dev.azure.com/SecOrgOad3/cicd-training-env/_packaging/cicd-training-env-feed-001/maven/v1'　※準備した環境にそろえて記載します。
			credentials {
				username "cicd-training-env-feed-001"
				password System.getenv("SYSTEM_ACCESSTOKEN") != null ? System.getenv("SYSTEM_ACCESSTOKEN") : vstsMavenAccessToken　※各自で設定頂く必要があります。gradle.propertiesご参照。
			}
		}
	}
}
```

### gradle.properties の vstsMavenAccessToken を設定

[以下](https://github.com/oad3/library-jar/blob/main/gradle.properties)の通り空にしてありますので、適宜トークンの取得と設定が必要です。

gradle.properties

```gradle.propertiesのvstsMavenAccessToken
vstsMavenAccessToken=
```

[個人用アクセス トークンを使用する](https://docs.microsoft.com/ja-jp/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=Windows)

Azure Artifacts へのパブリッシュということで、許可すべき対象は「Packaging の Read & write」となります。  
（うまい事行かない場合は、一時的なフルアクセス許可で動きを見てからの切り分けも有効です。）

### gradlew で publish タスクを実行

```gradlew publish
library-jar>gradlew publish

BUILD SUCCESSFUL in 9s
2 actionable tasks: 2 executed
```

![CreateLibrary_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738816/be113907-d331-dc3e-80c5-af01de3302ef.png)


## 関連作業

- [CI/CD とは?](https://qiita.com/wf-kenji-ikeda/items/bfb6d5e21b33d0cca83b)
- [Azure Devops (Artifacts) を無償、無料で使う](https://qiita.com/wf-kenji-ikeda/items/9c21859d8b5b6a63246e)
- [Spring Tool Suite 4 インストール、Spring Initializr 、gradlew の利用](https://qiita.com/wf-kenji-ikeda/items/d00766da8a4076ec43ed)
- [Spring Boot Web アプリケーションを作る](https://qiita.com/wf-kenji-ikeda/items/1e64e44094ce8a1d997f)
- [Jar の Library を作り、Azure Artifacts を利用して成果物を配布する](https://qiita.com/wf-kenji-ikeda/items/696bda335a8933abfcb3)
- [ライブラリ開発者より指定されたバージョンを利用してアプリを作る](https://qiita.com/wf-kenji-ikeda/items/5bf06ce19c52e73a5463)
- [アプリを Docker 、Docker Compose でコンテナを動かしてみる](https://qiita.com/wf-kenji-ikeda/items/e6604ea6ae257f3925a7)
- [Azure Devops (PileLines) を無償、無料で使う](https://qiita.com/wf-kenji-ikeda/items/451838da3b4ac45a8d65)
- [Azure Devops (PileLines) でテスト、ビルド、イメージプッシュをする](https://qiita.com/wf-kenji-ikeda/items/5ddf6158bb98c4174db9)
- [minikube(kubernetes) でコンテナを動かしてみる](https://qiita.com/wf-kenji-ikeda/items/95604d83850a17b91c46)
- [nginx のコンテナを Docker や minikube(kubernetes) で動かし、静的コンテンツ公開工程を模倣](https://qiita.com/wf-kenji-ikeda/items/bf6cb1b7a047f562d309)

## 参考記事

[Gradle を使用して Maven アーティファクトを発行する](https://docs.microsoft.com/ja-jp/azure/devops/artifacts/maven/publish-package-gradle?view=azure-devops)  
[個人用アクセス トークンを使用する](https://docs.microsoft.com/ja-jp/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=Windows)