軽量な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のコンテナを構築します。次の手順で構築します。
- プロジェクトの作成
DroneとGogsのDockerコンテナを構築するためのプロジェクトを作成します。cicd
のフォルダを作成します。
- 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
に設定
今回ローカル環境でのみ(外部に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
- コンテナの起動
DroneとGogsのDockerコンテナを生成し起動します。cicd
フォルダの場所で次のコマンドを実行します。
コマンド実行
docker-compose up -d
- コンテナの起動確認
次のコマンドを実行してコンテナが起動していることを確認してください。
コマンド実行
docker-compose ps
次のように表示されればOKです。
これでDroneとGogsのコンテナが構築されました。
ホスト名の名前解決
GogsとDroneのコンテナはcicd.local
というホスト名でアクセスできるようになっています。次の手順でホスト名の名前解決を行います。今回はhostsファイルを編集して名前解決を行います。
- hostsファイルの編集
/etc/hosts
(Windowsの場合はC:\Windows\System32\drivers\etc\hosts
)ファイルを編集します。次の行を追加してください。
/etc/hosts
127.0.0.1 cicd.local
これでホスト名の名前解決が完了しました。
Gogsの初期設定
Gogsの初期設定を行います。
- Gogsの初期設定画面にアクセス
次のURLにブラウザでアクセスします。
- Gogsの初期設定(DB設定)
Gogsの初期設定画面が表示されますので、次の部分を入力してくさい。をクリックしてください。
- ホスト:
gogs-db:5432
- パスワード:
gogspass
Gogs初期設定画面
- Gogsの初期設定(アプリケーション設定)
初期設定画面の中段にある次の項目も入力してください。
- HTTPポート:
3000
- アプリケーションのURL:
https://cicd.local:3000
- Gogsの初期設定(オプション設定)
初期設定画面の下段にある「オプション設定」の箇所は次の箇所を入力してください。入力したら「gogsをインストール」をクリックしてください。
- CAPTCHAを有効にする:チェックを外す
- ユーザ名:
root
- パスワード:
rootroot
- パスワード確認:
rootroot
- メールアドレス:
[email protected]
これでGogsの初期設定が完了しました。
リモートリポジトリの作成
次にGogsを使ってリモートリポジトリを作成します。次の手順でリモートリポジトリを作成します。
- 新しいリポジトリの作成
画面右上の「+」ボタンをクリックして「新しいリポジトリ」をクリックしてください。
- 新しいリポジトリの設定
リポジトリ名を「task」と入力して「リポジトリの作成」をクリックしてください。
- リポジトリの作成
Gogsにリポジトリが作成されました。リポジトリのURLコピーしておいてください。
これでリモートリポジトリの作成が完了しました。
ローカルリポジトリを作成してリモートリポジトリにプッシュ
ローカルリポジトリを作成してリモートリポジトリにプッシュします。次の手順でローカルリポジトリを作成してリモートリポジトリにプッシュします。
- ローカルリポジトリを作成
ローカルリポジトリを作成します。task
フォルダを作成して移動してください。
コマンド実行
mkdir task
cd task
- ローカルリポジトリを初期化
ローカルリポジトリを初期化します。
コマンド実行
git init
- リモートリポジトリを追加
リモートリポジトリを追加します。
コマンド実行
git remote add origin <GogsのリモートリポジトリのURL>
- ファイルを作成
task
フォルダの場所でREADME.md
ファイルを作成して次を記述してください。
task/README.md
# task
- ファイルをコミット
ファイルをコミットします。
コマンド実行
git add .
git commit -m "first commit"
- ファイルをプッシュ
ファイルをプッシュします。
コマンド実行
git push -u origin master
- ユーザ名とパスワードの入力
Gogsのユーザ名とパスワードを求められますので入力してください。
- リモートリポジトリの確認
Gogsのリポジトリページにアクセスしてください。リモートリポジトリにファイルがプッシュされていることを確認してください。
これでローカルリポジトリを作成してリモートリポジトリにプッシュが完了しました。
Droneパイプラインファイルを作成
Droneのパイプラインファイルを作成してGogsのリポジトリにプッシュします。次の手順でDroneのパイプラインファイルを作成してGogsのリポジトリにプッシュします。
- パイプラインファイルを作成
task
フォルダの場所で.drone.yml
ファイルを作成して次を記述してください。
task/.drone.yml
kind: pipeline
type: docker
name: default
steps:
- name: hello world
image: alpine
commands:
- echo hello world!!
- パイプラインファイルをコミット
パイプラインファイルをコミットします。
コマンド実行
git add .
git commit -m "add pipeline file"
- パイプラインファイルをプッシュ
パイプラインファイルをプッシュします。
コマンド実行
git push -u origin master
- ユーザ名とパスワードの入力
Gogsのユーザ名とパスワードを求められますので入力してください。
- リポジトリの確認
Gogsのリポジトリページにアクセスしてください。Droneのパイプラインファイルがアップロードされていることを確認してください。
Droneの初期設定
Droneの管理画面にアクセスできます。
- Droneの管理画面にアクセス
次のURLよりアクセスできます。表示されたら「Continue」をクリックしてください。
Drone管理画面
- Droneの管理画面にログイン
Gogsにサインインする画面が表示されます。次のユーザ名とパスワードを入力して「Sign In」をクリックしてください。
- Droneのアカウント登録
Droneのアカウントを登録する画面が表示されますので次のとおりに入力して「SUBMIT」をクリックしてください。
- Your Email:
[email protected]
- Your Username:
root
- Company Name:
root
- Droneのダッシュボード画面の表示
Droneの管理画面が表示されます。
これでDroneの初期設定が完了しました。
ビルドの実行
Gogsと連携していますので、先ほどプッシュしたリポジトリが表示されていることを確認し、クリックしてください。
- リポジトリの選択
ダッシュボード画面にGogsのリポジトリが表示されていますので、クリックしてください。
- Drone管理画面でリポジトリのアクティベート
リポジトリ詳細画面にて「Activate Repository」をクリックしてください。
- 新しいビルドの作成
次の画面に遷移するとアクティベートは完了しますので右上にある「New Build」ボタンをクリックしてください。
「Branch」の箇所に「master」を入力して「Create」をクリックしてください。
- ビルドの確認
ビルドが開始されます。「Builds」タブに移動してください。ビルドが完了すると「Success」になります。
「EXECUTIONS」の「first commit」の部分をクリックしてください。
次のようにタスクの詳細なログを確認できます。
これでビルドの実行が完了しました。
ローカル環境でGogsのWebhookを有効にする
デフォルトではGogsはローカル環境でのWebhookの送信を許可していません。ローカル環境でGogsのWebhookを有効にするためには次の手順で設定を変更する必要があります。
- 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 = *
- Gogsのコンテナを再起動
Gogsのコンテナを再起動します。
コマンド実行
docker-compose restart gogs-app
これで、ローカル環境でGogsのWebhookを有効にできました。
ローカルリポジトリを更新してプッシュしたら自動でビルドが実行されるか確認
ローカルリポジトリを更新してプッシュしたら自動でビルドが実行されるか確認します。次の手順で確認します。
- ローカルリポジトリを更新
task
フォルダの場所でREADME.md
ファイルを編集してください。
task/README.md
# task
- task1
- task2
- ローカルリポジトリをコミット
ローカルリポジトリをコミットします。
コマンド実行
git add .
git commit -m "add task1 and task2"
- ローカルリポジトリをプッシュ
ローカルリポジトリをプッシュします。
コマンド実行
git push -u origin master
- ビルドの確認
Droneのビルドページにアクセスしてください。ビルドが開始されていることを確認してください。
これでローカルリポジトリを更新してプッシュしたら自動でビルドが実行されることが確認できました。
DinD(Docker in Docker)でのビルド
DroneはDinD(Docker in Docker)でのビルドが可能です。
DinD(Docker in Docker)とはDockerコンテナの中でDockerコンテナを実行することです。DinDを使うと、Dockerコンテナの中でDockerコマンドを実行できます。
コンテナイメージのビルドや、コンテナレジストリにプッシュができます。
次の手順でDinDでのビルドを確認します。
Droneのリポジトリ設定を変更
Droneのリポジトリ設定を変更します。Droneでは各リポジトリの設定項目のtrusted
をtrue
にすることでDinDでのビルドが可能になります。次の手順でリポジトリ設定を変更します。
次の手順でリポジトリ設定を変更します。
- sqlite3コマンドのインストール
Droneのコンテナに入ってsqlite3コマンドをインストールします。
コマンド実行(Windowsの場合)
winget install SQLite.SQLite
コマンド実行(Macの場合)
brew install sqlite3
- sqlite3コマンドの実行
Droneのコンテナに入ってsqlite3コマンドを実行します。
コマンド実行
sqlite3 drone_server/data/database.sqlite "update repos set repo_trusted=1;"
- 更新の確認
正常に更新されたか確認します。
コマンド実行
sqlite3 drone_server/data/database.sqlite "select repo_name,repo_trusted from repos;"
次のように表示されればOKです。repo_trusted
の値が1
になっていれば正常に更新されています。
次の手順でDinDでのビルドを確認します。
DinDコンテナを使ったビルドの実行
DinDコンテナを使ったビルドを実行します。次の手順でDinDコンテナを使ったビルドを実行します。
- パイプラインファイルを編集
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: {}
- パイプラインファイルをコミット
パイプラインファイルをコミットします。
コマンド実行
git add .
git commit -m "add dind"
- パイプラインファイルをプッシュ
パイプラインファイルをプッシュします。
コマンド実行
git push -u origin master
- ビルドの確認
Droneのビルドページにアクセスしてください。ビルドが成功してdocker
コマンドが実行できていることを確認してください。
まとめ
今回はGogsとDroneを使って軽量なCI/CD環境をローカル環境で構築しました。GogsとDroneは軽量なので、ローカル環境での利用に適しています。また、GogsとDroneはDocker Composeを使って簡単に構築できるので、ローカル環境での利用に適しています。