跳到內容

連接程式碼託管

Control Center 支援三種程式碼託管服務,在應用程式中一律稱為託管平台:GitHub、GitLab 與 Bitbucket Cloud。它們沒有任何一個是預設值。連接一個,一切就能運作;連接多個,同一個工作區就能同時容納來自這三者的儲存庫。

託管平台是每個儲存庫自身的屬性,在你註冊儲存庫時從它的 origin 遠端讀取。你永遠不需要自行挑選,也沒有任何會設錯的工作區層級設定。

  1. 開啟設定 → 工作區 → 個人資料與身分(/settings/workspace/profile)。
  2. 找到程式碼託管卡片。所有支援的託管平台都會列出,無論是否已連接。
  3. 如果該列提供以 … 登入,就按下它;否則按新增權杖並貼上一組。

登入只會出現在伺服器已註冊應用程式的託管平台上——目前是 GitHub,採裝置流程(請見建立 GitHub App)。其餘全都是貼上權杖,這是誠實的互動方式,而不是給一個按了也無法完成的按鈕。

無論是哪一種,這份憑證都是你的,而且存放在伺服器上,以你的使用者 id 為鍵:你輸入權杖的那台機器不會儲存任何權杖,你登入的每一部裝置都用同一份憑證,其他成員也讀不到它。它會在下一次請求時生效——不需要重啟任何東西,而中斷連接會立刻讓它不再被送出。

每一列都會告訴你它的憑證來自何處,因為那正是「我的權杖沒用」與「是另一組權杖在回應」之間的差別:

副標題 意義
Signed in as octocat 正在使用你自己的憑證
Signed in as octocat · via this server's app 由伺服器的應用程式身分回應——你尚未登入
Signed in as octocat · from the environment 由伺服器的環境變數回應,而不是你的憑證
Not connected 你沒有這個託管平台的憑證
託管平台 權杖 建立位置
GitHub Classic:repo 與 read:org。Fine-grained:Contents + Pull requests(讀取/寫入)、Checks + Actions(讀取) github.com → Settings → Developer settings → Tokens
GitLab 具備 api 範圍的個人存取權杖 gitlab.com → User settings → Access tokens
Bitbucket Atlassian API 權杖,外加你的帳號電子郵件 id.atlassian.com → Security → API tokens

Bitbucket 會以你的帳號電子郵件作為使用者名稱、權杖作為密碼來驗證。請在伺服器環境中設定 BITBUCKET_EMAIL,讓它知道該用哪個電子郵件與權杖配對。

若是無介面或 CI 安裝,伺服器會讀取下列變數:

  • GitHub —— GITHUB_TOKEN,然後是 GH_TOKEN
  • GitLab —— GITLAB_TOKEN,然後是 CI_JOB_TOKEN
  • Bitbucket —— BITBUCKET_API_TOKEN,然後是 BITBUCKET_TOKEN(搭配 BITBUCKET_EMAIL)

這些是伺服器的憑證,不是你的,而這個區別至關重要:代表你提出的請求只會使用你的憑證,不會用到其他任何東西,因此環境變數永遠不會悄悄替代你。背後沒有真人操作的工作——webhook、PR 輪詢、工單同步——會先解析伺服器的應用程式身分,再來是伺服器擁有者的憑證,最後才是環境變數。順序是固定的,因此「我明明登入了,卻什麼都沒變」永遠不會是一個成立的結果。

同一個人在 GitHub 上是 octocat,在 GitLab 上則完全是另一個名字。Control Center 會依託管平台解析你的身分,並為每個儲存庫使用正確的那一個;這正是「需要我審查」、「由我建立」與「你已核准」在混合式工作區中仍然正確的原因。

如果某個託管平台的身分尚未解析出來,它的儲存庫對收件匣的貢獻就是零,而不是什麼都符合。收件匣會如實說明,而不是宣稱你已經全部處理完畢。

收件匣與 PR 佇列會分散查詢工作區中出現的每一個託管平台,並把結果合併成單一流程——GitHub 的 pull request 與 Bitbucket 的 pull request 會並排出現,依時間排序,而不是依供應商分組。

失敗是彼此隔離的。某個託管平台若故障、受到速率限制或未連接,它就不會貢獻任何內容,也不會影響其他平台;它絕不會讓整個收件匣清空。它自己的儲存庫會持續顯示最後已知的狀態,直到它恢復為止。

每個託管平台都支援核心循環:列出並開啟 pull request、讀取差異、行內與頂層留言、審查、合併與關閉。除此之外,它們確實各有差異,而 Control Center 會把託管平台做不到的事藏起來,而不是顯示一個會悄悄失敗的控制項。

能力 GitHub GitLab Bitbucket
批次(待送出)審查 ✓ ✓ —
要求變更 ✓ ✓ ✓
每個檔案的「已檢視」狀態會同步 ✓ — —
表情回應 ✓ ✓ —
團隊/群組審查者 ✓ ✓ —
建議審查者 ✓ — ✓
PR 上的 CI 結果 ✓ ✓ ✓
深入檢視 CI 工作的步驟/記錄 ✓ ✓ —
堆疊式 pull request ✓ — —
PR 說明範本 ✓ ✓ —
通知輪詢 ✓ — —
豐富的使用者設定檔 ✓ ✓ —
伺服器端的 PR head ref ✓ ✓ —

當某項能力缺席時,功能的退化方式是誠實的:

  • 已檢視狀態仍然可用,但只限於你設定它的那部裝置。
  • Bitbucket 上的批次審查會一則留言一則留言地張貼,因此審查者看到的是它們逐一送達,而不是一次全部出現。
  • Bitbucket 上沒有 PR head ref,代表檢出某個 pull request 時會依名稱抓取它的來源分支,而該分支一旦被刪除就會失敗。

GitLab 把 pull request 稱為 merge request。Control Center 在自己的模型中一律說「pull request」,而在談論某個託管平台時,則使用該平台自己的說法。

PR 清單是空的,並顯示某個託管平台未連接

標題為「PR 清單是空的,並顯示某個託管平台未連接」的章節

你沒有那個託管平台的憑證。請在設定 → 工作區 → 個人資料與身分 → 程式碼託管中登入或貼上權杖。其他託管平台的儲存庫不受影響。

我連接了託管平台,但它的儲存庫仍然什麼都沒顯示

標題為「我連接了託管平台,但它的儲存庫仍然什麼都沒顯示」的章節

檢查該列的副標題。如果它顯示「透過此伺服器的應用程式」或「來自環境變數」,就代表回應的不是你預期的那份憑證——凡是代表你提出的請求,都以你自己的憑證為優先,因此若顯示的不是這樣,就表示你的憑證沒有儲存成功。

註冊需要同時滿足三項條件:路徑位於 git 工作樹內、具有 origin 遠端,且該遠端指向 github.com、gitlab.com 或 bitbucket.org。請見將儲存庫加入工作區。

大量使用之後,所有東西都會停擺一陣子

標題為「大量使用之後,所有東西都會停擺一陣子」的章節

那是速率限制的斷路器。當某個託管平台發出已觸及主要限制的訊號時,用戶端會在本地直接讓後續請求失敗,不發出任何網路呼叫,直到該時間窗過去為止——因此重試風暴不會讓限制更加嚴重。暫時性失敗會以指數退避重試。