HBase 커뮤니티

HBase 커뮤니티 (Community)

Apache HBase 개발 커뮤니티가 어떻게 함께 작업하는지에 대한 규칙과 역할을 정리한 페이지예요. 컨트리뷰터로서 개발 흐름에 참여할 때 알아 두면 좋아요.

출처: 문서

본문

결정 사항 (Decisions)

기능 브랜치 (Feature Branches)

Feature Branch는 만들기 쉬워요. 커미터가 아니어도 만들 수 있어요. 개발자 메일링 리스트에서 브랜치 이름을 JIRA에 추가해 달라고 요청하면 커미터가 추가해 줘요. 그 후에는 Apache HBase JIRA의 기능 브랜치에 이슈를 등록할 수 있어요. 코드는 다른 곳에 보관하고 — 관찰될 수 있도록 공개 상태로 — dev 메일링 리스트에 진행 상황을 알리면 돼요. 기능이 커밋될 준비가 되면 커미터 3명의 +1을 받으면 기능이 merge돼요. 참고: HBase, mail # dev - Thoughts about large feature dev branches

이슈 해결 시 JIRA의 fix version 설정 방법 (How to set fix version in JIRA on issue resolve)

이슈를 해결할 때 JIRA에서 버전을 설정하는 방법에 대해 우리가 합의한 규칙이에요. master가 3.0.0, branch-2가 2.4.0, branch-1이 1.7.0이 될 예정이라면:

  • master에만 커밋(즉, 하위 호환이 안 되는 새 기능): 3.0.0으로 표시
  • master와 branch-2에만 커밋(즉, 2.x+에만 적용되는 하위 호환 새 기능): 3.0.0과 2.4.0으로 표시
  • master, branch-2, branch-1에 커밋(즉, 어디서나 적용되는 하위 호환 새 기능): 3.0.0, 2.4.0, 1.7.0으로 표시
  • master, branch-2, branch-2.3, branch-1, branch-1.4에 커밋(즉, 모든 활성 릴리스 라인에 적용되는 버그 수정): 3.0.0, 2.4.0, 2.3.x, 1.7.0, 1.4.x로 표시
  • 웹사이트 수정 커밋: 버전 없음

RESOLVED JIRA를 CLOSED로 바꾸는 시점 정책 (Policy on when to set a RESOLVED JIRA as CLOSED)

Fix Version/s 필드에 여러 릴리스를 나열한 이슈의 경우, 나열된 버전 중 하나가 릴리스되면 이슈를 CLOSE하기로 합의했어요. 이후의 변경은 새 JIRA에서 처리해야 해요.

ZooKeeper에는 transient 상태만! (Only transient state in ZooKeeper!)

zookeeper의 데이터를 죽여도 HBase는 그 위를 타고 넘어가며 zk 콘텐츠를 재생성할 수 있어야 해요. 이 주변에서 오래된 격언이에요. 우리도 방금 그것을 기록했어요. 우리는 현재 이 기본 원칙을 위반하고 있어요 — 적어도 replicat이 zk에 영구 상태를 유지하고요 — 하지만 이 황금률을 깨는 것을 되돌리기 위해 노력 중이에요.

커뮤니티 역할 (Community Roles)

릴리스 매니저 (Release Managers)

유지보수되는 각 릴리스 브랜치에는 릴리스 매니저가 있어요. 그는 새 기능과 버그 수정이 그 릴리스로 백포트되도록 조율하는 자원봉사자예요. 릴리스 매니저는 커미터예요. 특정 릴리스에 자신의 기능이나 버그 수정을 포함시키고 싶다면 그 릴리스 매니저와 소통하세요. 이 목록이 최신이 아니거나 나열된 사람에게 연락할 수 없다면 목록의 다른 사람에게 연락하세요.

릴리스 매니저:

Release Release Manager Latest Release EOL
0.94 Lars Hofhansl 0.94.27 April 2017
0.96 Michael Stack 0.96.2 September 2014
0.98 Andrew Purtell 0.98.24 April 2017
1.0 Enis Soztutar 1.0.3 January 2016
1.1 Nick Dimiduk 1.1.13 December 2017
1.2 Sean Busbey 1.2.12 June 2019
1.3 Mikhail Antonov 1.3.6 August 2020
1.4 Andrew Purtell 1.4.14 October 2021
1.5 Andrew Purtell 1.5.0 October 2019
1.6 Andrew Purtell 1.6.0 February 2020
1.7 Reid Chan 1.7.2 August 2022
2.0 Michael Stack 2.0.6 September 2019
2.1 Duo Zhang 2.1.10 May 2020
2.2 Guanghao Zhang 2.2.7 April 2021
2.3 Nick Dimiduk 2.3.7 October 2021
2.4 Andrew Purtell 2.4.18 June 2024
2.5 Andrew Purtell Check the download page NOT YET
2.6 Bryan Beaudreault Check the download page NOT YET

커밋 메시지 형식 (Commit Message format)

다음과 같은 Git 커밋 메시지 형식에 합의했어요.

