Fedora ServerにWoodpecker CIをインストールする:Gitea向けの軽量なCI/CDソリューション

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Woodpecker CI:Jenkinsがリソースを消費しすぎると感じた時に

もしあなたが低スペックなVPS(例:2 vCPU、2GB RAM)を運用しているなら、Jenkinsをインストールすることは悪夢に近いかもしれません。JavaベースのJenkinsは、起動直後から少なくとも1GBのRAMを占有します。Dockerイメージのビルドや静的ウェブサイトのデプロイといった小規模なプロジェクトには、Woodpecker CIがよりスマートな代替案となります。私は2年以上、個人プロジェクトでFedora Serverを運用してきましたが、Woodpecker CIこそがDevOpsプロセスを最適化するための最後のピースだと感じています。

Woodpeckerは、完全なオープンソース時代のDrone CIの長所を継承しています。Go言語で記述されており、コンテナとして非常にスムーズに動作し、Giteaとの連携も非常に高速です。

実例比較:なぜWoodpeckerを選ぶのか?

設定に取り掛かる前に、一般的なツールとの違いを実際の数値で見てみましょう:

  • Jenkins: 多機能ですが重いです。安定動作には最低2GBのRAMが必要です。Groovy Pipelineの設定は初心者にはやや複雑です。
  • GitLab CI: 素晴らしいですが、巨大なGitLab本体が付属します。セルフホストする場合、システム全体で少なくとも4GB〜8GBのRAMが必要です。
  • GitHub Actions: 便利ですが、完全にクラウドに依存します。内部コードのセキュリティのためにオンプレミスで展開したい場合には不向きです。
  • Woodpecker CI: YAML(GitHub Actionsに類似)を使用します。Woodpecker Serverのメモリ消費量はわずか100MB〜200MB程度です。これは低スペックサーバーにとって理想的な数値です。

注意すべきメリットとデメリット

メリット:

  • ほぼ瞬時に起動します。
  • 完全なオープンソース(Apache 2.0)であり、有料機能による制限の心配がありません。
  • .woodpecker.ymlファイルによるパイプライン設定は非常に直感的です。
  • Gitea、Forgejo、GitHub、GitLabを良好にサポートしています。

デメリット:

  • プラグインの数はJenkinsより少ないです。しかし、一般的なビルド/デプロイのニーズの95%はカバーできています。
  • 日本語のドキュメントやコミュニティはまだそれほど多くありません。

Fedora ServerとWoodpeckerを組み合わせる強み

Fedora Serverは常に最新のカーネルを採用し、Podmanが標準搭載されています。Dockerの代わりに、Fedora上のPodmanはSELinuxを通じてより優れたセキュリティメカニズムを提供します。このプラットフォームでWoodpeckerを展開することで、複雑な調整をすることなく、最新のコンテナビルドの安定性を享受できます。

ステップ 1:GiteaでOAuthアプリケーションを設定する

Woodpeckerがリポジトリにアクセスできるように、Giteaでセキュリティブリッジを作成する必要があります:

  1. Giteaにアクセスし、Settings -> Applicationsに移動します。
  2. Manage OAuth2 Applicationsセクションで、アプリケーション名を Woodpecker CI に設定します。
  3. Redirect URI:サーバーのアドレスを https://ci.yourdomain.com/authorize の形式で入力します。
  4. Create Application をクリックした後、Client IDClient Secret をメモ帳などにコピーしておきます。これらはサーバー設定ステップで必要になります。

ステップ 2:FedoraでPodman環境を準備する

Fedora Serverには既にPodmanがインストールされていますが、podman-compose を追加し、Agentがシステムと通信できるようにソケットを有効化する必要があります。

sudo dnf update -y
sudo dnf install podman podman-compose -y

# Woodpecker Agentがビルドコンテナを作成できるようにソケットを有効化
sudo systemctl enable --now podman.socket

ls -al /run/podman/podman.sock コマンドでソケットの状態を確認します。ソケットファイルが表示されれば成功です。

