Red Hat OpenShift LocalでOpenShift Buildsを使ってHello worldを動かしてみる

# はじめに
[前回の記事](https://qiita.com/susutani/items/f4dc9d83c73ca19204f0)でRed Hat OpenShift LocalをMacにインストールしたので、早速それを使ってみることにします。
と言っても、もうRed Hat OpenShift Localの新しいバージョン2.10.2が出ていたのでインストールし直しました。

# 前提環境

今回使用した手元のRed Hat OpenShift Localの環境はこちらです。

- MacBook Pro (13-inch, 2020)
- MacOS Monterey 12.6
- Red Hat OpenShift Localのバージョン 2.10.2

GitHubなどのGitリポジトリを別途用意してある前提です。

# OpenShiftでのCI/CDについて

OpenShiftの[CI/CD の概要](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.11/html/cicd/ci-cd-overview)を参照します。
OpenShiftは、開発者向けのエンタープライズ対応のKubernetesプラットフォームですので、継続的インテグレーション (CI) や継続的デリバリー (CD) などの DevOpsソリューションが提供されています。

- OpenShift Builds
- OpenShift Pipeline
- OpenShift GitOps

OpenShift Buildsを使用するとBuildahを利用してコンテナイメージの生成ができます。
OpenShift Pipelineは、KubernetesネイティブのCI/CDフレームワークであるTektonベースのパイプラインです。
OpenShift GitOpsは、宣言型GitOpsエンジンとしてArgo CDを使用するオペレーターです。

今回は、OpenShift Buildsを使ってみます。

Dockerビルド、Source-to-Image (S2I)ビルド、カスタムビルドが選べるのですが、今回はDockerビルドでDockerfileからコンテナーイメージを生成します。
（Source-to-Image (S2I)ビルドで、アプリケーションソースコードからイメージを作成するというのも便利そうなので、機会があったら試してみたいですね。）

# ソースコードの準備

定番のHello worldを作ろうと思いますが、ここ数年pythonが盛り上がっているので、python+FastAPIでやってみます。

[FastAPIのサイト](https://fastapi.tiangolo.com/ja/)にデプロイの説明があります。
その中の[Dockerを使用したデプロイ](https://fastapi.tiangolo.com/ja/deployment/docker/)の解説が充実していますので参照します。

日本語版ではpython3.7で解説されているのですが、英語版ではpython3.9になっているので、python3.9でやってみます。
パス名などは好みで変更します。

Gitリポジトリに以下の構成でソースファイルを置きます。

```
├── Dockerfile
├── README.md
├── requirements.txt
└── src
    └── main.py
```

Dockerfileは次のとおりです。

```Dockerfile
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9

COPY ./requirements.txt /tmp/requirements.txt 
RUN pip3 install --no-cache-dir --upgrade -r /tmp/requirements.txt

EXPOSE 8080

COPY ./src /app

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]
```

requirements.txtも作成します。

```requirements.txt
fastapi>=0.68.0,<0.69.0
pydantic>=1.8.0,<2.0.0
uvicorn>=0.15.0,<0.16.0
```

main.pyを作成して、Hello world!と表示するためのコードを書きます。
おまけとして、OpenShift Localでサーバのホスト名としてコンテナ名を取得できるかどうかが気になったので、その確認もしてみます。

```python
from fastapi import Cookie, FastAPI, Request
from typing import Optional
import os

app = FastAPI()

# ルート
@app.get('/')
async def index():
    hostname = os.uname()[1]
    return{"msg":"Hello world!","hostname":hostname}
```

# ビルドとデプロイ

## ログイン

メニューアイコンから、Openshiftコンソール画面を開きます。
<img width="300" alt="OpenShiftLocalのメニュー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/5c7111ce-c6be-e3d0-768f-b9743b1523a6.png">

ブラウザが起動して、Openshiftコンソールのログイン画面が開きます。

Openshift Localは、デフォルトでkubeadminとdeveloperというユーザーが用意されています。
今回は、アプリケーションのビルドをやってみますので、developerでログインします。

![コンソール画面ログイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/12106e3f-15d5-cb8a-0d65-98eebcb56eed.png)

Openshiftコンソール画面は、開発と運用の分離の観点でAdministrator用とDeveloper用に分かれています。
developerでログインすると最初にトポロジーの画面が開きますが、まだプロジェクトがないため新規プロジェクトの作成リンクがあるくらいしか有益な表示がありません。

## プロジェクトの作成

新規プロジェクトの作成リンクをクリックして、プロジェクト（名前空間）を作成します。プロジェクト名は、application-dev-1とします。
![プロジェクトの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/0db432c7-aed5-2b57-ac31-30a764ea27af.png)

作成されたプロジェクトの詳細が表示されます。
OpenShift Localは、端末で動かす開発用ツールですので、残念ながらCPU/メモリ等のメトリクスは取得できません。通常のOpenShiftと違うところですね。
![プロジェクト作成済み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/0b8408ad-e71e-173b-6788-1c4a5a47d3fd.png)

## Gitからのインポート

次に左のメニューから「追加」を選択します。
表示されたメニューの中から「Gitからのインポート」を選択します。
![Gitからのインポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/115de1e7-a069-b5ee-4dcc-3d2ea9d8f55c.png)

Gitからのインポートの画面が開くため、ソースコードのGitリポジトリURLを入力します。
すぐにGitタイプの入力も求められるますので、使っているGitタイプを選択します。
![Gitリポジトリ指定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/c0e07efc-118f-70da-aafd-90d861ae54f7.png)

詳細のGitオプションの表示を選択します。

ソースシークレットの項目で、「新規シークレット作成」を選択します。
GitリポジトリにアクセスするためのSSHキーをシークレットとして設定します。
名前は、repo-1とします。
（GitリポジトリのアクセスのためのSSHキー作成方法は、GitHub等のヘルプを参照してください）

<img width="300" alt="ソースシークレットの作成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/9165b68f-4d3c-4aa9-97d2-780916e097ce.png">

詳細のGitオプションの表示に戻りますので、そのままスクロールダウンします。
インポートストラテジーの項目で、Dockerfileを選択して、Dockerfile名を指定します。Dockerfileをそのまま入力します。
![インポートストラテジー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/ecf45bac-d62c-b1d5-5b51-b0fac83543bf.png)

アプリケーション名と名前は、helloにします。
それ以外は、デフォルトのままで、作成ボタンを押すとトポロジーが表示されてビルドが始まります。
![トポロジー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/aa33f249-bf68-1877-a171-ef8913df8b4b.png)

## トポロジー

このアイコンから進行中のビルドのログやソースコードリポジトリやデプロイ関係情報、アプリケーションへそれぞれアクセスすることができます。
ビルドが完了したら自動でデプロイされて、トポロジーの円が青になります。
<img width="300" alt="トポロジー青.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/7c981acb-c672-1822-de0e-faf088f9fea5.png">

アプリケーションにアクセスしてみます。
![アプリケーション結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/188bab6e-5f3c-dacc-66c4-ce3c57faa3b1.png)

できました。
ホスト名としてコンテナ名が取れていますね。
今回は、Red Hat OpenShift Local上でOpenShift Buildsを使用してpython+FastAPIのアプリケーションをビルドしてデプロイしました。

以上