發表文章

目前顯示的是 十二月, 2017的文章

如何自動化 GitHub Releases 流程

圖片
如何自動化 GitHub Releases 流程2017 年初的時候,曾經寫了《如何自動化 release 的流程?》這篇文章,介紹了如何利用 semantic-releaseTravisCI 自動化 GitHub Releases 和 NPM publish 這件事。這次要介紹的是如何直接透過 Probot 機器人做到 GitHub Releases。大綱什麼是 GitHub Releases?GitHub Releases 有什麼問題?什麼是 Conventional Commits?什麼是 Conventional Release Bot?為什麼要用 Conventional Release Bot?什麼是 GitHub Releases?GitHub Releases 是 GitHub 提供給每個專案在釋出(Release)新版軟體時,用來紀錄更新內容(Change Log)的頁面。GitHub Releases通過 GitHub Releases,你可以為每次的 release 加入說明,描述該 release 進行了哪些更改。GitHub Releases 的基礎是建立在 Git tags 之上。Tags 代表了你的專案在某個特定時間點下的里程碑,所以它會是一個很好的 release 表達方式。更多有關於 Git tags 的資訊可以參考 GitHub 的《Working With Tags》。GitHub Releases 有什麼問題?我們團隊在執行 release 的過程中碰到過不少問題,總結如下:無法回憶起曾經「新增了哪些功能」或「修復了哪些問題」,就像突然有人問「你記得上禮拜二中午吃什麼嗎?」的感覺,每次負責 release 的人都要口頭一個一個問其他工程師,最後崩潰躲在角落獨自一個人慢慢爬 commit log⋯⋯😢Push 或 merged master 的當下就應該馬上 release Git tag,但是常常會忘記做這件事,導致之後想起來還要回去找 commit SHA 才能補上 tag不是所有人都知道 SemVer 的版本號更新規則Git tag 下在錯誤的 branch:因為有些 repository 的 default branch 會設為 develop,但是常常忘記選擇 masterGit tag name 打錯字:不…

如何使用 RxJS 處理分頁 API

這篇文章會以 node-github 的 getCommits API 為例,介紹如何使用 RxJS 取得所有分頁的 commits 結果。前言以往在處理分頁的 API,通常都會使用遞回運算,這會讓程式碼的可讀性不佳。有鑒於最近 RxJS 正夯,想說來試著寫寫看,於是就有了這篇分享文章。需求首先,因為 node-github 的 getCommits API 回傳的是一個 Promise 物件,所以需要先使用 RxJS 的 fromPromise 將它轉成 Observable:Rx.Observable .fromPromise(getCommits(...)) 接下來,利用 node-github 提供的 hasNextPagegetNextPage,搭配 RxJS 的 expand 來處理分頁的遞回運算:Rx.Observable ... .expand( (response) => hasNextPage(response) ? Rx.Observable.fromPromise(getNextPage(response)) : Rx.Observable.empty() ); 上述邏輯大概是這樣:如果 getCommits 回傳的結果還有下一頁,就繼續 call getNextPage API如果已經沒有下一頁,則回傳 Observable.empty() 結束 expand 運算最後,透過 reduce 將所有分頁回傳的結果 concat 成一個 Array:Rx.Observable ... ... .reduce( (acc, curr) => acc.concat(curr.data) , []); 整體程式碼大致如下:Rx.Observable .fromPromise(getCommits(...)) .expand( (response) => hasNextPage(response) ? Rx.Observable.fromPromise(getNextPage(response)) : Rx…

這個網誌中的熱門文章

DevOps:持續整合&持續交付(Docker、CircleCI、AWS)

Factory pattern 工廠模式

如何自動化 GitHub Releases 流程