{"action":"created","comment":{"url":"https://api.github.com/repos/CODEYA/codeya.github.io/pulls/comments/24315041","id":24315041,"diff_hunk":"@@ -0,0 +1,224 @@\n+---\n+title: 開発ガイドライン\n+permalink: /documents/development-guidelines.html\n+overview:\n+---\n+\n+# 概要\n+\n+本書では CODEYA における開発作業に関するガイドラインを提供する。\n+本書のステータスは Working Draft であり、本書に対するご意見は pull request にてお送りいただきたい。\n+\n+## 前提\n+\n+本書における \"MUST\"、\"MUST NOT\"、\"SHOULD\"、\"SHOULD NOT\"、\"MAY\" という表記は [RFC2119](http://www.asahi-net.or.jp/~sd5a-ucd/rfc-j/rfc-2119j.html) における定義に従うものとする。\n+\n+本書における命名規約の定義には [EBNF](http://ja.wikipedia.org/wiki/EBNF) を使用する。また、必要に応じ自然言語による定義を行う。\n+\n+## 開発作業\n+\n+本書では開発作業を以下の通り定める。\n+\n+| 開発作業名 | 解説                                                       |\n+|----------|-----------------------------------------------------------|\n+| タスク    | ロジックの実装や単体テスト、環境設定などプロジェクトに必要な作業を行う。 |\n+| リリース   | ステージング環境や本番環境へディプロイ可能なモジュールを作成する。     |\n+\n+## アクター\n+\n+本書では開発作業に関与するアクターを以下の通り定める。\n+\n+| アクター名      | 解説                                           |\n+|---------------|-----------------------------------------------|\n+| Task Owner    | タスクの作成者。タスクの概要を定め、レビューを実施する。 |\n+| Task Assignee | タスクの実施者。タスクの実作業を行う。                |\n+\n+## Git ブランチ構成\n+\n+本書では Git のブランチ構成を以下の通り定める。\n+\n+| ブランチ名 | 解説                                                                         | 品質基準        | 命名規則                           |\n+|----------|-----------------------------------------------------------------------------|----------------|----------------------------------|\n+| master   | 本番環境にディプロイ可能なブランチ。                                               | 結合試験/UAT完了 | \"master\" 固定                     |\n+| release  | ステージング環境にディプロイ可能なブランチ。リリース作業時に develop ブランチより作成する。 | 結合試験完了     | \"release/\" + yyyyMMdd (リリース日)  |\n+| develop  | 開発用ブランチ。全開発者の作業結果がマージされるブランチ。                              | 単体試験完了     | \"develop\" 固定                    |\n+| feature  | 開発用ブランチ。タスク毎に作成されるブランチ。                                       |                | \"feature/\" + 任意文字列(半角英数)    |\n+\n+![ブランチ構成](./development-guidelines/git-branch-structure.png)\n+\n+TBD: プロジェクトを複数併行する場合、develop/foo、develop/bar みたいにする？？\n+\n+# タスク\n+\n+タスクではコーディングや環境設定などプロジェクトに必要な作業を行う。\n+タスクの流れを以下に示す。\n+\n+![開発作業](./development-guidelines/development-process.png)\n+\n+## 1) タスク作成\n+\n+Task Owner は Issue Tracker にタスクを作成する。\n+\n+## 2) タスク内容合意\n+\n+Task Owner と Task Assignee 間でタスクの内容について合意する。\n+特に「具体的な作業内容」「タスクの完了基準」を明確にし、Issue Traker に必ず記載すること。\n+\n+レビュー工数削減のため、タスクの粒度は最大で 0.5人日程度とする。\n+それ以上のタスクになる場合はタスク分割もしくはサブタスクを作成し、粒度を小さくすること。\n+\n+## 3) feature ブランチ作成\n+\n+Task Assignee は `feature` ブランチを作成する。\n+`feature` ブランチはタスクもしくはサブタスク毎に作成するものとし、必ず `develop` ブランチから派生させるものとする(MUST)。\n+\n+```bash\n+% git checkout develop\n+% git pull\n+% git flow feature start <Feature Branch Name>\n+% git branch --set-upstream-to=origin/feature/<Feature Branch Name> feature/<Feature Branch Name>\n+```\n+\n+```ebnf\n+Feature Branch Name = Task ID, \"_\", Task Summary\n+Task ID = Issue Tracker においてタスクをユニークに識別可能な ID。半角英数記号。\n+Task Summary = タスクの内容を簡潔に表す文字列。半角英数字。\n+```\n+※ Feature Branch Name には “feature/” 接頭辞は含めない\n+\n+<div style=\"border:1px solid #ccc; padding:1em; margin:1em 0; background-color:#f9f9f9;\">\n+<figure><figcaption>[TIPS] SAKAKI 導入環境</figcaption>{% highlight bash %}\n+% g co develop\n+% g pl\n+% g ffs <Feature Branch Name>\n+% g bup\n+{% endhighlight %}</figure>\n+</div>\n+\n+## 4) pull request 作成\n+\n+Task Assignee はタスク作業に先立って pull request を作成する(SHOULD)。\n+これは、タスク作業中他メンバーへ助言を求める際に pull request のコメント機能を利用することを目的としている。\n+\n+```bash\n+% git commit --allow-empty -m “EMPTY”\n+% git push origin feature/<Feature Branch Name>\n+% hub pull-request -b develop -m “<Pull Request Name>”\n+```\n+\n+```ebnf\n+Pull Request Name = Issue Tracker におけるタスク名。任意の文字種を利用可能。\n+```\n+\n+<div style=\"border:1px solid #ccc; padding:1em; margin:1em 0; background-color:#f9f9f9;\">\n+<figure><figcaption>[TIPS] SAKAKI 導入環境</figcaption>{% highlight bash %}\n+% g cme\n+% g ps origin feature/<Feature ブランチ名>\n+% g reqd \"<Pull Request Name>\"","path":"documents/development-guidelines.md","position":117,"original_position":117,"commit_id":"501bbaaa2f4c3a17ca882faa8a4613f96c778d10","original_commit_id":"501bbaaa2f4c3a17ca882faa8a4613f96c778d10","user":{"login":"cucco","id":10473603,"avatar_url":"https://avatars.githubusercontent.com/u/10473603?v=3","gravatar_id":"","url":"https://api.github.com/users/cucco","html_url":"https://github.com/cucco","followers_url":"https://api.github.com/users/cucco/followers","following_url":"https://api.github.com/users/cucco/following{/other_user}","gists_url":"https://api.github.com/users/cucco/gists{/gist_id}","starred_url":"https://api.github.com/users/cucco/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cucco/subscriptions","organizations_url":"https://api.github.com/users/cucco/orgs","repos_url":"https://api.github.com/users/cucco/repos","events_url":"https://api.github.com/users/cucco/events{/privacy}","received_events_url":"https://api.github.com/users/cucco/received_events","type":"User","site_admin":false},"body":"`g preqd`です。","created_at":"2015-02-09T08:59:24Z","updated_at":"2015-02-09T08:59:24Z","html_url":"https://github.com/CODEYA/codeya.github.io/pull/10#discussion_r24315041","pull_request_url":"https://api.github.com/repos/CODEYA/codeya.github.io/pulls/10","_links":{"self":{"href":"https://api.github.com/repos/CODEYA/codeya.github.io/pulls/comments/24315041"},"html":{"href":"https://github.com/CODEYA/codeya.github.io/pull/10#discussion_r24315041"},"pull_request":{"href":"https://api.github.com/repos/CODEYA/codeya.github.io/pulls/10"}}},"pull_request":{"url":"https://api.github.com/repos/CODEYA/codeya.github.io/pulls/10","id":28864744,"html_url":"https://github.com/CODEYA/codeya.github.io/pull/10","diff_url":"https://github.com/CODEYA/codeya.github.io/pull/10.diff","patch_url":"https://github.com/CODEYA/codeya.github.io/pull/10.patch","issue_url":"https://api.github.com/repos/CODEYA/codeya.github.io/issues/10","number":10,"state":"closed","locked":false,"title":"開発ガイドライン作成","user":{"login":"eiichiro-takahashi","id":3786436,"avatar_url":"https://avatars.githubusercontent.com/u/3786436?v=3","gravatar_id":"","url":"https://api.github.com/users/eiichiro-takahashi","html_url":"https://github.com/eiichiro-takahashi","followers_url":"https://api.github.com/users/eiichiro-takahashi/followers","following_url":"https://api.github.com/users/eiichiro-takahashi/following{/other_user}","gists_url":"https://api.github.com/users/eiichiro-takahashi/gists{/gist_id}","starred_url":"https://api.github.com/users/eiichiro-takahashi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eiichiro-takahashi/subscriptions","organizations_url":"https://api.github.com/users/eiichiro-takahashi/orgs","repos_url":"https://api.github.com/users/eiichiro-takahashi/repos","events_url":"https://api.github.com/users/eiichiro-takahashi/events{/privacy}","received_events_url":"https://api.github.com/users/eiichiro-takahashi/received_events","type":"User","site_admin":false},"body":null,"created_at":"2015-02-07T14:21:04Z","updated_at":"2015-02-09T08:59:24Z","closed_at":"2015-02-09T05:47:10Z","merged_at":"2015-02-09T05:47:10Z","merge_commit_sha":"a4deefe205b5f8c5ef1ee84b8f81ee5e1c6ba4d4","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/CODEYA/codeya.github.io/pulls/10/commits","review_comments_url":"https://api.github.com/repos/CODEYA/codeya.github.io/pulls/10/comments","review_comment_url":"https://api.github.com/repos/CODEYA/codeya.github.io/pulls/comments/{number}","comments_url":"https://api.github.com/repos/CODEYA/codeya.github.io/issues/10/comments","statuses_url":"https://api.github.com/repos/CODEYA/codeya.github.io/statuses/501bbaaa2f4c3a17ca882faa8a4613f96c778d10","head":{"label":"CODEYA:feature/COD-16_development_guideline","ref":"feature/COD-16_development_guideline","sha":"501bbaaa2f4c3a17ca882faa8a4613f96c778d10","user":{"login":"CODEYA","id":9255262,"avatar_url":"https://avatars.githubusercontent.com/u/9255262?v=3","gravatar_id":"","url":"https://api.github.com/users/CODEYA","html_url":"https://github.com/CODEYA","followers_url":"https://api.github.com/users/CODEYA/followers","following_url":"https://api.github.com/users/CODEYA/following{/other_user}","gists_url":"https://api.github.com/users/CODEYA/gists{/gist_id}","starred_url":"https://api.github.com/users/CODEYA/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CODEYA/subscriptions","organizations_url":"https://api.github.com/users/CODEYA/orgs","repos_url":"https://api.github.com/users/CODEYA/repos","events_url":"https://api.github.com/users/CODEYA/events{/privacy}","received_events_url":"https://api.github.com/users/CODEYA/received_events","type":"Organization","site_admin":false},"repo":{"id":28128862,"name":"codeya.github.io","full_name":"CODEYA/codeya.github.io","owner":{"login":"CODEYA","id":9255262,"avatar_url":"https://avatars.githubusercontent.com/u/9255262?v=3","gravatar_id":"","url":"https://api.github.com/users/CODEYA","html_url":"https://github.com/CODEYA","followers_url":"https://api.github.com/users/CODEYA/followers","following_url":"https://api.github.com/users/CODEYA/following{/other_user}","gists_url":"https://api.github.com/users/CODEYA/gists{/gist_id}","starred_url":"https://api.github.com/users/CODEYA/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CODEYA/subscriptions","organizations_url":"https://api.github.com/users/CODEYA/orgs","repos_url":"https://api.github.com/users/CODEYA/repos","events_url":"https://api.github.com/users/CODEYA/events{/privacy}","received_events_url":"https://api.github.com/users/CODEYA/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/CODEYA/codeya.github.io","description":"Github pages for CODEYA","fork":false,"url":"https://api.github.com/repos/CODEYA/codeya.github.io","forks_url":"https://api.github.com/repos/CODEYA/codeya.github.io/forks","keys_url":"https://api.github.com/repos/CODEYA/codeya.github.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CODEYA/codeya.github.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CODEYA/codeya.github.io/teams","hooks_url":"https://api.github.com/repos/CODEYA/codeya.github.io/hooks","issue_events_url":"https://api.github.com/repos/CODEYA/codeya.github.io/issues/events{/number}","events_url":"https://api.github.com/repos/CODEYA/codeya.github.io/events","assignees_url":"https://api.github.com/repos/CODEYA/codeya.github.io/assignees{/user}","branches_url":"https://api.github.com/repos/CODEYA/codeya.github.io/branches{/branch}","tags_url":"https://api.github.com/repos/CODEYA/codeya.github.io/tags","blobs_url":"https://api.github.com/repos/CODEYA/codeya.github.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CODEYA/codeya.github.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CODEYA/codeya.github.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/CODEYA/codeya.github.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CODEYA/codeya.github.io/statuses/{sha}","languages_url":"https://api.github.com/repos/CODEYA/codeya.github.io/languages","stargazers_url":"https://api.github.com/repos/CODEYA/codeya.github.io/stargazers","contributors_url":"https://api.github.com/repos/CODEYA/codeya.github.io/contributors","subscribers_url":"https://api.github.com/repos/CODEYA/codeya.github.io/subscribers","subscription_url":"https://api.github.com/repos/CODEYA/codeya.github.io/subscription","commits_url":"https://api.github.com/repos/CODEYA/codeya.github.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/CODEYA/codeya.github.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/CODEYA/codeya.github.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/CODEYA/codeya.github.io/issues/comments/{number}","contents_url":"https://api.github.com/repos/CODEYA/codeya.github.io/contents/{+path}","compare_url":"https://api.github.com/repos/CODEYA/codeya.github.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CODEYA/codeya.github.io/merges","archive_url":"https://api.github.com/repos/CODEYA/codeya.github.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CODEYA/codeya.github.io/downloads","issues_url":"https://api.github.com/repos/CODEYA/codeya.github.io/issues{/number}","pulls_url":"https://api.github.com/repos/CODEYA/codeya.github.io/pulls{/number}","milestones_url":"https://api.github.com/repos/CODEYA/codeya.github.io/milestones{/number}","notifications_url":"https://api.github.com/repos/CODEYA/codeya.github.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CODEYA/codeya.github.io/labels{/name}","releases_url":"https://api.github.com/repos/CODEYA/codeya.github.io/releases{/id}","created_at":"2014-12-17T08:45:45Z","updated_at":"2015-02-09T05:47:10Z","pushed_at":"2015-02-09T05:48:10Z","git_url":"git://github.com/CODEYA/codeya.github.io.git","ssh_url":"git@github.com:CODEYA/codeya.github.io.git","clone_url":"https://github.com/CODEYA/codeya.github.io.git","svn_url":"https://github.com/CODEYA/codeya.github.io","homepage":null,"size":28100,"stargazers_count":0,"watchers_count":0,"language":"CSS","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"CODEYA:develop","ref":"develop","sha":"bc17ca1fa9264aa2013990dbbd0515c0df248896","user":{"login":"CODEYA","id":9255262,"avatar_url":"https://avatars.githubusercontent.com/u/9255262?v=3","gravatar_id":"","url":"https://api.github.com/users/CODEYA","html_url":"https://github.com/CODEYA","followers_url":"https://api.github.com/users/CODEYA/followers","following_url":"https://api.github.com/users/CODEYA/following{/other_user}","gists_url":"https://api.github.com/users/CODEYA/gists{/gist_id}","starred_url":"https://api.github.com/users/CODEYA/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CODEYA/subscriptions","organizations_url":"https://api.github.com/users/CODEYA/orgs","repos_url":"https://api.github.com/users/CODEYA/repos","events_url":"https://api.github.com/users/CODEYA/events{/privacy}","received_events_url":"https://api.github.com/users/CODEYA/received_events","type":"Organization","site_admin":false},"repo":{"id":28128862,"name":"codeya.github.io","full_name":"CODEYA/codeya.github.io","owner":{"login":"CODEYA","id":9255262,"avatar_url":"https://avatars.githubusercontent.com/u/9255262?v=3","gravatar_id":"","url":"https://api.github.com/users/CODEYA","html_url":"https://github.com/CODEYA","followers_url":"https://api.github.com/users/CODEYA/followers","following_url":"https://api.github.com/users/CODEYA/following{/other_user}","gists_url":"https://api.github.com/users/CODEYA/gists{/gist_id}","starred_url":"https://api.github.com/users/CODEYA/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CODEYA/subscriptions","organizations_url":"https://api.github.com/users/CODEYA/orgs","repos_url":"https://api.github.com/users/CODEYA/repos","events_url":"https://api.github.com/users/CODEYA/events{/privacy}","received_events_url":"https://api.github.com/users/CODEYA/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/CODEYA/codeya.github.io","description":"Github pages for CODEYA","fork":false,"url":"https://api.github.com/repos/CODEYA/codeya.github.io","forks_url":"https://api.github.com/repos/CODEYA/codeya.github.io/forks","keys_url":"https://api.github.com/repos/CODEYA/codeya.github.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CODEYA/codeya.github.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CODEYA/codeya.github.io/teams","hooks_url":"https://api.github.com/repos/CODEYA/codeya.github.io/hooks","issue_events_url":"https://api.github.com/repos/CODEYA/codeya.github.io/issues/events{/number}","events_url":"https://api.github.com/repos/CODEYA/codeya.github.io/events","assignees_url":"https://api.github.com/repos/CODEYA/codeya.github.io/assignees{/user}","branches_url":"https://api.github.com/repos/CODEYA/codeya.github.io/branches{/branch}","tags_url":"https://api.github.com/repos/CODEYA/codeya.github.io/tags","blobs_url":"https://api.github.com/repos/CODEYA/codeya.github.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CODEYA/codeya.github.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CODEYA/codeya.github.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/CODEYA/codeya.github.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CODEYA/codeya.github.io/statuses/{sha}","languages_url":"https://api.github.com/repos/CODEYA/codeya.github.io/languages","stargazers_url":"https://api.github.com/repos/CODEYA/codeya.github.io/stargazers","contributors_url":"https://api.github.com/repos/CODEYA/codeya.github.io/contributors","subscribers_url":"https://api.github.com/repos/CODEYA/codeya.github.io/subscribers","subscription_url":"https://api.github.com/repos/CODEYA/codeya.github.io/subscription","commits_url":"https://api.github.com/repos/CODEYA/codeya.github.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/CODEYA/codeya.github.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/CODEYA/codeya.github.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/CODEYA/codeya.github.io/issues/comments/{number}","contents_url":"https://api.github.com/repos/CODEYA/codeya.github.io/contents/{+path}","compare_url":"https://api.github.com/repos/CODEYA/codeya.github.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CODEYA/codeya.github.io/merges","archive_url":"https://api.github.com/repos/CODEYA/codeya.github.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CODEYA/codeya.github.io/downloads","issues_url":"https://api.github.com/repos/CODEYA/codeya.github.io/issues{/number}","pulls_url":"https://api.github.com/repos/CODEYA/codeya.github.io/pulls{/number}","milestones_url":"https://api.github.com/repos/CODEYA/codeya.github.io/milestones{/number}","notifications_url":"https://api.github.com/repos/CODEYA/codeya.github.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CODEYA/codeya.github.io/labels{/name}","releases_url":"https://api.github.com/repos/CODEYA/codeya.github.io/releases{/id}","created_at":"2014-12-17T08:45:45Z","updated_at":"2015-02-09T05:47:10Z","pushed_at":"2015-02-09T05:48:10Z","git_url":"git://github.com/CODEYA/codeya.github.io.git","ssh_url":"git@github.com:CODEYA/codeya.github.io.git","clone_url":"https://github.com/CODEYA/codeya.github.io.git","svn_url":"https://github.com/CODEYA/codeya.github.io","homepage":null,"size":28100,"stargazers_count":0,"watchers_count":0,"language":"CSS","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/CODEYA/codeya.github.io/pulls/10"},"html":{"href":"https://github.com/CODEYA/codeya.github.io/pull/10"},"issue":{"href":"https://api.github.com/repos/CODEYA/codeya.github.io/issues/10"},"comments":{"href":"https://api.github.com/repos/CODEYA/codeya.github.io/issues/10/comments"},"review_comments":{"href":"https://api.github.com/repos/CODEYA/codeya.github.io/pulls/10/comments"},"review_comment":{"href":"https://api.github.com/repos/CODEYA/codeya.github.io/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/CODEYA/codeya.github.io/pulls/10/commits"},"statuses":{"href":"https://api.github.com/repos/CODEYA/codeya.github.io/statuses/501bbaaa2f4c3a17ca882faa8a4613f96c778d10"}}}}