こんにちは!開発チームのベロシティを最大化し、情報のサイロ化を粉砕することに情熱を燃やすアジャイルコーチ兼エンジニアの先輩です。
日々の開発現場で、こんなストレスを感じていませんか?
- 「GitHubでプルリクエストがマージされたのに、Asanaのタスクステータスを『完了』にするのを忘れて進捗がズレる……」
- 「スプレッドシートで管理している案件データを、誰かが手動でAsanaに転記している……この無駄な時間はなんだ?」
ZapierやMakeといったノーコードツールは便利ですが、複雑なビジネスロジックを挟もうとすると課金の壁にぶつかったり、痒い所に手が届かなかったりします。
「だったら、自分たちでAPIを叩いて、完全にシームレスな自動化パイプラインを作ってしまえばいい」
今回は、Asana APIの基本から、GitHubのコミット・プルリクエストとAsanaタスクを完全に同期させる実践的な連携ワークフローの構築まで、泥臭くも美しいコードと共に徹底解説します。これをマスターすれば、あなたのチームのワークフローは劇的に加速し、面倒な手作業から完全に解放されますよ。
—
1. なぜ「Asana API直接連携」なのか?(ツールの役割と設計思想)
アジャイル開発において、「コード」と「タスク」の距離はゼロに近いほど良いです。開発者がIDE(VS Codeなど)やGitHubでコードを書いているその瞬間と、プロジェクトマネージャーが眺めているAsanaのボードがリアルタイムで同期していなければ、正確なベロシティの計測などできません。
多くのチームが「UIでの手動操作」や「高価な連携ツール」に頼りがちですが、Asana APIを直接叩くスクリプト(WebhookやServerless Functionsなど)を1つ持っていれば、以下のようなメリットがあります。
- 完全なカスタム性:コミットメッセージの特定のキーワード(例: `fix #12345`)を検知して、自動的にAsanaの特定のセクションに移動させたり、カスタムフィールドを更新したりできる。
- コストゼロ:AWS LambdaやGitHub Actionsの無料枠内で十分に運用可能。
- 技術的資産の蓄積:チームのエンジニアリング力だけでワークフローを拡張できる。
それでは、まずはAsana APIの基礎中の基礎から、世界一分かりやすく紐解いていきましょう。
—
2. 基礎セットアップ:Asana APIの扉を開く
まずは、Asana APIと対話するための「通行手形」を手に入れます。
Step 1: パーソナルアクセストークン(PAT)の取得
1. Asanaの右上のプロフィールアイコンから 「My Settings(個人設定)」 を開きます。
2. 「Apps(アプリ)」 タブを選択し、一番下の 「Manage Developer Apps(開発者用アプリの管理)」 から 「Personal Access Token(個人用アクセストークン)」 を生成します。
3. 発行されたトークン(文字列)は、二度と再表示されないため、安全な場所(環境変数など)に必ず控えておいてください。
Step 2: 最初の「Hello World」!APIを叩いてみる
ターミナルを開き、`curl` コマンドを使ってあなたのAsanaアカウントのワークスペース情報を取得してみましょう。APIの基本構造を体感する最高の「Hello World」です。
curl -H “Authorization: Bearer 你的_PERSONAL_ACCESS_TOKEN” \
https://app.asana.com/api/1.0/users/me
JSON形式であなたのユーザー情報(名前やメールアドレス)が返ってきましたか?おめでとうございます!これであなたはAsana APIを意のままに操る権利を手に入れました。
—
3. 実践!GitHubの動きとAsanaタスクを自動連動させる
ここからが本番です。「GitHubでコードがプッシュされたら、Asanaの該当タスクにコメントを残し、ステータスを『進行中』にする」 という開発現場で喉から手が出るほど欲しい仕組みを作ります。
今回は、サーバーを常時立ち上げる必要がない 「GitHub Actions」 をトリガーとして使用し、Node.js(JavaScript)でAsana APIを叩くスクリプトを組み上げます。
全体アーキテクチャ
1. 開発者がGitHubにコードをプッシュ(コミットメッセージにAsanaのタスクGIDを含める)。
2. GitHub Actionsがそれを検知してスクリプトを実行。
3. スクリプトがAsana APIを叩き、タスクにコメント追加&ステータス変更。
Step 1: タスクID(GID)の取得ルールを決める
AsanaのタスクURL(例: `https://app.asana.com/0/1203456789/1234567890123456`)の最後の数字がそのタスクの固有ID(GID)です。
コミットメッセージを以下のように書くルールをチームで共有します。
> `feat: ログイン画面のバリデーション実装 [asana:1234567890123456]`
Step 2: 同期スクリプトの作成 (`sync-asana.js`)
プロジェクトのルートに `.github/scripts/sync-asana.js` を作成します。このスクリプトは、コミットメッセージからAsanaのタスクIDを正規表現で抽出し、Asana APIへPOSTリクエストを送ります。
/
- GitHub Commit to Asana Sync Script
- 依存関係: node-fetch (標準機能のfetchが使えるNode.js v18以上を推奨)
/
const ASANA_PAT = process.env.ASANA_PAT;
const COMMIT_MESSAGE = process.env.COMMIT_MESSAGE || “”;
const GITHUB_ACTOR = process.env.GITHUB_ACTOR || “Unknown User”;
const GITHUB_COMMIT_URL = process.env.GITHUB_COMMIT_URL || “”;
// コミットメッセージから [asana:タスクID] を抽出する正規表現
const asanaRegex = /\[asana:(\d+)\]/;
const match = COMMIT_MESSAGE.match(asanaRegex);
if (!match) {
console.log(“AsanaのタスクIDが見つからなかったため、スキップします。”);
process.exit(0);
}
const taskId = match[1];
console.log(`検知したAsanaタスクID: ${taskId}`);
async function updateAsanaTask() {
try {
// 1. タスクにコメントを追加
const commentResponse = await fetch(`https://app.asana.com/api/1.0/tasks/${taskId}/stories`, {
method: “POST”,
headers: {
“Authorization”: `Bearer ${ASANA_PAT}`,
“Content-Type”: “application/json”
},
body: JSON.stringify({
data: {
text: `🚀 GitHubにて ${GITHUB_ACTOR} がコミットしました。\nメッセージ: “${COMMIT_MESSAGE}”\n参照: ${GITHUB_COMMIT_URL}`
}
})
});
if (!commentResponse.ok) {
throw new Error(`コメントの追加に失敗しました: ${await commentResponse.text()}`);
}
console.log(“Asanaタスクへのコメント追加に成功しました!”);
// 2. タスクを「進行中(In Progress)」などに移動させる(必要に応じてフィールドIDを指定)
// ※プロジェクトごとのセクションやカスタムフィールドの操作はAPIドキュメントを参照してください
} catch (error) {
console.error(“エラーが発生しました:”, error.message);
process.exit(1);
}
}
updateAsanaTask();
Step 3: GitHub Actions Workflowの設定 (`.github/workflows/asana-sync.yml`)
次に、このスクリプトをGitHub上で自動実行するためのワークフロー定義を行います。
name: Sync GitHub to Asana
on:
push:
branches:
- main
- develop
jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: ’18’
- name: Run Asana Sync Script
env:
ASANA_PAT: ${{ secrets.ASANA_PAT }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
GITHUB_ACTOR: ${{ github.actor }}
GITHUB_COMMIT_URL: ${{ github.event.head_commit.url }}
run: |
node .github/scripts/sync-asana.js
仕上げ:GitHub Secretsの設定
GitHubリポジトリの Settings > Secrets and variables > Actions から、新しく `ASANA_PAT` という名前で先ほど取得したAsanaのパーソナルアクセストークンを登録します。これで機密情報がコードに露出するのを防げます。
これですべての準備が整いました!あとは `git commit -m “fix: バグ修正 [asana:あなたのタスクID]”` としてプッシュするだけ。自動的にAsanaのタスクにあなたのGitHubの足跡が刻まれます。
—
先輩エンジニアからのエール
お疲れ様でした!ここまで読み進め、手を動かしてくれたあなたなら、もうAsana API恐るに足らず、です。
今回紹介した仕組みはほんの氷山の一角です。これを応用すれば、
- 「Googleスプレッドシートで予算が変更されたら、Asanaのプロジェクト管理者に自動通知する」
- 「プルリクエストがマージされたら、自動でAsanaのタスクを完了にしてレビュー担当者に拍手スタンプを送る」
など、チームのボトルネックをテクノロジーの力で次々と解消できるようになります。
「面倒な手作業はすべてコードにやらせる」。このエンジニアリングマインドを大切に、ぜひあなたのチームのベロシティを爆発的に高めていってください。応援しています!