「お前今日何したんだよ」に答えるワークフローをn8nで構築した
リードエンジニアの皆さん、日々の業務お疲れ様です。プロジェクトが佳境に入ると、進捗確認の嵐が吹き荒れますよね。特にマネージャーや他のチームからの「今日何したの?」という問いかけ。定例会議での口頭報告、日報作成… 毎回同じような内容を伝え、貴重な開発時間を浪費していると感じたことはありませんか? 私は何度もあります。
この記事では、そんな煩わしい進捗報告を自動化するためのワークフローをn8nを使って構築する方法を解説します。単なる日報自動生成ツールではなく、「なぜ」n8nを選んだのか、アンチパターンと対策、そして現場で役立つ実践的なコードを余すところなくお伝えします。この記事を読めば、あなたはもう「今日何したの?」という問いにイライラする必要はありません。
この記事で得られる解決策
- n8nを使った進捗報告自動化ワークフローの構築
- Gitのコミットログから作業内容を抽出するテクニック
- Slackへの自動投稿による透明性の向上
- 日報作成にかかる時間の劇的な削減
基本的な解説
n8nとは?
n8nは、ノーコード/ローコードでワークフローを自動化できるツールです。Webhooks、API、データベースなど、様々なサービスと連携できます。今回は、GitLab(またはGitHub)のAPIとSlackのAPIを使って、Gitのコミットログから作業内容を抽出し、Slackに自動投稿するワークフローを構築します。
なぜn8nなのか?
類似の自動化ツールは数多く存在しますが、n8nを選択した理由は以下の通りです。
| ツール | メリット | デメリット | 選定理由 |
|---|---|---|---|
| Zapier | 使いやすいインターフェース、豊富な連携サービス | 無料プランの制限、複雑なワークフローの構築が困難 | シンプルだが高コスト |
| IFTTT | 手軽さ、豊富なトリガー | 連携サービスが限定的、複雑な処理ができない | 個人利用向け |
| n8n | 柔軟性、無料(セルフホストの場合)、拡張性 | 初期設定が必要、ある程度の技術知識が必要 | 拡張性とコストパフォーマンスが最高 |
n8nは、セルフホストすれば無料で利用でき、複雑なワークフローも柔軟に構築できます。また、JavaScriptでカスタムノードを作成することで、独自の機能を拡張することも可能です。今回はGitLab APIとSlack APIを使い、日々のコミットログを整形してSlackへ投稿するワークフローを構築するため、n8nの柔軟性が最適であると判断しました。
【重要】よくある失敗とアンチパターン
n8nでワークフローを構築する際、初心者が陥りやすいアンチパターンをいくつか紹介します。
アンチパターン1:エラーハンドリングを無視する
APIリクエストが失敗した場合、ワークフローが途中で止まってしまいます。エラーハンドリングを適切に実装しないと、自動化が不安定になり、信頼性を損ないます。
修正例:
Try-Catchノードを使用し、APIリクエストが失敗した場合に、エラーメッセージをSlackに送信するようにします。
間違った実装:
// エラーハンドリングなし
const response = await $request('GET', 'https://gitlab.com/api/v4/projects/your_project_id/repository/commits');
正しい実装:
// Try-Catchでエラーハンドリング
try {
const response = await $request('GET', 'https://gitlab.com/api/v4/projects/your_project_id/repository/commits');
return response.data;
} catch (error) {
console.error('APIリクエストエラー:', error);
// エラーメッセージをSlackに送信する処理
await $execution.setVariables({ errorMessage: error.message });
// Slackにエラーメッセージを送信する処理を追加
const slackWebhookUrl = 'your_slack_webhook_url'; // Slack Webhook URLを設定
const errorMessageToSlack = {
text: `n8nワークフローでエラーが発生しました: ${error.message}`
};
await $request({
url: slackWebhookUrl,
method: 'POST',
body: JSON.stringify(errorMessageToSlack),
headers: {
'Content-Type': 'application/json'
}
});
return [{json: {error: 'APIエラーが発生しました'}}];
}
アンチパターン2:すべての処理を一つのノードに詰め込む
複雑なJavaScriptコードを一つのノードに記述すると、可読性が低下し、メンテナンスが困難になります。処理を分割し、それぞれのノードが特定の役割を担うように設計すべきです。
修正例:
コミットログの取得、メッセージの整形、Slackへの投稿など、処理ごとにノードを分割します。
アンチパターン3:API Rate Limitを考慮しない
GitLabやSlackなどのAPIには、Rate Limit(APIリクエストの制限)があります。制限を超えるとAPIリクエストが拒否され、ワークフローが正常に動作しません。Rate Limitを考慮した設計が必要です。
修正例:
Waitノードを使用して、APIリクエストの間隔を調整します。また、Rate Limitに近づいている場合は、リクエストの頻度を自動的に下げるように設計します。より高度な方法として、指数バックオフがあります。指数バックオフは、APIリクエストが失敗した場合に、再試行の間隔を指数関数的に増加させることで、Rate Limitを回避するテクニックです。n8nでは、FunctionノードとWaitノードを組み合わせることで実装できます。具体的には、リクエストが失敗するたびに、Waitノードの待機時間を2倍にするなどの処理を記述します。最初の待機時間を短く設定し、リクエストが連続して失敗する場合にのみ、待機時間を長くすることで、通常時は高速に処理を行い、Rate Limitに近づいた場合にのみ、リクエスト頻度を自動的に調整できます。
【重要】現場で使われる実践的コード・テクニック
ここでは、実際に現場で使用しているn8nのワークフローの一部を紹介します。
GitLab APIからコミットログを取得する
GitLab APIを使って、指定したプロジェクトのコミットログを取得します。以下のJavaScriptコードは、最新の5件のコミットログを取得する例です。
// GitLab APIのエンドポイント
const projectId = 'your_project_id';
const apiUrl = `https://gitlab.com/api/v4/projects/${projectId}/repository/commits?per_page=5`;
// APIリクエストを実行
try {
const response = await $request({
url: apiUrl,
method: 'GET',
headers: {
'PRIVATE-TOKEN': 'your_private_token',
},
});
return response.data.map(commit => ({
json: {
id: commit.id,
message: commit.message,
author_name: commit.author_name,
committed_date: commit.committed_date,
web_url: commit.web_url
}
}));
} catch (error) {
console.error('GitLab APIエラー:', error);
return [{json: {error: 'GitLab APIエラーが発生しました'}}];
}
Slackへのメッセージを整形する
取得したコミットログをSlackに投稿するために、メッセージを整形します。以下のJavaScriptコードは、コミットメッセージ、作者名、コミット日時、Web URLを含むSlackメッセージを作成する例です。
// コミットログのリスト
const commits = $input.all();
// Slackメッセージを作成
const blocks = [
{
type: "section",
text: {
type: "mrkdwn",
text: `今日のコミットログです!`
}
},
{
type: "divider"
}
];
commits.forEach(commit => {
const commitData = commit.json;
blocks.push({
type: "section",
text: {
type: "mrkdwn",
text: `*${commitData.message}*nby ${commitData.author_name} (${commitData.committed_date})n<${commitData.web_url}|View commit>`
}
});
});
return [{json: {blocks: blocks}}];
Slackにメッセージを投稿する
整形したメッセージをSlackに投稿します。以下のJavaScriptコードは、Slack Webhookを使ってメッセージを投稿する例です。
// Slack Webhook URL
const webhookUrl = 'your_slack_webhook_url';
// Slackメッセージ
const message = $input.first().json;
// APIリクエストを実行
try {
const response = await $request({
url: webhookUrl,
method: 'POST',
body: JSON.stringify(message),
headers: {
'Content-Type': 'application/json',
},
});
return response.data;
} catch (error) {
console.error('Slack APIエラー:', error);
return [{json: {error: 'Slack APIエラーが発生しました'}}];
}
これらのコードを組み合わせることで、GitLabのコミットログを自動的にSlackに投稿するワークフローを構築できます。さらに、トリガーを設定することで、定期的に自動実行することも可能です。
n8n特有のTips:ノードの組み合わせでさらに便利に!
n8nは豊富なノードが用意されており、組み合わせることで様々な処理を実現できます。
- SetノードとIFノードの組み合わせ: 特定の条件を満たすコミットメッセージのみをSlackに通知する場合、Setノードで条件を定義し、IFノードで条件分岐を行うことができます。例えば、コミットメッセージに「fix」が含まれる場合のみ通知するといった設定が可能です。
- CronノードとFunctionノードの組み合わせ: 毎日決まった時間にコミットログを収集し、特定のフォーマットで整形してSlackに投稿する場合、Cronノードで実行スケジュールを設定し、Functionノードでデータ整形処理を記述します。これにより、定時的なレポート作成を自動化できます。
- Mergeノードを活用した複数プロジェクトの集計: 複数のGitLabプロジェクトのコミットログをまとめてSlackに通知したい場合、それぞれのプロジェクトからコミットログを取得し、Mergeノードで統合することで、一括で処理できます。
まとめ
この記事では、n8nを使って「今日何したの?」という問いに答えるワークフローを構築する方法を解説しました。n8nの選定理由、アンチパターンと対策、現場で役立つ実践的なコード、そしてn8n特有のTipsを紹介しました。この記事を参考に、ぜひあなた自身のワークフローを構築し、日々の業務を効率化してください。


コメント