Batsのインストール手順メモ（RHEL9.x）

<!-- omit in toc -->
# Batsのインストール手順メモ（RHEL9.x）

<!-- omit in toc -->
## Table Of Contents
- [1. はじめに](#1-はじめに)
- [2. github.comへの接続性確認](#2-githubcomへの接続性確認)
- [3. gitコマンドのインストール](#3-gitコマンドのインストール)
  - [3-1. メディアのマウントとyum リポジトリーファイルの作成](#3-1-メディアのマウントとyum-リポジトリーファイルの作成)
  - [3-2. gitパッケージをインストール](#3-2-gitパッケージをインストール)
  - [3-3. メディアのアンマウントとyum リポジトリーファイルの無効化](#3-3-メディアのアンマウントとyum-リポジトリーファイルの無効化)
- [3. bats-coreのインストール](#3-bats-coreのインストール)
- [4. bats-assert, bats-supportの配備](#4-bats-assert-bats-supportの配備)
- [5. 動作確認](#5-動作確認)
- [6. おわりに](#6-おわりに)

## 1. はじめに
Bats(Bash Automated Testing System)をRHEL9.xへインストールする手順のメモを記載します。

`bats-core`, `bats-support`, `bats-assert`をGitHubリポジトリからダウンロードし、以下の様にインストールします。

| Name           | Destination        |
|:---------------|:-------------------|
| bats-core      | `/usr/local`       |
| bats-assert    | `/usr/local/lib`   |
| bats-support   | `/usr/local/lib`   |


前提として、GitHubリポジトリからダウンロードする為、RHEL9.xからインターネット接続ができる必要があります。
また、`git clone`コマンドで、GitHubリポジトリからコンポーネントを取得しますので、`git`パッケージをインストールしますが、その際、ローカルのRHEL9.4インストールメディアからインストールすることにします。
その為、最初にRHEL9.4インストールメディアのマウントして、そこから`git`パッケージをインストールします。

:::note info  
ここではroot権限での作業が多い為、rootユーザでの操作となっています。`su -`, `sudo -i`などでrootユーザにスイッチしてから作業をしてください。  
:::

:::note info  
ここではRHEL9.4を使用していますが、DVD の yum リポジトリーファイル名その中に書く名前以外は基本的にマイナーバージョンに囚われず利用可能なはずです。
また、古いメジャーバージョンでもメディア内のパスを読み替えれば動作するはずです。  
:::

## 2. github.comへの接続性確認
github.comへのリーチャビリティを確認します。
```bash
ping -c 2 github.com
```

## 3. gitコマンドのインストール
### 3-1. メディアのマウントとyum リポジトリーファイルの作成

ここでは /mntにインストールメディアをマウントして、DVD の yum リポジトリーファイル`/etc/yum.repos.d/rhel94dvd.repo`を作成します。
この設定手順は、Redhatのナレッジ [Need to set up yum repository for locally-mounted DVD on Red Hat Enterprise Linux 9](https://access.redhat.com/solutions/6913101)
 に記載されていますので適宜ご参照ください。

以降、コマンドを記載しますが、加工せずにコピーして使えるようにプロンプトの表示や出力結果を省いている場合と、ものによっては実行結果を示すためにプロンプトを含め記載している場合があることにご注意ください。

```bash
# Mount the RHEL binary DVD ISO to the /mnt directory.
df -h             /mnt
mount -r /dev/sr0 /mnt

ls -ld /etc/yum.repos.d/rhel94dvd.repo

cat <<EOF > /etc/yum.repos.d/rhel94dvd.repo 
[BaseOS]
name=BaseOS Packages Red Hat Enterprise Linux 9.4.0
metadata_expire=-1
gpgcheck=1
enabled=1
baseurl=file:///mnt/BaseOS/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

[AppStream]
name=AppStream Packages Red Hat Enterprise Linux 9.4.0
metadata_expire=-1
gpgcheck=1
enabled=1
baseurl=file:///mnt/AppStream/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
EOF

md5sum -c <<<'a4986cc3761d775fbacfe3933f860531  /etc/yum.repos.d/rhel94dvd.repo'
```


### 3-2. gitパッケージをインストール
<!-- omit in toc -->
#### 3-2-1. インストール
gitパッケージをインストールメディアからインストールします。
```bash
dnf install git.x86_64 -y
```
<!-- omit in toc -->
#### 3-2-2. gitコマンドのインストールを確認
インストールが成功したらgitコマンドが利用可能であることを確認します。
```
[root@rhel94 ~]# which git
/usr/bin/git
[root@rhel94 ~]# git --version
git version 2.43.0
```


### 3-3. メディアのアンマウントとyum リポジトリーファイルの無効化
今後、使用する必要がなければメディアはアンマウントしておきましょう。  
また、作成した`/etc/yum.repos.d/rhel94dvd.repo`も無効状態にしておくのが良いかと思います。

```bash
# Disabling `/etc/yum.repos.d/rhel94dvd.repo`
sed    '/^enabled=/s/1/0/' /etc/yum.repos.d/rhel94dvd.repo | diff /etc/yum.repos.d/rhel94dvd.repo -
sed -i '/^enabled=/s/1/0/' /etc/yum.repos.d/rhel94dvd.repo

# eject(unmount)
eject /dev/sr0
df -h /mnt
```


## 3. bats-coreのインストール
/tmpにbats-coreをダウンロード(clone)して、そこからインストーラーを実行します。
その際、インストール先は`/usr/local`を指定します。

<!-- omit in toc -->
### (1) 実行コマンド
```bash
cd /tmp
git clone https://github.com/bats-core/bats-core.git
bats-core/install.sh /usr/local
which bats
bats --version
rm -fr bats-core/
```

<!-- omit in toc -->
### (2) 実行イメージ
```
[root@rhel94 ~]# cd /tmp
[root@rhel94 tmp]# git clone https://github.com/bats-core/bats-core.git
Cloning into 'bats-core'...
remote: Enumerating objects: 10431, done.
remote: Counting objects: 100% (2795/2795), done.
remote: Compressing objects: 100% (284/284), done.
remote: Total 10431 (delta 2712), reused 2511 (delta 2511), pack-reused 7636 (from 3)
Receiving objects: 100% (10431/10431), 2.56 MiB | 3.32 MiB/s, done.
Resolving deltas: 100% (6453/6453), done.
[root@rhel94 tmp]# bats-core/install.sh /usr/local
Installed Bats to /usr/local/bin/bats
[root@rhel94 tmp]# which bats
/usr/local/bin/bats
[root@rhel94 tmp]# bats --version
Bats 1.11.1
[root@rhel94 tmp]# rm -fr bats-core/
```

## 4. bats-assert, bats-supportの配備
`bats-assert`, `bats-support`を`/usr/local/lib`に配備します。

<!-- omit in toc -->
### (1) 実行コマンド
```bash
cd /usr/local/lib
git clone https://github.com/ztombol/bats-assert
git clone https://github.com/ztombol/bats-support
```

<!-- omit in toc -->
### (2) 実行イメージ
```
[root@rhel94 tmp]# cd /usr/local/lib
[root@rhel94 lib]# git clone https://github.com/ztombol/bats-assert
Cloning into 'bats-assert'...
remote: Enumerating objects: 116, done.
remote: Counting objects: 100% (53/53), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 116 (delta 47), reused 47 (delta 47), pack-reused 63 (from 1)
Receiving objects: 100% (116/116), 31.68 KiB | 6.34 MiB/s, done.
Resolving deltas: 100% (63/63), done.
[root@rhel94 lib]# git clone https://github.com/ztombol/bats-support
Cloning into 'bats-support'...
remote: Enumerating objects: 88, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 88 (delta 3), reused 3 (delta 3), pack-reused 82 (from 1)
Receiving objects: 100% (88/88), 22.96 KiB | 2.30 MiB/s, done.
Resolving deltas: 100% (33/33), done.
[root@rhel94 lib]#
```


## 5. 動作確認
簡易テストスクリプトで動作を確認します。
```bash
cd /tmp
cat <<\EOF > basic_test.bats
#! /usr/bin/env bats

BATSLIB=/usr/local/lib
load ${BATSLIB}/bats-support/load
load ${BATSLIB}/bats-assert/load

function parrot(){
    echo   $1
    return $1
}

@test "mytest" {
    run parrot 0; assert_success;   assert_output 0
    run parrot 1; assert_failure 1; assert_output 1
}
EOF

md5sum -c <<<'3753a50ec5c9cb54d1a4d30e0d47edaa  basic_test.bats'
chmod +x basic_test.bats
./basic_test.bats

rm basic_test.bats
```


テスト実行時の結果は以下の様になります。
```
[root@rhel94 tmp]# ./basic_test.bats
basic_test.bats
 ✓ mytest

1 test, 0 failures

```

## 6. おわりに
Bats(bats-core)とヘルパーライブラリ（bats-support, bats-assert）をインストールするだけであれば、bats-coreのインストーラの実行と、bats-support, bats-assertを配備するだけです。
ですが、商用環境や社内のルールでインターネット接続ができなかったり、自由にパッケージのインストールができない場合があり得ます。

この場合、インターネット接続できる環境で`git clone`を使用してそれぞれのコンポーネントを入手して、tarボールなどで纏めておいて使用するのが良いと思います。

今回はそういったことを踏まえて、RHELでBatsのインストール自体の他に、データのダウンロードするためのgitのインストールに関わる手順なども纏めてみました。