GogsとDroneを使って軽量なCICD環境をローカル環境で構築

軽量なGitサーバのGogsとCI/CDサーバのDroneをDocker Composeを使ってローカル環境で構築します。

またGogsとDroneはGo言語で作られているので、コンテナのサイズも小さく、軽量です。次のようにコンテナ毎のメトリクスをみても非常に小さいことがわかります。

Docker DesktopのResource Usageでコンテナのメトリクスを確認

GitLabやJenkinsを使ったCI/CD環境もいいのですが、常時メモリを多く必要とします。ローカル環境で手軽にCI/CD環境を構築したい場合はGogsとDroneがオススメです。

CI/CD環境構築に必要なソフトウェア

今回のCI/CD環境は次のソフトウェアを使って構築します。

名前 説明
Drone Go言語で作られた軽量なCI/CDツール
Gogs Go言語で作られた軽量なGitサーバ

環境構築に必要なソフトウェア

今回の環境構築に必要なソフトウェアは次のとおりです。

名前 説明
Docker コンテナ型のアプリケーション実行環境
Docker Compose 複数のDockerコンテナを一括で構築・起動するためのツール

検証環境

今回は下記の環境で動作を確認しました。(2023年11月15日時点で最新のバージョンを使用しています。)

  • Windows 11 Pro
  • Docker Desktop 4.21.1
  • VSCode 1.84.2

DroneとGogsのコンテナの構築・起動

早速ですが、Docker Composeを使ってDroneとGogsのコンテナを構築します。次の手順で構築します。

  1. プロジェクトの作成

DroneとGogsのDockerコンテナを構築するためのプロジェクトを作成します。cicdのフォルダを作成します。

  1. docker-compose.yamlの作成

cicdのフォルダの中にdocker-compose.yamlファイルを作成して次を記述してください。

docker-compose.yaml

version: '3' services: drone-server: image: drone/drone:2.20.0 ports: - 8080:80 - 443:443 restart: always depends_on: - gogs-app volumes: - /var/run/docker.sock:/var/run/docker.sock - ./drone_server/data:/data environment: - DRONE_GIT_ALWAYS_AUTH=false - DRONE_SERVER_HOST=http://cicd.local:8080 - DRONE_GOGS_SERVER=http://cicd.local:3000 - DRONE_RPC_SECRET=cc00bf8e54a17125d4cdf8dd98cb9460 - DRONE_SERVER_PROTO=http extra_hosts: - cicd.local:host-gateway drone-runner: image: drone/drone-runner-docker:1.8.3 platform: linux/amd64 restart: always depends_on: - drone-server - gogs-app volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - DRONE_RUNNER_CAPACITY=2 - DRONE_RPC_HOST=drone-server:80 - DRONE_RPC_SECRET=cc00bf8e54a17125d4cdf8dd98cb9460 extra_hosts: - cicd.local:host-gateway gogs-db: image: postgres:10-alpine restart: always environment: - "POSTGRES_USER=gogs" - "POSTGRES_PASSWORD=gogspass" - "POSTGRES_DB=gogs" volumes: - "./gogs/db:/var/lib/postgresql/data" gogs-app: image: gogs/gogs:0.13 restart: always ports: - "10022:22" - "3000:3000" environment: - "RUN_CROND=true" volumes: - "./gogs/app:/data" depends_on: - gogs-db extra_hosts: - cicd.local:host-gateway

上記のdocker-compose.yamlファイルでは次の設定を行っています。

  • Droneの管理画面にアクセスするためのポートを8080に設定
  • Gogsの管理画面にアクセスするためのポートを3000に設定
  • GogsのSSHポートを10022に設定
  • Gogsのデータベースのユーザ名をgogsに設定
  • Gogsのデータベースのパスワードをgogspassに設定
  • Gogsのデータベースの名前をgogsに設定
  • Gogsのデータベースのデータを./gogs/dbに保存
  • Gogsのアプリケーションのデータを./gogs/appに保存
  • Droneのデータを./drone_server/dataに保存
  • Droneの管理画面にアクセスするためのホスト名をcicd.localに設定
extra_hostsの設定

