1. 演習室の特徴

CentOS8が稼動している演習室1,2,3,4などでは少し古いバージョンですが、rubyなどの環境が導入されています。 openapi-generator-cliなどは導入されていないため、OpenAPI+Sinatraによる検索ページの作成で紹介してるアプリを構築するために必要な手続きについてまとめていきます。

1.1. 導入されているソフトウェア

CentOS8のAINS標準環境に導入されているソフトウェアは、以下のページで確認することができます。

チュートリアルを実行するためには、ゼミ室10と比較して次のような違いがあります。

  • openapi-generator-cliコマンドがインストールされていない

  • bundle(bundler)コマンドがインストールされていない

lsやmakeコマンドは一般的なUNIX系システムには必ず導入されています。 cdやexportコマンドはShell(BashやZshなど)に共通に実装されている組込みコマンドです。(Shellの作者の考えに依存するため、同じ動きをするものの名前が違う場合があります。csh系ではexportではなくsetenvが代りに組込まれて、文法も独特です。)

gitとrubyとgemコマンドは環境に依りますが、AINSの標準環境ではインストールされています。ただ、基本パッケージだけで、bundlerなど関連するユーティリティはインストールされていません。

ここからは自分で必要なコマンドを準備しながら手順を進めていきます。

2. OpenAPI-Generatorの準備

OpenAPI Generator公式サイトでは、npmコマンドの利用などいくつかの導入手順が紹介されています。CentOSの環境は自分では自由にできないため、javaコマンドを直接起動する最も原始的な方法を採用します。

2.1. 基本的な手順

演習室の端末にログインし、次のようなコマンドを適当なディレクトリで実行します。 git cloneによって作成される、openapi-generatorディレクトリはサイズが大きくなるので、作業後に必要なJARファイルを他のディレクトリにコピーしてから削除しています。

また./mvnwコマンドを実行すると、コンピュータの性能に左右されますが、JARファイルが生成されるまで、10分程度の時間がかかります。

$ git clone https://github.com/openapitools/openapi-generator
$ cd openapi-generator
$ export JAVA_HOME=/usr/lib/jvm/java-openjdk
$ ./mvnw clean package
$ mkdir -p ~/lib/java
$ cp modules/openapi-generator-cli/target/openapi-generator-cli.jar /home/professor/yasu-abe/lib/java/

~/lib/java/に配置したopenapi-generator-cli.jarファイルが利用できるか確認します。

$ cp openapi-generator/samples/client/petstore/java/native/api/openapi.yaml  .
$ java -jar ~/lib/java/openapi-generator-cli.jar generate \
  -i https://raw.githubusercontent.com/openapitools/openapi-generator/master/modules/openapi-generator/src/test/resources/3_0/petstore.yaml  \
  -g ruby-sinatra \
  -o code

この後、code/ディレクトリが作成できていることを確認し、問題がなければ openapi-generator ディレクトリは削除します。

$ cd code/
$ ls
Dockerfile  Gemfile  README.md  api  config.ru  lib  my_app.rb  openapi.yaml

$ gem install bundler
$ ~/bin/bundler config set path lib
$ ~/bin/bundler install
$ ~/bin/bundler exec rackup -p 8080 --host 0.0.0.0

最後のコマンドが無事に実行できれば、http://localhost:8080/v2/store/inventory のようなURLでサンプルアプリケーションの実行が確認できます。

3. OpenAPI + Sinatra チュートリアルの実行

ここでは、openapi-generator-cli という名前のコマンドは利用していません。 代りに、java -jar ~/lib/java/openapi-generator-cli.jar generate というコマンドを利用しています。

これを利用して、演習室で次のチュートリアルを実行します。

3.1. 作業準備

演習室環境は、aplisv2.u-aizu.ac.jp へssh経由でログインしています。 既に ~/lib/java/openapi-generator-cli.jar ファイルを配置しています。