ステップ 3:Podman Composeを使用してWoodpeckerをデプロイする

管理を容易にするため、ServerとAgentを1つのファイルにまとめます。作業ディレクトリを作成しましょう:

mkdir ~/woodpecker && cd ~/woodpecker
nano docker-compose.yml

ファイルに以下の設定内容を貼り付けます。環境変数は、先ほど作成したOAuth情報に合わせて変更してください:

version: '3'

services:
  woodpecker-server:
    image: woodpeckerci/woodpecker-server:latest
    volumes:
      - ./woodpecker-data:/var/lib/woodpecker/
    environment:
      - WOODPECKER_GITEA=true
      - WOODPECKER_GITEA_URL=https://git.yourdomain.com
      - WOODPECKER_GITEA_CLIENT=YOUR_CLIENT_ID
      - WOODPECKER_GITEA_SECRET=YOUR_CLIENT_SECRET
      - WOODPECKER_SERVER_ADDR=:8000
      - WOODPECKER_AGENT_SECRET=あなたの安全なランダム文字列
    ports:
      - 8000:8000
    restart: always

  woodpecker-agent:
    image: woodpeckerci/woodpecker-agent:latest
    command: agent
    volumes:
      - /run/podman/podman.sock:/var/run/docker.sock
    environment:
      - WOODPECKER_SERVER=woodpecker-server:9000
      - WOODPECKER_AGENT_SECRET=あなたの安全なランダム文字列
      - WOODPECKER_BACKEND=docker
    restart: always
    depends_on:
      - woodpecker-server

SELinuxに関するヒント: Fedoraはソケットへのアクセス権限に非常に厳格です。Permission Deniedエラーが発生した場合は、以下のコマンドを実行してコンテナによるcgroup管理を許可してください:

sudo setsebool -P container_manage_cgroup on

podman-compose up -d コマンドでシステムを起動します。

ステップ 4:プロジェクトのパイプラインを有効化する

ブラウザを開き、サーバーのポート8000にアクセスします。Giteaアカウントでログインしてください。コントロールパネルに既存のリポジトリがすべて表示されます。

対象のリポジトリで Enable をクリックするだけです。WoodpeckerはGitea側にWebhookを自動的に設定します。これ以降、コードをプッシュするたびにビルドプロセスが自動的に開始されます。

ステップ 5:サンプルパイプライン定義ファイルの作成

機能をテストするために、Node.jsプロジェクトのルートディレクトリに .woodpecker.yml ファイルを作成します:

pipeline:
  test:
    image: node:18-alpine
    commands:
      - npm install
      - npm test

  build-image:
    image: plugins/docker
    settings:
      repo: registry.yourdomain.com/my-app
      registry: registry.yourdomain.com
      username:
        from_secret: docker_user
      password:
        from_secret: docker_pass
    when:
      event: push
      branch: main

このファイルを main ブランチにプッシュすると、Woodpecker Agentは自動的にNode.jsイメージをプルしてテストを実行します。問題がなければ、ビルドを続行し、イメージをレジストリにプッシュします。

実際の運用経験

FedoraでWoodpeckerをしばらく使用してみて、3つの重要なポイントをまとめました:

  1. ディスク容量の解放: ビルドコンテナは不要なイメージを残しがちです。メモリ不足を避けるために、毎週 podman image prune -f を実行するcronjobを設定することをお勧めします。
  2. シークレットの保護: YAMLファイルにパスワードを直接記述しないでください。WoodpeckerのWebインターフェースにあるリポジトリ設定の Secrets 機能を使用しましょう。
  3. キャッシュによるビルドの高速化: 大規模なプロジェクトでは、キャッシュプラグインを使用して node_modulesvendor ディレクトリを保存してください。これにより、ビルド時間を5分から1分未満に短縮できる場合があります。

Woodpecker CIとFedora Serverの組み合わせは、運用コストをほぼゼロに抑えながら、非常にプロフェッショナルなDevOps環境を提供してくれます。設定がうまくいくことを願っています!

Share: