🛫

CI/CDツールDroneを使ってみた② アプリのデプロイ

2023/03/25に公開

お疲れ様です。
いろんなwaitlistに登録しまくっているキョです。
最近本当にAI関連の話題が盛り上がっていますね。
去年の今頃はメタバース、web3が流行ったと思いますが、今年はやっぱり生成型AIですね!

さて、前回はDroneのインストールを行いました。
今回は自宅のLinuxサーバーにアプリをデプロイするパイプラインの設定を記録です。

前提

私の自宅にはLinuxサーバー一台しかないので、
droneランナーはアプリのデプロイ先と同じサーバーになります。
droneランナーとデプロイ先が違う場合は、違う実現設定方法が必要かもしれないです。

デプロイ用パイプライン

下記が完成したパイプライン設定ファイルです。
https://docs.drone.digitalstacks.net/l/ja/quick-start/docker-pipelines

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