Rubyを いた台湾におけるイン
ターネット政党政治の実践

用2023.11.8@RubyWorldConf

日Teng Mu-Fan

CEO of 5xRuby CO., LTD• 台湾のRuby伝道師• 本では竜堂 終と呼ばれています• Chief Organizer of RubyConf
TaiwanRubyConf Taiwan 2023
• 2023/12/15~16 at 国立台北教育

大大学• 台湾最 級のRubyカンファレンス• MDD（Matz DrivenDevelopment） Conference• https://2023.rubyconf.tw

AGENDA力

1. 政党「時代 量（New Power Party）」の紹介及びオンライン参加の仕組
み2. システム開発経緯及び技術的負債の蓄積
3. リニューアルのプロセスと課題

時代量の紹介• 2015年に設立。
• https://www.newpowerparty.tw/• 現在は台湾第4の政党で、3名の国方力

一会議員と6名の地 議会議員がいる。
• 台湾唯 インターネットで主な運営している政党。

時代

力

入党申込

量ウェブサイトの主な機能

党費納入

寄付

党内選挙

サイト運営

•

年の最初の半年を「前期」、後の半年を「後期」とする。
• 期限 までに会費を納入しないと期限切れ(expired)ステータスになる。
• 期限切れの場合2年以内は補填できる。
• 2年を超えると退党(withdrawn)となり、補填でも党籍は戻らない。

日一

入党、会費期限計算とステータス変化党内選挙• 2つの最 意思決定機関委員を選

高出。
• 国会=立法院選挙の比例代表の候補者を党内投票で決める。

登録期間

投票期間

結果公告

システムで候補者として登開始前に、投票権のある党メールで全党員に選挙結果録。

員全員のメールアドレスにを送付

投票

公告

質問期間
党員（投票資格を持つ通知、この時点で投票権所み）はシステムで候補者に有者の名簿が確定する。投質問。

時点で有効な党員及び入党から定期間を超えているこ方日と。

紙を送付

開票

党員にメールで選挙開始を

票権の資格は、公告

用一

党内選挙のプロセスのシステムが結果を計算する

大用

方• 部の機能は開発後に継続利 できない• ほとんど仕様書がなく、テストコードもないため技術的負債が巨• 員交代時に 分な引き継ぎがない• 担当者も全ての機能の使い を把握していない• ほぼ機能変更が不可能な状態

十一人

旧システムの問題

Application Stack の変更
旧バージョン

新バージョン

Ruby

2.6

3.1

Rails

5.2

7.0

Database

PostgreSQL 9

PostgreSQL 14

WorkerSidekiq 5 + Redis

GoodJob

CSS Framework

Bootstrap 3

TailwindCSS 3 + CSS Bundling

JS Framework

jQueryStimulus JS + Importmap

Deploy Tool

Capistrano

Docker Swarm自新バージョンの主な改善ポイントと課題• 入党と党員ステータス関連機能の強化• 投票システムの独立化• 動化CI/CDの導入• データマイグレーションプロセス

入党と党員ステータス関連機能の強化

入党プロセス支

入党申請書提出

メールとSMSで認証

党費の払い

資格審查

完成

小モデルの改善• テーブルの正規化• 非常に長かったメソッドを、よりさいメソッドに分割し、コード複雑度を下げる

改善の結果 - コード複雑度モデル

改善前

改善後

差分

User

1,212

190

-1,022

Membership

0225

225

MembershipDue

369

157

-212

まとめ

1,581

572

-1,009＊コメントは含まれていません

党内選挙システムの分離と再構築

旧バージョンの問題

生

成、投票用

生

行

手

1. 全てのバッチ処理（投票権所有者名簿のど）がエンジニアによる 動実 が必要
2. 投票にログイン不要
3. 投票データが暗号化されていない

紙の成と送信な改善—バッチ処理の自行• バッチ処理はActiveJob化• set_waitを使ってタイミング実• データ作成や変更時に時間を再設定

動化

改善—セキュリティの強化

用• ActiveRecord Encryption を いて投票データを暗号化• 投票にログインは必要となります再構築の最の課題—新旧の互換性• システム開発中に定期的に党内選挙も うため、選挙システムを独立して用行大構築する必要があった。
• 新旧ウェブサイトのログインを連携する必要がある。
• 新旧ウェブサイトでOAuth Authorization Server機能が必要。
• 選挙システムはウェブサイトのOAuthを利 してログインする。

改善の結果 - 信頼性• テストカバレッジを0から

月

人80%以上に• 2 のチームで1ヶで開発

自動化CI/CDの導入とレビューアプリ

標

動化されたコード品質検査、テストの実 により、開発プロセスを加速し、製品品質を向上させる。
• 各プルリクに対して 動的にサンドボックス環境を 成することで、関係者が開発結果を実際にテストできる。

生行目•

自自CI/CD 導入の

順

行

生

手生生

• RubyGemsを使って Dockerize• boxing: DSLでDocker leを 成• openbox: Docker Entrypointを 成• liveness: ヘルスチェックエンドポイントを 成• Docker Composeファイルでデプロイ設定を う• GitLab CIのテンプレートをベースにCIパイプラインを構築

fi

自動化CI/CD の導入

行

セキュリティとSyntax Styleのチェック

テストを執

イメージのビルド&プッシュ

デプロイ

Review Apps(レビューアプリ)• プルリクごとにその修正内容のみ

自用を反映した環境を立ててデプロイしてくれる便利機能• Docker Swarm + Traefikをランタイム環境として利• マージ後は、CIジョブにより 動的に削除されます。

データマイグレーション

Railsエンジンの利• マイグレーションに含まれるも用の：• データマイグレーション• CarrierWaveからActive Storageへの添付ファイル変換• マイグレーションロジックをRails
エンジンでカプセル化

Docker le GemfileにGitトークンを直接記載しな

ARG APP_ROOT=/src/app
ARG RUBY_VERSION=3.1.3

いFROM ruby:${RUBY_VERSION}-alpine AS gem
ARG APP_ROOT
ARG GITLAB_TOKEN_NAME
ARG GITLAB_TOKEN_TOKEN
RUN apk add --no-cache build-base postgresql-dev gcompat
git
RUN mkdir -p ${APP_ROOT}COPY Gemfile Gemfile.lock ${APP_ROOT}/ENV BUNDLE_GITLAB__COM=${GITLAB_TOKEN_NAME}:${GITLAB_TOKEN_TOKEN}

CI Script

用fi

docker:needs:- job: assets:precompile
artifacts: truescript:- docker buildx build--cache-from type=local,src=tmp/docker--cache-to type=local,dest=tmp/docker--build-arg GITLAB_TOKEN_NAME=${GITLAB_TOKEN_NAME}--build-arg GITLAB_TOKEN_TOKEN=${GITLAB_TOKEN_TOKEN}--build-arg REVISION=${REVISION}${DOCKER_TAG_OPTIONS}--push .

• DockerのBuild Argumentsを利する• Dockerイメージをビルド時に 、CI 環境変数をBuild Argumentに渡す

稼働当日

力日

• 実際のマイグレーションは約30分• データ検証含めて約2時間• 党職員による静的データ入 に約2ご清聴ありがとう ございました
Special Thanks to @koic & @h_ryo_12 for Proofreading