發表文章

目前顯示的是 12月, 2017的文章

如何自動化 GitHub Releases 流程

圖片
如何自動化 GitHub Releases 流程 2017 年初的時候,曾經寫了《 如何自動化 release 的流程? 》這篇文章,介紹了如何利用 semantic-release 和 TravisCI 自動化 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:因為有些 rep

如何使用 RxJS 處理分頁 API

這篇文章會以 node-github 的 getCommits API 為例,介紹如何使用 RxJS 取得所有分頁的 commits 結果。 前言 以往在處理分頁的 API,通常都會使用遞回運算,這會讓程式碼的可讀性不佳。有鑒於最近 RxJS 正夯,想說來試著寫寫看,於是就有了這篇分享文章。 需求 首先,因為 node-github 的 getCommits API 回傳的是一個 Promise 物件,所以需要先使用 RxJS 的 fromPromise 將它轉成 Observable: Rx.Observable .fromPromise(getCommits(...)) 接下來,利用 node-github 提供的 hasNextPage 和 getNextPage ,搭配 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.fromPromis