今回ローカル環境でのみ(外部にURLを公開しない)構築する場合はdocker-compose.yamlの各コンテナに対してextra_hostsの設定を追加する必要があります。

extra_hostsの設定

extra_hosts: - cicd.local:host-gateway

この設定を追加することにより、各コンテナからcicd.localというホスト名でホストOSのIPアドレスにアクセスできるようになります。DroneとGogsのコンテナはcicd.localというホスト名でアクセスできるようになっています。

  • Droneサーバ:http://cicd.local:8080
  • Gogsサーバ:http://cicd.local:3000
  1. コンテナの起動

DroneとGogsのDockerコンテナを生成し起動します。cicdフォルダの場所で次のコマンドを実行します。

コマンド実行

docker-compose up -d
  1. コンテナの起動確認

次のコマンドを実行してコンテナが起動していることを確認してください。

コマンド実行

docker-compose ps

次のように表示されればOKです。

これでDroneとGogsのコンテナが構築されました。

ホスト名の名前解決

GogsとDroneのコンテナはcicd.localというホスト名でアクセスできるようになっています。次の手順でホスト名の名前解決を行います。今回はhostsファイルを編集して名前解決を行います。

  1. hostsファイルの編集

/etc/hosts(Windowsの場合はC:\Windows\System32\drivers\etc\hosts)ファイルを編集します。次の行を追加してください。

/etc/hosts

127.0.0.1 cicd.local

これでホスト名の名前解決が完了しました。

Gogsの初期設定

Gogsの初期設定を行います。

  1. Gogsの初期設定画面にアクセス

次のURLにブラウザでアクセスします。

http://cicd.local:3000/

  1. Gogsの初期設定(DB設定)

Gogsの初期設定画面が表示されますので、次の部分を入力してくさい。をクリックしてください。

  • ホスト:gogs-db:5432
  • パスワード:gogspass

Gogs初期設定画面

  1. Gogsの初期設定(アプリケーション設定)

初期設定画面の中段にある次の項目も入力してください。

  • HTTPポート:3000
  • アプリケーションのURL:https://cicd.local:3000

  1. Gogsの初期設定(オプション設定)

初期設定画面の下段にある「オプション設定」の箇所は次の箇所を入力してください。入力したら「gogsをインストール」をクリックしてください。

  • CAPTCHAを有効にする:チェックを外す
  • ユーザ名:root
  • パスワード:rootroot
  • パスワード確認:rootroot
  • メールアドレス:[email protected]

これでGogsの初期設定が完了しました。

リモートリポジトリの作成

次にGogsを使ってリモートリポジトリを作成します。次の手順でリモートリポジトリを作成します。

  1. 新しいリポジトリの作成

画面右上の「+」ボタンをクリックして「新しいリポジトリ」をクリックしてください。

  1. 新しいリポジトリの設定

リポジトリ名を「task」と入力して「リポジトリの作成」をクリックしてください。

  1. リポジトリの作成

Gogsにリポジトリが作成されました。リポジトリのURLコピーしておいてください。

これでリモートリポジトリの作成が完了しました。

ローカルリポジトリを作成してリモートリポジトリにプッシュ

ローカルリポジトリを作成してリモートリポジトリにプッシュします。次の手順でローカルリポジトリを作成してリモートリポジトリにプッシュします。

  1. ローカルリポジトリを作成

ローカルリポジトリを作成します。taskフォルダを作成して移動してください。

コマンド実行

mkdir task
cd task
  1. ローカルリポジトリを初期化

ローカルリポジトリを初期化します。

コマンド実行

git init
  1. リモートリポジトリを追加

リモートリポジトリを追加します。

コマンド実行

git remote add origin <GogsのリモートリポジトリのURL>
  1. ファイルを作成

taskフォルダの場所でREADME.mdファイルを作成して次を記述してください。

task/README.md

# task
  1. ファイルをコミット

ファイルをコミットします。

コマンド実行

git add .
git commit -m "first commit"
  1. ファイルをプッシュ

ファイルをプッシュします。

コマンド実行

git push -u origin master
  1. ユーザ名とパスワードの入力

