CI/CDツールDroneを使ってみた② アプリのデプロイ
お疲れ様です。
いろんなwaitlistに登録しまくっているキョです。
最近本当にAI関連の話題が盛り上がっていますね。
去年の今頃はメタバース、web3が流行ったと思いますが、今年はやっぱり生成型AIですね!
さて、前回はDroneのインストールを行いました。
今回は自宅のLinuxサーバーにアプリをデプロイするパイプラインの設定を記録です。
前提
私の自宅にはLinuxサーバー一台しかないので、
droneランナーはアプリのデプロイ先と同じサーバーになります。
droneランナーとデプロイ先が違う場合は、違う実現設定方法が必要かもしれないです。
デプロイ用パイプライン
下記が完成したパイプライン設定ファイルです。
kind: pipeline
type: docker
name: build
steps:
- name: "docker restart"
image: docker/compose
volumes:
- name: dockersock
path: /var/run/docker.sock
commands:
- "containername={アプリのDockerコンテナ名}"
- "imagename={アプリのDockerイメージ名}"
- "if [ `docker ps | grep $containername | wc -l` != \"0\" ]; then docker stop $containername ; fi"
- "if [ `docker ps -a | grep $containername | wc -l` != \"0\" ]; then docker rm $containername ; fi"
- "if [ `docker images | grep $imagename | wc -l` != \"0\" ]; then docker rmi $imagename ; fi"
- "docker-compose up -d"
volumes:
- name: dockersock
host:
path: /var/run/docker.sock
パイプライン詳細
実はパイプラインでやっていることは簡単です。
やっているのは
- サーバーのアプリのDockerコンテナを再起動
です。
パイプラインを利用して、Dockerコンテナを再起動するための必須設定
droneランナーからサーバーのDockerコンテナを起動するためには、
- /var/run/docker.sock のマウント
- リポジトリのROOTパスにdocker-composeファイルを配置
を行う必要があります。
/var/run/docker.sock のマウント
/var/run/docker.sock のマウントはパイプラインファイルの下記部分になります。
volumes:
- name: dockersock
host:
path: /var/run/docker.sock
そして、/var/run/docker.sock をマウントするためには、
Drone側でリポジトリを信頼する設定を行う必要がありますが、
リポジトリを信頼するためには管理者を利用して、Droneにログインしないといけないです。
管理者ではない場合は、画像にある「Trusted」チェックボックスが表示されません。
でも、どうすれば管理者でログインできるかがちょっと引っかかるポイントでした。
前回の記事では、drone-serverのdocker-composeは以下のようになっています。
services:
drone-server:
image: drone/drone:1
ports:
# droneサーバー外部に公開するポート(giteaのコールバックURLのドメインとdroneランナーの「DRONE_RPC_HOST」もこちらを指定)
- 8090:80
# 正直何のために指定しているかわからないが、ドキュメントにあったので指定
- 443:443
volumes:
- /var/lib/drone:/var/lib/drone/
restart: always
environment:
# 必要な文字列値は、Giteaサーバアドレス
- DRONE_GITEA_SERVER=http://192.168.0.100:3000/
# 必要な文字列値は、Gitea oauthクライアントID
- DRONE_GITEA_CLIENT_ID=
# 必要な文字列値は、Gitea oauthクライアントシークレット
- DRONE_GITEA_CLIENT_SECRET=
# 必要な文字列値は、共有シークレット
- DRONE_RPC_SECRET=
# 必要な文字列値は、外部ホスト名またはIPアドレス
- DRONE_SERVER_HOST=192.168.0.100:8090
# 必要な文字列値は、外部プロトコルスキーム(httpまたはhttps)
- DRONE_SERVER_PROTO=http
管理者でログインするためには、「environment」に以下の環境変数を追加する必要があります。
# 必要な文字列値は、gitea側ログインユーザー名
- DRONE_USER_CREATE=username:{gitea側ログインユーザー名},admin:true
最後のdrone-serverのdocker-composeは以下です。
services:
drone-server:
image: drone/drone:1
ports:
# droneサーバー外部に公開するポート(giteaのコールバックURLのドメインとdroneランナーの「DRONE_RPC_HOST」もこちらを指定)
- 8090:80
# 正直何のために指定しているかわからないが、ドキュメントにあったので指定
- 443:443
volumes:
- /var/lib/drone:/var/lib/drone/
restart: always
environment:
# 必要な文字列値は、Giteaサーバアドレス
- DRONE_GITEA_SERVER=http://192.168.0.100:3000/
# 必要な文字列値は、Gitea oauthクライアントID
- DRONE_GITEA_CLIENT_ID=
# 必要な文字列値は、Gitea oauthクライアントシークレット
- DRONE_GITEA_CLIENT_SECRET=
# 必要な文字列値は、共有シークレット
- DRONE_RPC_SECRET=
# 必要な文字列値は、外部ホスト名またはIPアドレス
- DRONE_SERVER_HOST=192.168.0.100:8090
# 必要な文字列値は、外部プロトコルスキーム(httpまたはhttps)
- DRONE_SERVER_PROTO=http
# 必要な文字列値は、gitea側ログインユーザー名
- DRONE_USER_CREATE=username:{gitea側ログインユーザー名},admin:true
リポジトリのROOTパスにdocker-composeファイルを配置
私の場合すでにリポジトリにDockerファイルがありましたので、
以下のように簡単なdocker-composeファイルを作成しています。
version: '3'
services:
aria2client:
ports:
- 5173:5173
restart: always
build:
context: .
dockerfile: Dockerfile
デプロイ
変更をリポジトリにpushして、デプロイできるかを確認してみました。
うまく動いていますね。
終わり
今回はただ自宅のLinuxサーバーのアプリのDockerコンテナを再起動する形でデプロイしてみました。
やっている途中はいろいろ考えました。
- droneランナーは必ずアプリサーバーに設定しないとダメなのか
- droneランナーがアプリサーバーと違うサーバーに配置されている場合はどうデプロイするか
- Dockerコンテナで起動するアプリではない場合どうデプロイするか
これらについても今後試してみたいと思います。
みなさんも自宅で簡単なアプリをデプロイする時は、試してみてください!
Discussion