Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Allow redmine to be disabled during development #153

Merged
merged 4 commits into from
Dec 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 25 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 | --- |
18 changes: 9 additions & 9 deletions src/actions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(())
Expand Down
25 changes: 22 additions & 3 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<String>,

#[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<IdeaReactionEnv> = std::sync::OnceLock::new();
CACHE.get_or_init(|| envy::from_env().expect("Failed to load environment variables"))
Expand Down
2 changes: 1 addition & 1 deletion src/redmine/actions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}

Expand Down
Loading