RedHatエコシステムカタログへのコンテナアプリケーション登録手順のメモ

# はじめに
Red Hat Ecosystem Catalogに自社製品をOpenShift Containerとして登録する機会がありました。
基本的には[公式ガイド](https://access.redhat.com/documentation/ja-jp/red_hat_software_certification/8.72/html/red_hat_software_certification_workflow_guide/assembly_working-with-containers_configuring-the-system-and-running-tests-by-using-cockpit-for-non-containerized-application)の通りですが、実際にやってみてサポートを受ける内容もありましたので、自分も含め今後迷わないようにメモを残します。

<a id="#Chapter1"></a>
# Red Hat Technology Partnerカウントの作成
Ecosystem Catalogへの登録にTechnology Partnerのアカウントが必要です。
この[ガイド](https://redhat-connect.gitbook.io/red-hat-partner-connect-general-guide/initial-onboarding/register)の手順で作成します。
最初の画面は、下記のメニューから飛んだ先です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603942/3d523611-486b-0aea-6f63-a3214743899d.png)

<a id="#Chapter2"></a>
# 公開用コンテナイメージの準備
公開するコンテナイメージは、[認定要件](https://access.redhat.com/documentation/ja-jp/red_hat_software_certification/8.72/html/red_hat_openshift_software_certification_policy_guide/assembly-requirements-for-container-images_openshift-sw-cert-policy-introduction)に準拠する必要があります。
クリアしていない項目があると、後で行う認定テストスイートをパスできません。
各項目への具体的な対応内容を下記に記載します。
- RunAsNonRoot
Dockerfileの"USER"定義で、root以外のユーザを指定して動作するようにする。
- HasModifiedFiles
ベースレイヤーの削除や圧縮、/usr/libなどを上書きをしない。
- HasLicense
ソフトウェアの使用許諾を記載したテキストファイルを、"/licenses"ディレクトリに配置し、フォルダとファイルのオーナーを"preflightuser"にする。
- LayerCountAcceptable
レイヤー数を40未満にする。
- HasNoProhibitedPackages
UBIを使っている限り問題なし?
- HasRequiredLabel
 Dockerfileに、[この要件](https://access.redhat.com/documentation/ja-jp/red_hat_software_certification/8.72/html/red_hat_openshift_software_certification_policy_guide/con-image-metadata-requirements_openshift-sw-cert-policy-container-images)のラベルを定義します。
- 重要・重大な脆弱性のあるコンポートネントが含まれていない
最新のUBIを使っている限り問題なし?

補足：以降の説明にも影響してきますが、都合によりコンテナを、container-image-amd64、container-image-arm64、のように、アーキテクチャ毎に用意しています。

<a id="#Chapter3"></a>
# プロジェクトの作成
Ecosystem Catalogに公開するプロジェクトを作成します。
- Certified Technology Portalにログインし、Certification projectsのページから新規プロジェクトを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603942/d323c19d-c0df-0b54-63db-d7672be4fb43.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603942/27b397d9-1f97-3db3-bec0-874d98634c30.png)

- プラットフォームはRed Hat OpenShift、Container imageを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603942/bd22a724-5767-bfb7-2d79-3db9709df3fa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603942/3204cb02-046c-7aaf-c21a-71fb8afb843a.png)

- OSはRed Hat UBI、Distribution MethodはRed Hat Container Registryを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603942/4efe9d5f-934b-95d4-d66f-70a1a2828b99.png)
 
