2017-07-10 86 views
2

我想將我的Bitbucket存儲庫鏡像到CodeCommit並從中進行構建,而不影響開發人員的工作流程。遷移很簡單,現在的目標是將CodeCommit與Bitbucket同步,理想情況下,通過推送到Bitbucket觸發,但基於時間的同步也是可以接受的。AWS Lambda for CodeCommit回購同步

我發現這個職位:https://aws.amazon.com/blogs/devops/replicating-and-automating-sync-ups-for-a-repository-with-aws-codecommit/這裏Mirror a Git Repo directly to AWS CodeCommit

懸而未決的問題請您分享想法如何編寫AWS lambda函數同步CodeCommit存儲庫到位桶。

+0

謝謝你的所有意見。我想分享我找到並實施的解決方案。 –

+0

https://marketplace.atlassian.com/plugins/com.englishtown.stash-hook-mirror/server/overview這個插件允許任何兼容git的服務器進行repo鏡像。但是,如果你的Bitbucket服務器使用gnutls lib(默認爲Ubuntu)編譯的git客戶端,你可能會在bitbucket日誌中出現錯誤「gnutls_handshake()failed:Illegal parameter」。解決它,建立你的git客戶端反對openssl庫 - > https://askubuntu.com/questions/186847/error-gnutls-handshake-failed-when-connecting-to-https-servers –

回答

1

雖然我還沒有嘗試過這一點,但我懷疑以下工作流程可能會起作用。一般的想法是使用BitBucket webhooks功能通過使用API​​網關觸發lambda函數。

  1. 寫lambda函數從到位桶倉庫的URL這「鏡子」克隆並推送至你的CodeCommit庫的URL。你的函數可能需要包含它自己的獨立git客戶端庫。

  2. 使用調用您的lambda函數的API網關創建一個API。這裏可能面臨的挑戰可能是驗證發送到您的API的POST請求來自Bitbucket,而不是其他來源。

  3. 爲您的Bitbucket存儲庫創建一個新的webhook,URL是您在步驟2中創建的API的URL。在每次推送後,「Repository push」觸發器就足以觸發複製事件。

+1

有趣,謝謝。您如何使用SNS而不是Gateway API?使用:https://github.com/juhamust/bitbucket2sns? –

+0

在我看來,這個項目實際上是在做一些非常相似的事情。看起來它使用[Serverless](https://serverless.com/framework/docs/providers/aws/)以您的名義使用[CloudFormation](https://aws.amazon。)創建API網關和Lambda資源。 COM/cloudformation /)。但是,不是隻停留在lambda,而是通知SNS主題。要從這裏進行復制,我認爲你需要一個用戶來監聽來自SNS的通知來觸發它。這可能需要硬件或其他lambda函數,所以我沒有看到通過SNS的好處。 –

0

一種選擇是使用CodePipline。不幸的是CodePipline目前有一個奇怪的過程,它使得Lambda函數成爲管道的唯一過程。基本上它歸結爲:

  1. 請與AWS CodeCommit一個CodePipeline作爲源回購
  2. 創建它要求設置所需的構建/部署階段之一。請注意,稍後您將刪除這些內容(除非您實際上計劃使用CodePipeline階段),因此請創建一個新的CodeBuild項目或其他內容,以便通過該向導。
  3. 創建一個與BitBucket對話以同步更改的Lambda函數。附加的角色必須具有與CodePipline和CodeCommit接口的權限。 Lambda函數還必須調用PubJobSuccessResultPutJobFailureResult中的任意一個,以便CodePipeline知道Lambda實際做了某些事情,而不是坐等待函數完成。
  4. 現在回到CodePipeline並對其進行編輯。無論生成的任何階段是否刪除了現有的操作。添加一個指向Lambda函數的新Invoke操作,並設置角色,該角色可以訪問CodePipeline以設置作業結果,CodeCommit用於讀取repo。

另一種方法是使用CloudWatch scheduling以X間隔調用Lambda,如果您對延遲更長的同步沒問題。從長遠來看,這可能會更容易設置,如果沒有任何要同步的空間,則可能會運行空Lambda,並計算您的分配。

+0

非常感謝分享,我會現在檢查CodePipeline。一個問題。當Lambda啓動時,與Bitbucket同步意味着什麼? git-clone並推送到CodeCommit?我的一些回購非常大。有沒有辦法在CodeCommit端運行git-pull,而無需中間克隆? –

+0

@ C.B。 CodePipline將按照http://docs.aws.amazon.com/codepipeline/latest/APIReference/API_Artifact.html中所述的方式傳遞Lambda的一些事件變量。您需要檢查提交散列的修訂版本,您可以使用該散列提取單個提交併同步增量,而不是一個巨大的同步。 –

+0

不錯!我會檢查它。再次感謝 –