Gogsのユーザ名とパスワードを求められますので入力してください。

  1. リモートリポジトリの確認

Gogsのリポジトリページにアクセスしてください。リモートリポジトリにファイルがプッシュされていることを確認してください。

これでローカルリポジトリを作成してリモートリポジトリにプッシュが完了しました。

Droneパイプラインファイルを作成

Droneのパイプラインファイルを作成してGogsのリポジトリにプッシュします。次の手順でDroneのパイプラインファイルを作成してGogsのリポジトリにプッシュします。

  1. パイプラインファイルを作成

taskフォルダの場所で.drone.ymlファイルを作成して次を記述してください。

task/.drone.yml

kind: pipeline type: docker name: default steps: - name: hello world image: alpine commands: - echo hello world!!
  1. パイプラインファイルをコミット

パイプラインファイルをコミットします。

コマンド実行

git add .
git commit -m "add pipeline file"
  1. パイプラインファイルをプッシュ

パイプラインファイルをプッシュします。

コマンド実行

git push -u origin master
  1. ユーザ名とパスワードの入力

Gogsのユーザ名とパスワードを求められますので入力してください。

  1. リポジトリの確認

Gogsのリポジトリページにアクセスしてください。Droneのパイプラインファイルがアップロードされていることを確認してください。

Droneの初期設定

Droneの管理画面にアクセスできます。

  1. Droneの管理画面にアクセス

次のURLよりアクセスできます。表示されたら「Continue」をクリックしてください。

http://localhost:8080/

Drone管理画面

  1. Droneの管理画面にログイン

Gogsにサインインする画面が表示されます。次のユーザ名とパスワードを入力して「Sign In」をクリックしてください。

  1. Droneのアカウント登録

Droneのアカウントを登録する画面が表示されますので次のとおりに入力して「SUBMIT」をクリックしてください。

  1. Droneのダッシュボード画面の表示

Droneの管理画面が表示されます。

これでDroneの初期設定が完了しました。

ビルドの実行

Gogsと連携していますので、先ほどプッシュしたリポジトリが表示されていることを確認し、クリックしてください。

  1. リポジトリの選択

ダッシュボード画面にGogsのリポジトリが表示されていますので、クリックしてください。

  1. Drone管理画面でリポジトリのアクティベート

リポジトリ詳細画面にて「Activate Repository」をクリックしてください。

  1. 新しいビルドの作成

次の画面に遷移するとアクティベートは完了しますので右上にある「New Build」ボタンをクリックしてください。

「Branch」の箇所に「master」を入力して「Create」をクリックしてください。

  1. ビルドの確認

ビルドが開始されます。「Builds」タブに移動してください。ビルドが完了すると「Success」になります。

「EXECUTIONS」の「first commit」の部分をクリックしてください。

次のようにタスクの詳細なログを確認できます。

これでビルドの実行が完了しました。

ローカル環境でGogsのWebhookを有効にする

デフォルトではGogsはローカル環境でのWebhookの送信を許可していません。ローカル環境でGogsのWebhookを有効にするためには次の手順で設定を変更する必要があります。

  1. Gogsの設定ファイルを編集

Gogsの設定ファイルを編集します。gogs/app/gogs/conf/app.iniファイルを開いてください。LOCAL_NETWORK_ALLOWLISTを追加し値は*にします。これにより、ローカル環境にある他のホストに対してもWebHookを送信できるようになります。

gogs/app/gogs/conf/app.ini

:
(省略)
:
[security]
INSTALL_LOCK = true
SECRET_KEY   = xxxxxxxxxxxx
LOCAL_NETWORK_ALLOWLIST = *
  1. Gogsのコンテナを再起動

Gogsのコンテナを再起動します。

コマンド実行

docker-compose restart gogs-app

これで、ローカル環境でGogsのWebhookを有効にできました。

ローカルリポジトリを更新してプッシュしたら自動でビルドが実行されるか確認

ローカルリポジトリを更新してプッシュしたら自動でビルドが実行されるか確認します。次の手順で確認します。

  1. ローカルリポジトリを更新

taskフォルダの場所でREADME.mdファイルを編集してください。

