Nexus Repository Manager3 を使って yum リポジトリを作る

# はじめに
[Nexus Repository Manager3 の Docker コンテナを HTTPS 化](https://qiita.com/nminoru/items/8475cfadaf32d2a6c409)では、自己証明書を使ってイントラネット内に HTTPS 化した Nexus コンテナを立ち上げたが、これを使って CentOS 向けの自己 yum ホストリポジトリや各種 yum リポジトリのミラーを作る。

# Nexus の設定の前提
まず Nexus サーバーの設定を行う。サーバーは以下の設定で動いているとする。

- host.example.com (10.20.230.17) で稼動しているとする。
- すでに 8081/tcp で HTTP サービスが、8082/tpc で HTTPS サービスで動作しているとする。
- 管理アカウントは admin/admin123 とする。

yum リポジトリのローカルミラーを使用するのは CentOS 7 を想定している。

# yum のミラーリポジトリ
CentOS リポジトリや EPEL、その他大き目のパッケージを配布しているリポジトリ毎にミラーリポジトリを作成すると、同じパッケージを2度ダウンロードする時にミラーの持つキャッシュが効くようになるので大変便利である。複数ホストを運用している場合や、Docker に yum update を掛ける場合などに重宝する。

## ローカルミラーリポジトリを作成する
Nexus にアクセスし、ミラーしたい yum リポジトリの数だけ yum proxy リポジトリを作成する。
Nexus に管理カウントでログインし、メニューバーの歯車をアイコンをクリックすると Administratorion 画面に移動する。

![Administration.png](https://qiita-image-store.s3.amazonaws.com/0/59327/e1b94444-0549-2045-eafe-bbe95232fd11.png)

左メニューの Repository > Repositories を選択した後に、「Create repository」ボタンを押す。
作成可能なリポジトリの一覧が表示されるので「yum(proxy)」を選択する。

- 「Name」は他のリポジトリと重複しないものを自由につけてよい。
- Remote storage には yum のマスターサーバーの URL を入力する。

自分が使っている設定を記述する。

|Name            |Remote storage                                    |
|----------------|--------------------------------------------------|
|yum-centos-proxy|http://mirror.centos.org/centos/                  |
|yum-epel-proxy|http://download.fedoraproject.org/pub/epel/7/       |
|yum-gitlab-proxy|https://packages.gitlab.com/gitlab/gitlab-ce/el/7/|

CentOS のリポジトリは標準では http://mirror.centos.org/centos/ だが、適当なミラーサイトを指定した方がよい。例えば http://ftp.riken.jp/Linux/centos/ など。

CentOS 以外のリポジトリを設定するには多少注意が必要だ。
まず /etc/yum.repo.d/ 以下にすでに追加している yum リポジトリの内容を見ながら確認して設定する。例えば gitlab_gitlab-ce.repo では以下のようになっている。baseurl の最後の $basesearch が CentOS のアーキテクチャー、例えば "x86_64" に替わることになる。

```
[gitlab_gitlab-ce]
name=gitlab_gitlab-ce
baseurl=https://packages.gitlab.com/gitlab/gitlab-ce/el/7/$basearch
repo_gpgcheck=1
gpgcheck=1
enabled=1
gpgkey=https://packages.gitlab.com/gitlab/gitlab-ce/gpgkey
       https://packages.gitlab.com/gitlab/gitlab-ce/gpgkey/gitlab-gitlab-ce-3D645A26AB9FBD22.pub.gpg
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
``` 

この場合、Nexus3 の yum(proxy) に指定する Remote storage と後で /etc/yum.repo.d/ に配置するリポジトリ設定の baseurl にはバリエーションが考えられる。

|Repodata Depth|Remote storage|baseurl                                                                                |
|--------------|--------------|---------------------------------------------------------------------------------------|
|5|https://packages.gitlab.com/|http://admin:admin123@host.example.com:8081/repository/yum-gitlab-proxy/gitlab/gitlab-ce/el/7/$basearch|
|4|https://packages.gitlab.com/gitlab/|http://admin:admin123@host.example.com:8081/repository/yum-gitlab-proxy/gitlab-ce/el/7/$basearch|
|3|https://packages.gitlab.com/gitlab/gitlab-ce/|http://admin:admin123@host.example.com:8081/repository/yum-gitlab-proxy/el/7/$basearch|
|2|https://packages.gitlab.com/gitlab/gitlab-ce/el/|http://admin:admin123@host.example.com:8081/repository/yum-gitlab-proxy/7/$basearch|
|1|https://packages.gitlab.com/gitlab/gitlab-ce/el/7/|http://admin:admin123@host.example.com:8081/repository/yum-gitlab-proxy/$basearch|

原因は良く分からないのだが、最後の書き方はたいがいうまくいくが、上の方に行くに従って動作しない可能性が増えてゆく。
そこでとりあえず CentOS 以外のリポジトリは一番下の記述方法で行く。

## ローカルミラーリポジトリを使用する
自ホストが yum を実行した時に、どの外部 yum リポジトリを参照するかは /etc/yum.repo.d/ の設定されている。そこでローカルミラー yum リポジトリの設定を追加するが、デフォルトの設定よりもローカルミラーリポジトリの方を優先して使用できるうように優先度を設定する。
このために yum-plugin-priorites をインストールする。

```
$ sudo yum install yum-plugin-priorites
```

次に /etc/yum.repos.d/ の下に適当な名前で、例えば /etc/yum.repos.d/nexus3-proxy.repo のようにリポジトリ設定ファイルを書き込む。

```
[CentOS-Proxy]
name=CentOS-$releasever - Proxy
baseurl=http://admin:admin123@host.example.com:8081/repository/yum-centos-proxy/$releasever/os/$basearch/
enabled=1
gpgcheck=0
priority=1

[gitlab_gitlab-ce-Proxy]
name=gitlab_gitlab-ce - Proxy
baseurl=http://admin:admin123@host.example.com:8081/repository/yum-gitlab-proxy/$basearch
enabled=1
gpgcheck=0
priority=1

[epel-Proxy]
name=Extra Packages for Enterprise Linux 7 - Proxy
baseurl=http://admin:admin123@host.example.com:8081/repository/yum-epel-proxy/$basearch
enabled=1
gpgcheck=0
priority=1
```

リポジトリ中の priority は優先度をあらわし、小さいほど優先度が高く、省略時には 99 になる。ミラーリポジトリには priority=1 を指定しておく。

最後に yum のキャッシュをクリアしてから使用を開始する。

```
$ sudo yum clean all
$ sudo yum makecache
```

# yum のホストリポジトリ
自分で作成した RPM パッケージを配布したい場合などに yum のホストリポジトリを使うことができる。

## ローカルホストリポジトリを作成する
yum proxy リポジトリの作成と同様に Administratorion 画面の左メニューの Repository > Repositories を選択した後に、「Create repository」ボタンを押す。
作成可能なリポジトリの一覧が表示されるので「yum(hosted)」を選択する。

- 「Name」は他のリポジトリと重複しないものを自由につけてよい。ここでは yum-hosted とする。
- Repodata Depth というパラメータがある。作成された yum リポジトリがベース URL から、実際の RPM パッケージを格納する階層=repodataというDBが存在するディレクトリまで何回階層あるかという「深さ」である。リリースバージョン("6" or "7")やアーキテクチャー("x86_64" or "aarch64")を区別するためには深くする。とりあえずここでは 0 とする。

## ローカルホストリポジトリを使用する

/etc/yum.repo.d/ の下に、例えば /etc/yum.repo.d/yum-hosted.repo のようにリポジトリ設定ファイルを追加する。

```
[my-yum-hosted]
name=my-yum-hosted
baseurl=http://admin:admin123@host.example.com:8081/repository/yum-hosted/
enabled=1
gpgcheck=0
priority=1
```

## ローカルホストリポジトリに登録する
RPMパッケージをローカルホストリポジトリに登録したい場合、curl などを使って以下のように登録する。
yum-hosted リポジトリは Repodata Depth が 0 なので、/repository/yum-hosted/ の直下に置くが、Repodata Depth がそれ以外なら値に応じてディレクトリ階層を作成する。

```
curl -u admin:admin123 --upload-file foo-1.2.3-1el7.x86_64.rpm http://host.example.com:8081/repository/yum-hosted/foo-1.2.3-1el7.x86_64.rpm
```