$ ssh yasu-abe@aplisv2.u-aizu.ac.jp
aplisv212:$ ls -l ~/lib/java/openapi*
-rw-r--r-- 1 yasu-abe prof 23873543 May  7 16:26 /home/professor/yasu-abe/lib/java/openapi-generator-cli.jar

このファイルを自分の~/lib/java/ディレクトリにコピーすることで、同じ手順で作業が進められます。

$ mkdir -p ~/lib/java/
$ cp ~yasu-abe/lib/java/openapi-generator-cli.jar ~/lib/java/

3.2. コードのダウンロード

適当な作業用のディレクトリを準備してから作業を行ないます。

$ git clone https://github.com/YasuhiroABE/docker-sccp-sinatra-sample.git
$ cd docker-sccp-sinatra-sample

3.3. Makefileの書き換え

Makefileの先頭は次のようになっています。

OAGEN_CLI = openapi-generator-cli
OASV_CLI = $(HOME)/.local/bin/openapi-spec-validator

これを次のように変更します。

OAGEN_CLI = java -jar ~/lib/java/openapi-generator-cli.jar
OASV_CLI = $(HOME)/.local/bin/openapi-spec-validator

この後では、make gen-codeコマンドに成功します。

$ make gen-code

3.4. bundleコマンドの準備

gemコマンドはインストールされているので、これを利用して、bundle(bundler)コマンドを配置します。

## このコマンドはどこのディレクトリでも実行できます。
$ gem install bundler

コマンドは ~/bin/ に配置されます。

3.5. サーバーの実行

ここからは、docker-sccp-sinatra-sampleディレクトリで作業を続けます。

$ cd code
$ cp ../api.default_api.rb api/default_api.rb
$ cp ../views.header.erubis lib/views/header.erubis
$ cp ../views.main.erubis lib/views/main.erubis
$ make run

全員がaplisv2.u-aizu.ac.jpで同じ作業を行なうと、ポート番号が競合するため、起動に失敗します。 Makefile中のPORT変数の設定を変更し、8080以外の番号に変更します。

また8080番ポートは、Webサーバー用のポート番号として一般的によく知られているため、システムが既に利用している場合もあります。

http://aplisv2.u-aizu.ac.jp:8081/search のようにサーバー名を指定することで、動作を確認することができます。

4. make run時の画面表示の例

make runを実行した時には、次のような出力になります。

aplisv212:$ make run
bundle config set path lib
bundle install
Using bundler 2.2.17
Using erubis 2.7.0
Using httpclient 2.8.3
Using json 2.5.1
Using ruby2_keywords 0.0.4
Using mustermann 1.1.1
Using nio4r 2.5.7
Using puma 5.3.0
Using rack 2.2.3
Using rack-protection 2.1.0
Using tilt 2.0.10
Using sinatra 2.1.0
Using sinatra-cross_origin 0.4.0
Bundle complete! 6 Gemfile dependencies, 13 gems now installed.
Bundled gems are installed into `./lib`
bundle exec rackup --host 0.0.0.0 --port 8081
Puma starting in single mode...
* Puma version: 5.3.0 (ruby 2.5.5-p157) ("Sweetnighter")
*  Min threads: 0
*  Max threads: 5
*  Environment: development
*          PID: 1519658
* Listening on http://0.0.0.0:8081
Use Ctrl-C to stop
163.143.xxx.xxx - - [10/May/2021:13:49:00 +0900] "GET /search HTTP/1.1" 200 6021 0.2088
163.143.xxx.xxx - - [10/May/2021:13:49:01 +0900] "GET /favicon.ico HTTP/1.1" 404 521 0.0012
^C- Gracefully stopping, waiting for requests to finish
=== puma shutdown: 2021-05-10 13:49:03 +0900 ===
- Goodbye!

5. まとめ

CentOS8は安定稼働を目指しているため、標準でインストールされているコマンドは少し古いものになります。

アプリケーションを開発するために必要な機能を最低限は備えていますが、必要なコマンドやライブラリなどのファイルを配置する必要があります。