task/README.md

# task
- task1 - task2
  1. ローカルリポジトリをコミット

ローカルリポジトリをコミットします。

コマンド実行

git add .
git commit -m "add task1 and task2"
  1. ローカルリポジトリをプッシュ

ローカルリポジトリをプッシュします。

コマンド実行

git push -u origin master
  1. ビルドの確認

Droneのビルドページにアクセスしてください。ビルドが開始されていることを確認してください。

これでローカルリポジトリを更新してプッシュしたら自動でビルドが実行されることが確認できました。

DinD(Docker in Docker)でのビルド

DroneはDinD(Docker in Docker)でのビルドが可能です。

DinD(Docker in Docker)

DinD(Docker in Docker)とはDockerコンテナの中でDockerコンテナを実行することです。DinDを使うと、Dockerコンテナの中でDockerコマンドを実行できます。

コンテナイメージのビルドや、コンテナレジストリにプッシュができます。

次の手順でDinDでのビルドを確認します。

Droneのリポジトリ設定を変更

Droneのリポジトリ設定を変更します。Droneでは各リポジトリの設定項目のtrustedtrueにすることでDinDでのビルドが可能になります。次の手順でリポジトリ設定を変更します。

次の手順でリポジトリ設定を変更します。

  1. sqlite3コマンドのインストール

Droneのコンテナに入ってsqlite3コマンドをインストールします。

コマンド実行(Windowsの場合)

winget install SQLite.SQLite

コマンド実行(Macの場合)

brew install sqlite3
  1. sqlite3コマンドの実行

Droneのコンテナに入ってsqlite3コマンドを実行します。

コマンド実行

sqlite3 drone_server/data/database.sqlite "update repos set repo_trusted=1;"
  1. 更新の確認

正常に更新されたか確認します。

コマンド実行

sqlite3 drone_server/data/database.sqlite "select repo_name,repo_trusted from repos;"

次のように表示されればOKです。repo_trustedの値が1になっていれば正常に更新されています。

次の手順でDinDでのビルドを確認します。

DinDコンテナを使ったビルドの実行

DinDコンテナを使ったビルドを実行します。次の手順でDinDコンテナを使ったビルドを実行します。

  1. パイプラインファイルを編集

taskフォルダの場所で.drone.ymlファイルを編集してください。

task/.drone.yml

kind: pipeline name: default steps: - name: test image: docker:dind volumes: - name: dockersock path: /var/run commands: - sleep 5 # DinDの起動待ち - docker ps -a services: - name: docker image: docker:dind privileged: true volumes: - name: dockersock path: /var/run volumes: - name: dockersock temp: {}
  1. パイプラインファイルをコミット

パイプラインファイルをコミットします。

コマンド実行

git add .
git commit -m "add dind"
  1. パイプラインファイルをプッシュ

パイプラインファイルをプッシュします。

コマンド実行

git push -u origin master
  1. ビルドの確認

Droneのビルドページにアクセスしてください。ビルドが成功してdockerコマンドが実行できていることを確認してください。

まとめ

今回はGogsとDroneを使って軽量なCI/CD環境をローカル環境で構築しました。GogsとDroneは軽量なので、ローカル環境での利用に適しています。また、GogsとDroneはDocker Composeを使って簡単に構築できるので、ローカル環境での利用に適しています。

コメントを残す

マークダウン形式でコメントを入力できます。

アップロードファイルの最大サイズ: 512 MB。 画像, 音声, 動画, 文書, スプレッドシート, 対話型, テキスト, アーカイブ, コード, その他 をアップロードできます。 Youtube、Facebook、Twitter および他サービスへのリンクは自動的にコメント内に埋め込まれます。 ここにファイルをドロップ

プロフィール背景
Ryosuke
Ryosuke

ITエンジニア & 講師

クラウドネイティブやアーキテクチャ設計の講師として活動しながら、ITエンジニアのDXを推進するために新しい技術やベストプラクティスを常に学び、エンジニアの生産性と開発品質の向上に貢献することを目指しています。猫5匹飼っています。山奥のポツンと一軒家に住んでいて、事務所は海の近くです。