用Docker和Git搭建在線開發環境

jopen 9年前發布 | 26K 次閱讀 Git 版本控制系統


免責聲明

以下分享的內容是個人在業余時間的一些經驗,并不代表IBM的觀點。

為什么要在云端搭建開發環境

如今,在傳統的開發模式下,版本控制,自動化測試,持續集成都已經陸陸續續放到的云端。

  • 測試工程師,可以用過自動化測試腳本在云端做大規模的回歸測試
  • 運維工程師,可以通過自動化的部署工具在云端快速部署應用
  • 產品負責人,可以通過版本控制工具控制產品的發布
  • </ul>

    唯獨開發工程師還在利用手中的電腦,筆記本等設備來完成開發工作。
    在項目開發階段,我們通常面臨下面幾個問題:

    1. 在項目啟動階段,如何讓開發工程師快速搭建,并配置開發環境,來縮短項目啟動時間和成本。
    2. 在項目開發階段,如何讓開發工程師有:

      • 完全相同的開發環境,來降低調試成本。
      • 近似于產品環境的架構,來降低部署時因環境差異帶來的風險。
      • 降低對開發設備性能和種類要求,來降低設備成本。
      • 靈活的分配開發資源(CPU,內存,存儲),讓需要大量開發資源的工程師快速拿到資源。
      • </ul> </li> </ol>

        云端開發環境要解決的問題總結

        基于以上思考,我總結了以下4個云端開發環境要解決的問題:

        • 保證每個開發工程師都能快速的獲得一致的“開箱即用”的開發環境
        • 開發環境擺脫開發設備的種種限制,例如操作系統,設備性能
        • 讓開發環境盡可能模擬產品環境的結構。
        • 靈活的分配開發資源
        • </ul>

          在云端搭建開發環境的挑戰

          一個“開箱即用”的開發環境應該包括:功能完備的代碼編輯器, 一個應用運行環境,一個調試工具箱。

          • 為了擺脫設備的限制,集成開發環境可以用HTML5等主流瀏覽器兼容技術實現。
          • 為了靈活的分配資源和模擬產品環境,可以將應用運行環境放在云端,并使用容器技術配置。
          • 調試工具包括日志的輸出,斷點等功能。
          • </ul>

            技術難點總結

            • 在線的集成開發環境:兼容各大主流瀏覽器
            • 隔離的運行環境:隔離,可定制,高效
            • 調試代碼:查看日志,可設置跟蹤斷點
            • </ul>

              潛在的可選技術

              基于技術難點,我做了一些調查研究,選擇了幾個備選的開源技術。

              • 在線集成開發環境:ICEcoderEclipse OrinoCodiad
              • 隔離的運行環境:云端虛擬機、Docker
              • 代碼調試:fluentd
              • </ul>

                目前,只確定了使用Docker來實現運行環境。

                集成在線開發環境,我使用Git來解耦代碼運行環境和編輯環境,并代碼同步。

                代碼調試,我使用獨立的fluentd服務收集日志,通過SSH登錄到虛擬機查看fluent收集的Docker日志。

                云端開發環境的架構概要

                下面這張圖是一個簡單的架構說明。首先,使用Git來解耦代碼的編輯和運行環境。
                我在云端,使用Docker搭建了Git裸庫,裸庫中用Git hook來同步代碼。使用Docker來運行應用,通過瀏覽器來檢查結果。

                因為,代碼的編輯和運行環境的分離,開發工程師可以靈活的選擇開發工具。開發工具可以是在線編輯器,也可以是本地的編輯器。
                借助于Docker的靈活性,開發工程師可以快速配置出應用運行環境,并分享給開發團隊成員。

                Architecture_Overview.png

                概念驗證

                • 在本地編輯代碼
                • 用Git同步到云端
                • 用docker運行代碼查看結果
                • </ul>

                  一小段視頻錄像,演示如何在云端使用開發環境

                  視頻演示如何在云端進行Django項目開發

                  詳細步驟

                  參考 在線開發環境實踐

                  Q&A

                  Q:那么多的開發者,域名怎么分配?


                  A:目前,我是通過Nginx的反向代理來分配不同的子域名給不同開發人員。
                  Q:在這個體系中開發與測試是如何聯系?


                  A:這套體系主要專注于開發的部分,測試與開發的互動并沒有在這套體系中體現出來, 不過有很多成型的DevOps體系可以作為參考。
                  Q:云端開發是不是開發環境放在云上,開發者SSH到自己的開發環境,提交代碼后Compose是自動執行還是人為執行?


                  A:理想狀況下,是將一下三個部分都放倒云端, 目前我只實現了運行環境在云端。 Compose現在也是手動之行的, 但是可以通過腳本做到自動化

                  • 功能完備的代碼編輯器
                  • 一個應用運行環境
                  • 一個調試工具箱。
                  • </ul> </blockquote> Q:云端開發會不會減少開發者的工作量,讓其更專注于代碼上,而不是流程的應用上?


                    A:云端開發會讓開發人員更少的經歷去學習了解中間件, 用更多的時間專注于業務功能的實現,從而做到讓開發更關注需求本身,而不是技術本身。
                    另外在線開發環境可以提高協作性。因為運行環境和代碼都在云端,開發人員可以很快的切換其他人的開發環境和代碼。
                    Q:在線IDE在實際使用中的體驗,可被開發人員的接受程度如何,對各類語言的支持情況呢?


                    A: 目前的嘗試在線IDE受網絡,和功能的制約,不能完全和本地的IDE相比較。 不過因為Git的解耦,開發人員可以選擇使用本地的IDE編輯代碼
                    Q:Git還是比較復雜,有沒有更簡單的工具?


                    A:除了Git之外還有一種sshfs的技術,可以直接映射遠端代碼到本地。 不過考慮到版本的回溯,甚至將來利用大數據來分析開發人員的開發行為。 Git會是一個比較好的選擇。 Git現在的復雜是因為相應的自動化腳本沒有建立,在建立之后,開發人員可以忽略Git同步的部分。
                    Q:代碼提交到云端后,容器中是怎么生效的,是把代碼目錄作為掛載點還是容器中有進程實時去拉?


                    A:是的,現在代碼作為卷掛載到容器中的。
                    Q:但是如果是以掛載的方式,怎么能重現Commit鏡像時保證代碼的同步呢?


                    A:我想這個問題回到了“這個體系關注的問題到底是什么”上。 我分享的這套體系專注于項目中的開發部分,并不專注版本控制,測試和部署。
                    通常情況下,項目應該有另外一個Git倉庫來做版本控制,然后會有專門的build體系,來自動build指定的代碼。
                    Q:Commit鏡像時的鏡像里并沒有代碼啊?打算任何環境都是以掛載的方式嗎?這樣可移值性會不會很差?


                    A:首先Container是通過項目路徑下的dockerfile生成的, 只是在運行環境中又掛在了一次代碼。 當開發結束后, 可以通過項目的dockerfile,整體build代碼和環境,并部署。
                    Q:例如采用git flow 這樣的多分支并行開發,每個分支都要有一套對應的docker container 嗎?如何來關聯分支和容器?


                    A:這是個好問題,首先Docker只提供代碼的運行環境,如果代碼的不同分支使用的是不同的運行環境,docker container是應該是多套的,而且,不同的dockerfile是應該跟代碼在一起的。
                    如果運行環境是相同的,可以使用同一套docker container。只需要把代碼切換到Container里即可。
                    Q:當先就目前來說,在云上部署確實很好,可是關于一些生產的私有性環境是不是在本地比云端更靠譜?


                    A:我理解這個問題應該是問將云端開發環境部署到公有云,還是私有云。 我個人的理解是, 目前來看,應該部署在企業內部的私有云上,來避免代碼的泄露。
                    Q:當前來說搭建一個統一的環境使用Kubernetes or SHIPYARD 搭建起來會更方便,而且現在物理設備的價格也更便宜,可控程度更高,在云端真的比在內部控制好么?


                    A:同第一個問題一樣,云端指的可以是私有云,也可以是公有云。 我贊同提問者的考量,私有云會更好一些。
                    Q:是不是先提交代碼,觸發hook,在容器里同步代碼并編譯和執行。這樣效率會更高嗎?


                    A:將代碼編輯環境和運行環境解藕, 使用Git來同步,效率受兩個因素制約:

                    • I/O也就是網絡速度和盤速度。 保證網絡速度的前提下,這個因素是可以忽略的
                    • Git本身的效率,因為每一次保存都會提交Git,Git本身是增量存儲,所以效率也不會太低。
                    • </ul> </blockquote> Q:對私有倉庫是否也能同樣生效?對于容器不能被外部訪問的話,hook機制還能同步代碼嗎?


                      A: 目前這套體系建議整體部署在私有云中。
                      Q:每位開發者都具有相同的開發環境,該開發環境是用Container么,網絡是如何解決的?也就是說在開發者眼里使用的就是虛擬機,具有故定的IP。


                      A:應該說每位開發者都有相同的代碼運行環境,這部分是通過Container實現的。目前明沒有對網絡有太多的考量, 在規劃中會有一個網絡分配的組件,為開發人員分配不同的子域名,并自動將域名路由到container上,這樣可以更靈活的分配主機資源,管理Container。
                      Q:代碼放在云端怎么保證安全,防止企業代碼泄漏?


                      A:部署在私有云上, 需要公網訪問時,使用V*N。
                      Q:我公司主要需要是C++研發電信行業,不通的省份,不同的機型都要搭理一套開發測試環境,你們講的主要是Web開發,C++是否適合云端開發?


                      A:我主要研究Web方向。 只能簡單的說一下思路, C++的docker image是有的,主要是看你需要一個什么樣的調試環境。如果可以通過Web查看結果。我覺得是可行的。
                      Q:關于使用Git搭建持續集成環境有一個疑問,就是如何處理在開發環境和生產環境下,個別文件不同的情況應該如何處理?例如一些配置文件,Django中的settings.py,在生產和開發環境下,其內容是不同的。


                      A:通常情況下,配置文件是要獨立在代碼之外的,用Django舉例, 可以使用.env。 在開發環境,和生產環境使用不同的配置文件,而不是直接寫在代碼里面。
                      如何配置產品環境和開發環境,可以參考一些好的實踐文章。 分離運行環境和代碼的實踐文章,業界比較認同的是“ The 12-Factor App”這個設計思路。
                      Q:如果后端采用集群方式進行管理,請問您對后端容器資源使用的預估,以及對整個集群的負載能力的判斷,是如何考慮的?項目不同,對后端資源影響挺大。


                      A: 目前項目還處在概念驗證階段。 對于中型的Web項目,單個開發人員分配1CPU資源,1GB內存是完全可以滿足需要的。
                      Q:本地開發可以快速切換本地Git的不同代碼版本查看,遠程運行的話,想要查看之前代碼的運行結果需要真的將代碼在遠程共享本庫中回滾嗎?


                      A:是的,因為每個開發都自己的遠程代碼代碼庫。 所以,回滾并不會影響其他人,也不會丟失自己的代碼。
                      以上內容根據2015年12月29日晚微信群分享內容整理。分享人: 王延祺,IBM助理架構師,主要負責web應用設計和架構。 最近幾年,關注云技術對Web應用架構和開發方式的影響。 從2015年初開始學習并關注容器技術,并在個人業余項目中實踐用Git和Docker搭建在線開發環境。Github: @yanqiw、推ter: @yanqiwfrankwang.cn DockOne每周都會組織定向的技術分享,歡迎感興趣的同學加微信:liyingjiesx,進群參與,您有想聽的話題可以給我們留言。

                        來自: http://dockone.io/article/930

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!