<a id="#Chapter4"></a>
# レジストリ情報の設定
レジストリ情報をこの[ガイド](https://access.redhat.com/documentation/ja-jp/red_hat_software_certification/8.72/html/red_hat_software_certification_workflow_guide/proc_managing-the-container-project-settings_openshift-sw-cert-workflow-complete-pre-certification-checklist-for-containers)内容に合わせて設定します。
ガイドそのままなので問題は無いと思います。

<a id="#Chapter5"></a>
# 輸出コンプライアンスアンケートへの回答
米国輸出規制に対する質問があり、回答を記入します。
承認まで時間がかかるため、先行して記入しておくことをお勧めします。

<a id="#Chapter6"></a>
# コンテナレジストリへの登録
次に行う認定テストスイートのため、作成したコンテナイメージをパブリックなレジストリ上に配置する必要があります。
ただし、AWS ECR(AWSのコンテナレジストリ)では問題があるためQuay.ioの使用を強く推奨します。
私の環境では、公開まではできるのですが、pullできないという問題が発生しました。

- Quay.ioへの登録&ログイン
これまでに作成したRedHatアカウントでもログインできました。
- リポジトリの作成
後に行うpush時に自動で作成されますので、特に作成不要です。
Webから予め作っておくとも可能です。
- コンテナイメージのPush
複数のバージョン(1.0.0とlatest)と複数のアーキテクチャをタグ付けしてpushするため、スクリプトを作りました。また、マルチアーキテクチャ対応のため、マニフェストの作成を合わせて行います。
変数は適宜設定してください。
```sh:push_quayio.sh
#/bin/bash

# Quay.ioにpushするスクリプト

# Quay.ioアクセス設定
QUAYIO_USER="quayio_user"
QUAYIO_PASSWORD="quayio_password"
QUAYIO_REPONAME="quayio_reponame"

# コンテナイメージとアーキテクチャを指定
IMAGE_BASENAME="container-image"
IMAGE_ARCS=("amd64" "arm64")

# pushするタグのバージョンを指定
TAG_VERSIONS=("1.0.0" "latest")

# ログイン
docker login -u ${QUAYIO_USER} -p ${QUAYIO_PASSWORD} quay.io

# バージョン指定分ループ
for TAG_VER in ${TAG_VERSIONS[@]}
do
	echo start:${TAG_VER}

	# タグ付けしてpush
	for ((idx=0;idx<${#IMAGE_ARCS[@]};idx++))
	do
		docker tag ${IMAGE_BASENAME}-${IMAGE_ARCS[idx]}:latest quay.io/${QUAYIO_USER}/${QUAYIO_REPONAME}:${TAG_VER}-${DGW_IMAGEARCS[idx]}
		docker push quay.io/${QUAYIO_USER}/${QUAYIO_REPONAME}:${TAG_VER}-${DGW_IMAGEARCS[idx]}
		docker rmi quay.io/${QUAYIO_USER}/${QUAYIO_REPONAME}:${TAG_VER}-${DGW_IMAGEARCS[idx]}
	done

	# マニフェスト作成
	CREATESTR=""
	for ((idx=0;idx<${#IMAGE_ARCS[@]};idx++))
	do
		CREATESTR+=" quay.io/${QUAYIO_USER}/${QUAYIO_REPONAME}:${TAG_VER}-${DGW_IMAGEARCS[idx]}"
	done
	docker manifest create --amend quay.io/${QUAYIO_USER}/${QUAYIO_REPONAME}:${TAG_VER}${CREATESTR}

	# アノテーション
	for ((idx=0;idx<${#IMAGE_ARCS[@]};idx++))
	do
		docker manifest annotate --arch ${DGW_IMAGEARCS[idx]} quay.io/${QUAYIO_USER}/${QUAYIO_REPONAME}:${TAG_VER} \
	      	quay.io/${QUAYIO_USER}/${QUAYIO_REPONAME}:${TAG_VER}-${DGW_IMAGEARCS[idx]}
	done
	
	docker manifest push -p quay.io/${QUAYIO_USER}/${QUAYIO_REPONAME}:${TAG_VER}

	echo end:${TAG_VER}
done

# ログアウト
docker logout quay.io
```
- Pushしたコンテナイメージを確認
Quay.ioのコンソールで、コンテナイメージがpushできていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603942/96b3dc34-46fa-de30-5316-d93efdab4076.png)

<a id="#Chapter7"></a>
# 認定テストスイートの実施
認定テストをこの[ガイド](https://access.redhat.com/documentation/ja-jp/red_hat_software_certification/8.72/html/red_hat_software_certification_workflow_guide/proc_running-the-certification-test-suite_openshift-sw-cert-workflow-complete-pre-certification-checklist-for-containers)に沿って実施します。
認定テストを行うにあたり、下記の事前準備が必要です。
- 認定ユーティリティー(preflight)の取得
RHEL上で、 [ココ](https://github.com/redhat-openshift-ecosystem/openshift-preflight/releases)から最新版を取得し展開します。
実行時には必ず最新版を使うことをお勧めします。サーバー側との不整合により、結果がおかしくなることがありました。
- APIトークンの取得
右上のMy AccouuntからMy user profileに飛び、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603942/e919cfb2-5042-607e-6e98-9760cc2da614.png)
API KeysのタブからGenerate new keyで作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603942/b6a7c8d9-7357-eb03-bd04-9f6cabf263ab.png)
- プロジェクトIDの取得
  URLかProjectのOverviewから取得します。
  赤矢印部分に表示される後半の数値です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603942/5149ff95-3190-9c4b-82cb-748fd8fab9ed.png)

事前準備が終わればpreflightを実行します。
変数は適宜置き換えてください。
```console
$./preflight check container quay.io/${QUAYIO_USER}/${QUAYIO_REPONAME}:${TAG_VERSIONS[0]} --submit --pyxis-api-token=${API_TOKEN} --certification-project-id=${PROJECT_ID}
$./preflight check container quay.io/${QUAYIO_USER}/${QUAYIO_REPONAME}:${TAG_VERSIONS[1]} --submit --pyxis-api-token=${API_TOKEN} --certification-project-id=${PROJECT_ID}

```

<a id="#Chapter8"></a>
# コンテナイメージの公開
認定テストスイート(preflight check)のチェックをパスし、チェックリストのタスクをすべて終えるとPublishできるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603942/667a37b4-1aeb-f35b-fbc5-e24997b66014.png)

と、言いたいところですが、
製品リストの登録がまだの場合は、[ココ](https://access.redhat.com/documentation/ja-jp/red_hat_software_certification/8.64/html/red_hat_software_certification_workflow_guide/proc_publishing-the-cnf-project_openshift-sw-cert-workflow-complete-pre-publication-checklist-for-cnf-project)の手順で製品登録を行い、今回のプロジェクトを紐づける必要があります。

<a id="#Chapter9"></a>
# 最後に
podmanではなくてすみません。。