# Github ## 動機 用了這麼久git,卻有很多功能沒有了解。究竟如何remote deployment、究竟什麼是CI/CD、究竟如何該有效的使用git或是github上的各種工具。我認為是時候來好好了解github與其他常用的自動化功能。搜尋github repo secret的資料時,看到主要參考資料中的IThome鐵人賽文章,認為是時候去了解這些功能了,因此將會參考此系列文章對github相關功能進行理解。 ## 主要參考資料 [不僅是程式碼代管平台 - Github 能做些什麼? ](https://ithelp.ithome.com.tw/users/20091494/ironman/4464) ## :star::star::star: Github workflow :star::star::star: 主要用來支援定期更新的團隊或專案  1. 建立 Branch 1. 加入 Commit 1. 開啟 Pull Request (向開源專案提交貢獻的方法) 1. Code Review 1. 合併前部署 (確認可以正常運作) 1. Merge ### GitHub 與 DevOps 之間的關係 多數的 DevOps 流程是 1. 專案管理(Plan & Track) 2. 開發(Develop) 3. 建置與測試(Build & Test) 4. 部屬(Deploy) 5. 維運(Operate) 6. 監控與反饋(Monitor & Learn)  而Github是圍繞著Ripo去做這些管理,聚焦於該儲存庫的內容與交付品質,避免在 Plan & Track 階段失去焦點(其實這裡我看的不是很懂)  ### Github中的軟體品質與安全 在Github中提交Pull Request就和DevSecOps中的左移安全(Shift Left Security)是一樣的概念,在開發階段即實施安全措施。 ### 專案管理 Github可以透過各種工具的使用與組合,滿足多種開發流程。 ## Repository Repo中包含專案的所有程式碼/文件與修改歷史紀錄,github有幾個比較特殊的設定: ### Add a README file 幫你預先建立一個README file ### Add .gitignore 有提供gitigmore的模板供你選擇 ### Choose a license 說明在這個Repo中有那些規則  ## Issues  案管理系統內管理工作事項,代表發起一項工作,可以替每個Issue指派負責的人處理、設定label,甚至搭配CI/CD功能驗證該項Issue是否完成。 Github有提供一些預設label [^預設label]。 [^預設label]: bug (問題)、documentation (文件), duplicate (重複問題), enhancement (新功能或請求), good first issue, help wanted(需要額外關注), invalid(不正確), question(問題), wontfix(不會進行) ### Issue 的相關設定  #### Link Project 可以將Issue連結到相關的Project中。 #### Milestone 可以將Issue與Repo所設立的Milestone做連結。 #### Linked pull request 可以將Issue與Pull request連結。因為Issue如果解決,代表跑完了一個完整的github workflow,自然就會有該Issue的Pull request。 ## Labels  可以將Issue做分類,方便追蹤。  ## Milestone (里程碑)   我們可以在Issue > Milestone中新增milestone。 讓你對Repo設定里程碑,訂定需要達成的目標、日期。 :::info Milestone主要的目的有: 1. 在主要的時間點上追蹤進度 1. 相同類型的 Issue 群組化 1. 作為處理的優先順序依據 ::: 在新增Milestone後就可以將Issue加入Milestone,進行分類及追蹤。 ## Tag (標籤)  ([git基本功能](https://git-scm.com/book/zh-tw/v2/Git-%E5%9F%BA%E7%A4%8E-%E6%A8%99%E7%B1%A4)) 可以為你的commit加上Tag,==大家通常會用這個功能來標示發行版本==。 可以在送出commit時就加上Tag,或是事後再加上。 Tag分成Lightweight (輕量級標籤)跟Annotated (有註解的標籤)。差別在於: * 輕量級的標籤就像是一個不會移動的分支——這個標籤只會指向一個特定的提交。 * 有註解的標籤,會在 Git 的資料庫中儲存成完整的物件。 它們將被計算校驗碼;包含貼標籤那個人的名字、電子郵件和日期;能夠紀錄一個標籤訊息;並且可以簽署及透過 GNU Privacy Guard (GPG) 驗證。 通常建議你可以建立一個有註解的標籤,以便你可以保留跟這個標籤有關的所有資訊;但是你如果只想要一個暫時的標籤,或是因為某些原因不想保留額外的資訊,你也可以只用輕量級標籤。 (取自[Git 基礎 - 標籤](https://git-scm.com/book/zh-tw/v2/Git-%E5%9F%BA%E7%A4%8E-%E6%A8%99%E7%B1%A4)) 當新增Tag並推上去之後,就可以在 Code > Tag 中看到該標籤  ## Release (新版本) 即為釋出的正式版,是 [DevOps](/Jnz_oFO_TDGc1FGg6fXosg) 中重要的程序,屬於交付工作。 使用者可以下載**原始程式碼**與**可執行程式 (binary file)**。在建立 Release 時,必須注意: * 此功能必須建立在 Tag 上 * 釋出的新版本必須選擇Tag * 需要加入 Release note * 上傳可執行的程式 (Binary file)。 ## Branch  這裡要介紹的並不是如何操作Branch,而是幾種建立Branch的思路 ### GitHub Workflow 在上面就有提到 [GitHub Workflow](#-Github-workflow-) 主要強調 pull request 與合併前部屬,確保問題可以快速解決。 創建一個Branch就是為了解決一個問題,用Pull Request提出解法,用Code Review來討論解法是否正確,用Deploy驗證解法是否正確,最後沒問題後Merge到主要的Branch。 但這終究是輕量化的工作流,還是需要其他方法協助管理分支。  ### Git Flow Git Flow 設計用於頻繁更新版本的流程,在這個流程下會建立這些分支: * Master branch (Main) * Develop branch (Main) * Release branch * Feature branch * Hotfix branch #### Develop branch 平日開發新功能(修bug),當要開發新功能時,就從這個Branch新建一條開發的Branch出去,開發完工能就merge回來 > bug是下次Release在修就好,Hotfix則是嚴重問題要當下修復  #### Release branch 當計劃要釋出新版本時,就會開啟Release branch,將該版本功能合併到Release。 正式版本上線時,則合併至Master,建立版本Tag。並同合併時回Develop確保內容一致  #### Hotfix 當上線後發現重要issue,從Master branch開一條分支處理,Hotfix結束後合併回Dev與Master  #### 整體流程 所以整體來看會像這樣子,每一條Branch都有其意義,並在正確時間merge,避免錯誤覆蓋及混淆  ### Fork Workflow  Github中的Fork是複製一份Repo到自己帳戶下,主要目的在於複製Repo避免影響原始Repo。 事後再使用Pull Request將變更的內容提交至原Repo。 是很適合開源專案的一種方法。  ### Branch 的保護 Github上 Branch 主要會面對以下的威脅: 1. 植入惡意程式碼: 因為Github上很多是Public Repo,與公司、團隊等內部環境不同。有可能被提交植入惡意程式碼的code 3. 敏感資料 (密碼、個人資料、驗證資訊、Key...等): 切記不要植入敏感資料。可以透過Secret等方法處理敏感資料。在 Action 透過 GitHub Secret Scanning 也能找出敏感資訊。 4. 不符合分支策略或團隊規範的工作流程 可能由於操作錯誤導致誤刪,把重要的Branch刪掉。設定Branch Policy可以避免誤刪。  ## Pull requests  Pull request是[GitHub Workflow](#-Github-workflow-)中的一部分。主要就是將貢獻push回去。並且透過code review等驗證後讓持有者或驗證者檢查,確認merge的目的及內容,如果沒有問題後就進行Merge。 Pull Request 的定義為向開源專案提交貢獻的方法,比較簡易的行為描述為: 1. 宣告推送一個分支 1. 與 Owner 討論變更變更內容 1. Owner 檢視變更內容 1. 加入更多 commit 1. 最後合併或拒絕 ## Notifications ## Actions :::info Actions是我寫這篇的主要原因,希望可以了解自動CI/CD的過程。Actions是一個很重要的功能,可以設定各種自動化流程 ::: ==書籤,看到DAY11== ## Forks  ## Projects ## Security ## Discussions ## Github Wiki 一個快速建立wiki page的工具,可以和專案一起
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up