diff --git a/README.md b/README.md index 14eabe6..79d179d 100644 --- a/README.md +++ b/README.md @@ -7,44 +7,44 @@ ## Features -- アイデア投稿フォームに新しいアイデアが投稿された際に: - - その投稿履歴に "👍", "👎", "🤔" のリアクションを付与する - - その投稿履歴にスレッドを作成する - - その投稿履歴の Redmine Issue にスレッドへの URL をコメントする +- アイデア投稿フォームに新しいアイデアが投稿された際に: + - その投稿履歴に "👍", "👎", "🤔" のリアクションを付与する + - その投稿履歴にスレッドを作成する + - その投稿履歴の Redmine Issue にスレッドへの URL をコメントする ## Usage -- k8s 及び Docker Container 上での動作を想定しています. 整地鯖の k8s で動作するための定義は [seichi_infra](https://github.com/GiganticMinecraft/seichi_infra) で公開しています. ([定義ファイル: `seichi-onp-k8s/manifests/seichi-kubernetes/apps/seichi-minecraft/idea-reaction/idea-reaction.yaml`](https://github.com/GiganticMinecraft/seichi_infra/blob/main/seichi-onp-k8s/manifests/seichi-kubernetes/apps/seichi-minecraft/idea-reaction/idea-reaction.yaml)) -- [`compose.yaml`](./compose.yaml) を配置しているリポジトリ内に `.env` ファイルを用意し, 環境変数を設定してください. -- 設定後 `docker compose up -d` で起動できます. +- k8s 及び Docker Container 上での動作を想定しています. 整地鯖の k8s で動作するための定義は [seichi_infra](https://github.com/GiganticMinecraft/seichi_infra) で公開しています. ([定義ファイル: `seichi-onp-k8s/manifests/seichi-kubernetes/apps/seichi-minecraft/idea-reaction/idea-reaction.yaml`](https://github.com/GiganticMinecraft/seichi_infra/blob/main/seichi-onp-k8s/manifests/seichi-kubernetes/apps/seichi-minecraft/idea-reaction/idea-reaction.yaml)) +- [`compose.yaml`](./compose.yaml) を配置しているリポジトリ内に `.env` ファイルを用意し, 環境変数を設定してください. +- 設定後 `docker compose up -d` で起動できます. ## Development 1. `docker-redmine` 内の `compose.yaml` を実行し, Redmine と postgres を起動します. 2. Redmine にログインし, Issue の作成権限・更新権限を持つユーザを作成し, API Key を取得します. -3. `idea-reaction` の `.env` ファイルに以下の環境変数を追加します. - - `REDMINE_API_KEY`: Redmine の API Key - - `REDMINE_URL`: Redmine の URL (Docker 環境の場合 `http://localhost:8080` です.) +3. `idea-reaction` の `.env` ファイルに環境変数を設定します. 4. `cargo run` で idea-reaction を起動します. -- 環境変数 `ENV_NAME` を `production` に設定すると Sentry との連携が有効になります. 開発時は指定しないようにしてください. +- 環境変数 `ENV_NAME` を `production` に設定すると Sentry との連携が有効になります. 開発時は指定しないようにしてください. +- 環境変数 `REDMINE_API_KEY` は Redmine の API Key です. Redmine にコメントを投稿する機能を有効にする場合は必須です. + - デバッグ時に Redmine の連携機能が不要な場合は指定せずに起動すると自動で無効化されます. ## Release (for GiganticMinecraft admin) -- idea-reaction は GitHub App (release-please などのツール) を使った自動リリースには対応していません. -- リリースをするときは `Cargo.toml` の `version` プロパティなどを bump したうえで [Actions](https://github.com/GiganticMinecraft/idea-reaction/actions/workflows/release.yaml) にある `Run workflow` から CI を実行すると ghcr.io に Docker Image がリリースされます. -- k8s 本番環境にある idea-reaction を更新する場合は `.../apps/seichi-minecraft/idea-reaction/idea-reaction.yaml` の `spec.template.spec.containers.image` の値を変更してください. - - タグ等の情報は [Packages](https://github.com/GiganticMinecraft/idea-reaction/pkgs/container/idea-reaction) - から確認できます. +- idea-reaction は GitHub App (release-please などのツール) を使った自動リリースには対応していません. +- リリースをするときは `Cargo.toml` の `version` プロパティなどを bump したうえで [Actions](https://github.com/GiganticMinecraft/idea-reaction/actions/workflows/release.yaml) にある `Run workflow` から CI を実行すると ghcr.io に Docker Image がリリースされます. +- k8s 本番環境にある idea-reaction を更新する場合は `.../apps/seichi-minecraft/idea-reaction/idea-reaction.yaml` の `spec.template.spec.containers.image` の値を変更してください. + - タグ等の情報は [Packages](https://github.com/GiganticMinecraft/idea-reaction/pkgs/container/idea-reaction) + から確認できます. ## Environment Variables -| Name | Description | -| ------------------- | ----------------------------------------------------- | -| `ENV_NAME` | 環境名 (production 以外は無視される) | -| `DISCORD_API_TOKEN` | Discord Bot のトークン | -| `REDMINE_API_KEY` | Redmine の API Key (コメント機能を有効にする場合のみ) | -| `REDMINE_URL` | Redmine の URL (コメント機能を有効にする場合のみ) | -| `TARGET_CHANNEL_ID` | 監視対象チャンネルのID | -| `TARGET_WEBHOOK_ID` | 監視対象WebhookのID | -| `TARGET_GUILD_ID` | 監視対象ギルドのID | +| Name | Description | デフォルト値 | +| ------------------- | ----------------------------------------------------- | ----------------------- | +| `ENV_NAME` | 環境名 (production 以外は無視される) | `development` | +| `DISCORD_API_TOKEN` | Discord Bot のトークン | --- | +| `REDMINE_API_KEY` | Redmine の API Key (コメント機能を有効にする場合のみ) | --- | +| `REDMINE_URL` | Redmine の URL | `http://localhost:8080` | +| `TARGET_CHANNEL_ID` | 監視対象チャンネルのID | --- | +| `TARGET_WEBHOOK_ID` | 監視対象WebhookのID | --- | +| `TARGET_GUILD_ID` | 監視対象ギルドのID | --- | diff --git a/src/actions.rs b/src/actions.rs index b240492..b5189de 100644 --- a/src/actions.rs +++ b/src/actions.rs @@ -65,15 +65,15 @@ impl IdeaReactionAction { } }; - // スレッドのURLを Redmine にコメントする. (Serenity はスレッドの URL を取得するメソッドがない) - let content = format!( - "Thread: https://discord.com/channels/{}/{}", - envs.target_guild_id, t.id - ); - if let Err(why) = RedmineAction::run(self.issue_number, content).await { - return Err(IdeaReactionActionError::FailedToSendRedmineComment( - why.to_string(), - )); + if envs.redmine_api_key.is_some() { + // スレッドのURLを Redmine にコメントする. (Serenity はスレッドの URL を取得するメソッドがない) + let content = format!( + "Thread: https://discord.com/channels/{}/{}", + envs.target_guild_id, t.id + ); + RedmineAction::run(self.issue_number, content) + .await + .map_err(|e| IdeaReactionActionError::FailedToSendRedmineComment(e.to_string()))?; } Ok(()) diff --git a/src/main.rs b/src/main.rs index 5e53fa2..5d3f4f4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,15 +12,34 @@ mod redmine; #[derive(serde::Serialize, serde::Deserialize, Debug)] pub struct IdeaReactionEnv { - pub env_name: String, + #[serde(default)] + pub env_name: String, // default: development + pub discord_api_token: String, - pub redmine_api_key: String, - pub redmine_url: String, + pub redmine_api_key: Option, + + #[serde(default)] + pub redmine_url: String, // default: https://localhost:8080 + pub target_channel_id: u64, pub target_guild_id: u64, pub target_webhook_id: u64, } +impl Default for IdeaReactionEnv { + fn default() -> Self { + Self { + env_name: "development".to_string(), + discord_api_token: "".to_string(), + redmine_api_key: None, + redmine_url: "https://localhost:8080".to_string(), + target_channel_id: 0, + target_guild_id: 0, + target_webhook_id: 0, + } + } +} + pub fn envs() -> &'static IdeaReactionEnv { static CACHE: std::sync::OnceLock = std::sync::OnceLock::new(); CACHE.get_or_init(|| envy::from_env().expect("Failed to load environment variables")) diff --git a/src/redmine/actions.rs b/src/redmine/actions.rs index b6ac76c..4766428 100644 --- a/src/redmine/actions.rs +++ b/src/redmine/actions.rs @@ -21,7 +21,7 @@ impl RedmineAction { let envs = envs(); RedmineAction::builder() .url(envs.redmine_url.clone()) - .api_key(envs.redmine_api_key.clone()) + .api_key(envs.redmine_api_key.clone().unwrap()) .build() }