HBASE-xxxxx . (<contributor>)</p> <p>커밋을 하는 사람이 기여자(contributor)라면 '(<contributor>)' 요소는 생략해요.</p> <h2 id="더-알아보기-learn-more">더 알아보기 (Learn more)</h2> </div> </article> <!-- ═══ 오른쪽: TOC (H2/H3 목차, 접기/펼치기) ═══ --> <aside class="wiki-toc" data-toc style="position:sticky; top:calc(var(--header-h) + 24px); max-height:calc(100vh - var(--header-h) - 48px); overflow:auto; padding:8px 0; border-left:1px solid var(--ds-line); padding-left:16px;"> <button type="button" class="wiki-toc__toggle" aria-expanded="true" aria-controls="wiki-toc-nav"> <span class="wiki-toc__label">목차</span> <span class="wiki-toc__chevron">▾</span> </button> <nav id="wiki-toc-nav" class="wiki-toc__nav" aria-label="페이지 목차"> <a href="#hbase-커뮤니티-community" style="padding-left:0px">HBase 커뮤니티 (Community)</a><a href="#본문" style="padding-left:0px">본문</a><a href="#결정-사항-decisions" style="padding-left:0px">결정 사항 (Decisions)</a><a href="#기능-브랜치-feature-branches" style="padding-left:10px">기능 브랜치 (Feature Branches)</a><a href="#이슈-해결-시-jira의-fix-version-설정-방법-how-to-set-fix-version-in-jira-on-issue-resolve" style="padding-left:10px">이슈 해결 시 JIRA의 fix version 설정 방법 (How to set fix version in JIRA on issue resolve)</a><a href="#resolved-jira를-closed로-바꾸는-시점-정책-policy-on-when-to-set-a-resolved-jira-as-closed" style="padding-left:10px">RESOLVED JIRA를 CLOSED로 바꾸는 시점 정책 (Policy on when to set a RESOLVED JIRA as CLOSED)</a><a href="#zookeeper에는-transient-상태만-only-transient-state-in-zookeeper" style="padding-left:10px">ZooKeeper에는 transient 상태만! (Only transient state in ZooKeeper!)</a><a href="#커뮤니티-역할-community-roles" style="padding-left:0px">커뮤니티 역할 (Community Roles)</a><a href="#릴리스-매니저-release-managers" style="padding-left:10px">릴리스 매니저 (Release Managers)</a><a href="#커밋-메시지-형식-commit-message-format" style="padding-left:0px">커밋 메시지 형식 (Commit Message format)</a><a href="#더-알아보기-learn-more" style="padding-left:0px">더 알아보기 (Learn more)</a> </nav> </aside> </div> </main> <!-- ═══ scope tree 접기/펼치기 인터랙션 ═══ --> <script> (function () { // 페이지 이동 시 항상 최상단(제목/목차)에서 시작 — 모바일에서 트리가 하단에 있어도 뷰포트를 하단에 남기지 않음 if ('scrollRestoration' in history) { history.scrollRestoration = 'manual'; } window.addEventListener('load', function () { window.scrollTo(0, 0); }); document.querySelectorAll('[data-wtree-toggle]').forEach(function (btn) { btn.addEventListener('click', function (e) { e.preventDefault(); e.stopPropagation(); var li = btn.closest('.wiki-tree__node'); if (!li) return; var sub = li.querySelector(':scope > .wiki-tree'); if (!sub) return; var lazyPath = sub.getAttribute('data-wtree-lazy'); if (lazyPath && sub.getAttribute('data-wtree-loaded') !== '1') { // 첫 펼침: 하위 트리를 lazy 프래그먼트로 로드 후 펼침 fetch('/wiki/tree/' + lazyPath.replace(/^\/+/, '')) .then(function (r) { return r.text(); }) .then(function (html) { sub.innerHTML = html; sub.setAttribute('data-wtree-loaded', '1'); sub.removeAttribute('data-wtree-lazy'); wireToggles(sub); openSub(sub, btn); }) .catch(function () { openSub(sub, btn); }); return; } openSub(sub, btn); }); }); function openSub(sub, btn) { var collapsed = sub.classList.toggle('is-collapsed'); sub.hidden = collapsed; btn.textContent = collapsed ? '▸' : '▾'; btn.setAttribute('aria-expanded', collapsed ? 'false' : 'true'); } // lazy 프래그먼트로 삽입된 하위 노드들의 토글도 이벤트 연결 function wireToggles(scope) { scope.querySelectorAll('[data-wtree-toggle]').forEach(function (btn) { if (btn._wtreeBound) return; btn._wtreeBound = true; btn.addEventListener('click', function (e) { e.preventDefault(); e.stopPropagation(); var li = btn.closest('.wiki-tree__node'); if (!li) return; var sub = li.querySelector(':scope > .wiki-tree'); if (!sub) return; var lazyPath = sub.getAttribute('data-wtree-lazy'); if (lazyPath && sub.getAttribute('data-wtree-loaded') !== '1') { fetch('/wiki/tree/' + lazyPath.replace(/^\/+/, '')) .then(function (r) { return r.text(); }) .then(function (html) { sub.innerHTML = html; sub.setAttribute('data-wtree-loaded', '1'); sub.removeAttribute('data-wtree-lazy'); wireToggles(sub); openSub(sub, btn); }) .catch(function () { openSub(sub, btn); }); return; } openSub(sub, btn); }); }); } // TOC 접기/펼치기 토글 var toc = document.querySelector('[data-toc]'); if (toc) { var toggleBtn = toc.querySelector('.wiki-toc__toggle'); var nav = toc.querySelector('.wiki-toc__nav'); var chevron = toc.querySelector('.wiki-toc__chevron'); if (toggleBtn && nav) { toggleBtn.addEventListener('click', function () { var collapsed = toc.classList.toggle('is-collapsed'); toggleBtn.setAttribute('aria-expanded', collapsed ? 'false' : 'true'); if (chevron) chevron.textContent = collapsed ? '▸' : '▾'; }); } } // 페이지 진입 시 활성 노드로 스크롤 노출 var active = document.querySelector('.wiki-tree__node.is-active'); if (active && active.scrollIntoView) { try { active.scrollIntoView({ block: 'nearest' }); } catch (e) {} } })(); </script> <style> /* scope tree 행 스타일: 활성 강조 + 들여쓰기 토글 정렬 */ .wiki-tree__row { display:flex; align-items:center; gap:6px; border-radius:var(--r-xs); } .wiki-tree__row:hover { background:var(--ds-bg-subtle); } .wiki-tree__toggle { flex:0 0 auto; width:16px; height:22px; padding:0; border:none; background:none; cursor:pointer; color:var(--ds-text-3); font-size:10px; line-height:1; display:flex; align-items:center; justify-content:center; } .wiki-tree__dot { flex:0 0 auto; width:16px; height:1px; } .wiki-tree__link { flex:1 1 auto; min-width:0; padding:6px 6px; border-radius:var(--r-xs); font-size:13px; color:var(--ds-text-2); text-decoration:none; line-height:1.35; overflow:hidden; text-overflow:ellipsis; } .wiki-tree__node.is-active > .wiki-tree__row { background:var(--ds-text); } .wiki-tree__node.is-active > .wiki-tree__row .wiki-tree__link { color:var(--ds-bg-card); font-weight:700; } .wiki-tree.is-collapsed { display:none; } /* TOC 접기/펼치기 토글 버튼 */ .wiki-toc__toggle { display:flex; align-items:center; justify-content:space-between; width:100%; padding:4px 6px; margin-bottom:6px; border:none; background:none; cursor:pointer; font-size:12px; font-weight:600; letter-spacing:.08em; text-transform:uppercase; color:var(--ds-text-2); border-radius:var(--r-xs); text-align:left; } .wiki-toc__toggle:hover { color:var(--ds-text); background:var(--ds-bg-subtle); } .wiki-toc__nav { display:flex; flex-direction:column; gap:2px; } .wiki-toc__chevron { font-size:10px; color:var(--ds-text-3); transition:transform .15s var(--ease-out); } .wiki-toc.is-collapsed .wiki-toc__chevron { transform:rotate(-90deg); } .wiki-toc.is-collapsed .wiki-toc__nav { display:none; } </style> <html> <footer class="site-footer--compact" style="background:var(--ds-bg-strong); color:var(--ds-text-on-dark); margin-top:80px;"> <div class="site-footer--compact__inner"> <!-- 1줄 블록: 좌측 브랜드 + 우측 링크 가로 나열 --> <div style="display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:20px 32px;"> <div style="display:flex; align-items:center; gap:16px; flex-wrap:wrap;"> <img src="/assets/logo-white.png" alt="DataSketchers" style="height:32px; width:auto;" /> <span style="font-size:13px; color:#b0b0b2; max-width:320px;">AI·데이터·디자인으로 기업의 디지털 전환을 지원합니다. 서울시립대학교 캠퍼스타운 창업기업</span> </div> <nav style="display:flex; flex-wrap:wrap; gap:8px 24px; font-size:13px;" aria-label="푸터 링크"> <a href="/about" style="color:#e5e5e6; text-decoration:none;">회사소개</a> <a href="/services" style="color:#e5e5e6; text-decoration:none;">사업영역</a> <a href="/products" style="color:#e5e5e6; text-decoration:none;">D-SKET</a> <a href="/clients" style="color:#e5e5e6; text-decoration:none;">고객사</a> <a href="/blog" style="color:#e5e5e6; text-decoration:none;">블로그</a> <a href="/" style="color:#e5e5e6; text-decoration:none;">위키</a> <a href="/press" style="color:#e5e5e6; text-decoration:none;">보도자료</a> <a href="/esg" style="color:#e5e5e6; text-decoration:none;">ESG</a> <a href="/contact" style="color:#e5e5e6; text-decoration:none;">문의</a> </nav> </div> <div style="margin-top:28px; padding-top:16px; border-top:1px solid rgba(255,255,255,0.12); display:flex; justify-content:space-between; flex-wrap:wrap; gap:12px; font-size:13px; color:#8a8a8d;"> <span>© 데이터스케쳐스. All rights reserved.</span> <span>사업자등록번호 349-81-03411</span> </div> </div> </footer> </html> </body> </html>