聚會時間公告: 因應COSCUP 2011, Kalug 8月份休會一次

七月 21, 2017

小惡魔AppleBOY
AppleBOY
is about »

tag cloud

» 台灣第一屆 Laravel 研討會

laravelconftw_o 這次很高興擔任第一屆 Laravel 台灣研討會講者,會議當天中午才到現場,我是兩點分享的議程,在整天聽下來及最後的案例討論,聽到最多的都是原本從 CodeIgniter 架構換到 Laravel 上面,身為 CodeIgniter 的維護人員的我,聽到是蠻開心的,在 Laravel 還沒出來前,大家都是選用這輕量級的 CodeIgniter。

簡報分享

在 Laravel 會議內,我是分享去年在公司內部使用 Laravel 來跟同事間團隊合作的經驗,題目是『運用 Docker 整合 Laravel 提升團隊開發效率』,大家可以參考當天的共筆紀錄,底下整理投影片大綱:
  1. 五大不用 Homestead 的理由
  2. 七大 Docker 必學指令
  3. Laradock 開源專案介紹
  4. 導入 Docker 後的優勢
  5. 用 Drone 整合測試及部署
底下是投影片,投影片內的範例可以參考

drone-laravel-example

運用 Docker 整合 Laravel 提升團隊開發效率 from Bo-Yi Wu
最後花了一些時間介紹 Drone 這套用 Go 語言撰寫的 CI/CD 工具,如果大家有興趣可以參加 7 月底的 iThome 課程『用一天打造團隊自動化測試及部署』。
  • 時間: 2017/07/29 09:30 ~ 17:30
  • 地點: CLBC 大安館 (台北市大安區區復興南路一段283號4樓)
  • 價格: 3990 元

心得

真心覺得這次 Laravel 台灣研討會辦得真是很棒,場地地點也離台北火車站不遠,讓我可以快速的從新竹過來。現場也體會到 LaravelConf 台灣團隊的用心,講師一上台,馬上就有一張照片出現在 Facebook 官網,並且分享共筆連結,讓現場或者是網路的朋友可以跟上進度,真的很棒,另外講師休息室的風景真是太美了。總之辦得真的很棒,感謝 Laravel 傳教士兼靈魂人物 Shengyou Fan 及團隊。 laravelconftw

» Drone 自動觸發 GitLab CI 或 Jenkins 任務

drone-logo_512 Drone 是一套由 Go 語言所開發的開源碼專案,讓開發者可以使用 Docker Container 快速設定自動化測試及部署,上篇有提到『Cronjob 搭配 Drone 服務』,讓 JenkinsGitLab CI 用戶可以轉換 Cron Job 任務到 Drone 上面。本篇則是會介紹如何透過 Drone 去觸發 Jenkins 或 GitLab CI 上的工作,當然這是過渡時期,希望大家最後能將工作完整移轉到 Drone 上面,不要再依靠 Jenkins 或 GitLab CI 了。本篇會教大家用三種方式來觸發 GitLab CI 或 Jenkins 任務。


  • 使用 Drone CI/CD
  • 使用 Docker 指令
  • 使用 Command Line (命令列)

觸發 GitLab CI

不管是 GitLab CI 或是 Jenkins 都可以透過該服務提供的 HTTP API 來遠端觸發,而我用 Go 語言將觸發這動作寫成 Drone Plugin,讓 Drone 用戶可以不用自己寫 curl 去觸發。

申請專案 Token

要透過 HTTP API 去觸發任務,首先就是要申請專案 Token,請大家參考 Triggering pipelines through the API 頁面。申請完成後,請把專案 ID 跟 Token 帶入底下使用。

使用 Drone 觸發

pipeline:
  gitlab:
    image: appleboy/drone-gitlab-ci
    host: https://gitlab.com
    token: xxxxxxxxxx
    ref: master
    id: gitlab-project-id
其中 host 請改成公司內部的 Git 伺服器網址,id 是專案獨立 ID,最後 Token 則是上面步驟所拿到的 Token。詳細設定可以參考 README,如果不是用 Drone 也沒關係,可以用 Docker 或透過 Go 語言可以包成各作業系統執行檔 (包含 Windows)

使用 Docker 觸發

請使用 appleboy/drone-gitlab-ci 映像檔,檔案大小為 2MB
docker run --rm \
  -e GITLAB_HOST=https://gitlab.com/
  -e GITLAB_TOKEN=xxxxx
  -e GITLAB_REF=master
  -e GITLAB_ID=gitlab-ci-project-id
  appleboy/drone-gitlab-ci

使用 CLI 觸發

請先從 Release 頁面下載相關執行檔,重點是你也可以在 Windows 做到此事情喔 (這就是 Go 語言跨平台的好處)。在命令列使用底下指令。
drone-gitlab-ci \
  --host https://gitlab.com/ \
  --token XXXXXXXX \
  --ref master \
  --id gitlab-ci-project-id

測試看看

這邊提供 GitLab 專案的資料給大家直接測試看看
drone-gitlab-ci \
  --host https://gitlab.com \
  --token 9184302d980918efad05bce8b97774 \
  --ref master \
  --id 3573921
上面指令沒意外的話,會看到底下結果:
2017/06/27 15:01:59 build id: 9360879
2017/06/27 15:01:59 build sha: 169e7c1d798c9593c06fbd9d474da9c07f699634
2017/06/27 15:01:59 build ref: master
2017/06/27 15:01:59 build status: pending
直接到 pipeline 頁面看結果 Screen Shot 2017-06-27 at 3.02.05 PM

歡迎大家關注此專案 drone-gitlab-ci

接著來講 Jenkins 部分,其實原理都跟 Gitlab CI 是一樣的。

觸發 Jenkins

這邊其實跟 GitLab CI 設定相同,只是參數不一樣而已,首先必須要去哪裡找個人 API Token,請到 Jenkins 個人頁面找到 API Token。 Screen Shot 2017-06-27 at 3.11.29 PM

使用 Drone 觸發

pipeline:
  jenkins:
    image: appleboy/drone-jenkins
    url: http://example.com
    user: appleboy
    token: xxxxxxxxxx
    job: drone-jenkins-plugin-job
其中 url 請改成公司內部的 Jenkins 伺服器網址,job 是 Jenkins 任務名稱,最後 Token 則是上面個人帳號所拿到的 Token。詳細設定可以參考 README,如果不是用 Drone 也沒關係,可以用 Docker 或透過 Go 語言可以包成各作業系統執行檔 (包含 Windows)

使用 Docker 觸發

請使用 appleboy/drone-jenkins 映像檔,檔案大小為 2MB
docker run --rm \
  -e JENKINS_BASE_URL=http://jenkins.example.com/
  -e JENKINS_USER=appleboy
  -e JENKINS_TOKEN=xxxxxxx
  -e JENKINS_JOB=drone-jenkins-plugin
  appleboy/drone-jenkins

使用 CLI 觸發

請先從 Release 頁面下載相關執行檔,重點是你也可以在 Windows 做到此事情喔 (這就是 Go 語言跨平台的好處)。在命令列使用底下指令。
drone-jenkins \
  --host http://jenkins.example.com/ \
  --user appleboy \
  --token XXXXXXXX \
  --job drone-jenkins-plugin

歡迎大家關注此專案 drone-jenkins

總結

寫這兩個 Plugin 的目的就是希望能有多點開發者從 Jenkins 或 GitLab CI 轉到 Drone,這是過渡時期,等熟悉了 Drone 的設定,你會發現 Drone 已經可以做到 Jenkins 或 GitLab CI 所有事情,甚至更強大。如果對 Drone 有興趣,可以來上七月底的『用一天打造團隊自動化測試及部署
  • 時間: 2017/07/29 09:30 ~ 17:30
  • 地點: CLBC 大安館 (台北市大安區區復興南路一段283號4樓)
  • 價格: 3990 元

報名連結

» Cronjob 搭配 Drone 服務

drone-logo_512 Drone 是一套基於 Docker Container 技術的 CI/CD 服務,它是用 Go 語言所開發,可以安裝在任何作業系統內,你可以把 Drone 當作是開源版的 Travis 服務。Drone 本身不支援排程任務,也就是說無法像 Jenkins CI 一樣可以設定每天幾點幾分執行單一 Job 任務。但是可以透過第三方工具像是 cron 來整合 Drone API 達成自動排程的效果,底下來看看該如何實作。

安裝 Drone CLI

Drone 提供 CLI 工具,讓開發者可以快速跟 Drone 服務溝通,底下兩種方式來安裝 Drone CLI。從官網找相對應作業系統的執行檔
  • Linux x64
  • Windows x64
  • Darwin x64
另外一種方式則是透過 go get 方式來安裝,前提是您必須要安裝 Go 語言環境
$ go get github.com/drone/drone-cli/drone

Drone CLI 教學

下面指令是透過 CLI 呼叫 Drone 執行指定的專案 Job Number。如果沒有提供 Number 編號,則是執行該專案最後一個 Build Number。
$ drone build start --fork <repository> <build>
--fork 代表啟動新的任務,並非是重新啟動該編號任務。下面指令則是根據專案 Branch 名稱得到最後 Build Number。
$ drone build last --format="{{ .Number }}" \
  --branch=<branch> <repository>
拿到最後一個 Number 後,就可以開始寫 Cron job 任務

整合 cron job

從上面教學可以知道如何透過 Drone CLI 拿到專案最後執行的 Job 任務編號,以及如何重新執行專案任務,這時我們可以將指令合併成一行,變且寫進 crontab -e 檔案內
* 22 * * * drone build start --fork octocat/hello-world \
  $(drone build last --format="{{ .Number }}" \
  --branch=master octocat/hello-world)
branchoctocat/hello-world 換成您的專案名稱即可。

結論

用 crontab + drone cli 就可以完成 Jenkins 可以做到的事情。這樣真的可以完全捨棄 Jenkins 了。如果大家對 Drone 有興趣,想更深入了解,可以來報名『用一天打造團隊自動化測試及部署』,此課程會在一天內帶您進入自動化測試及部署,想從 Jenkins 或 GitLab CI 轉換到 Drone 的,歡迎報名參加。
  • 時間: 2017/07/29 09:30 ~ 17:30
  • 地點: CLBC 大安館 (台北市大安區區復興南路一段283號4樓)
  • 價格: 3990 元

報名連結

» Drone 發佈 0.8.0-rc.1 版本

drone-logo_512 Drone 作者在昨天晚上發佈了 0.8.0-rc.1,此版本有兩個重大變更,第一是 Server 跟 Angent 之間溝通方式轉成 GRPC,另一個變更則是將原本單一執行擋 drone 拆成兩個,也就是之後會變成 drone-serverdrone-agent,拆成兩個好處是,通常 Server 端只會有一台,但是隨著專案越來越多,團隊越來越龐大,Agent 肯定不只有一台機器,所以把 Agent 拆出來可以讓維運人員架設新機器時更方便。

執行畫面

此版本的 UI 也有不同的改變,但是還是以簡單為主,也支援手機端瀏覽,首先看到在單一 Build 的狀態,現在可以顯示每一個步驟的執行時間 Screen Shot 2017-07-21 at 2.16.30 PM 點選任意一個步驟後,可以看到該步驟詳細紀錄,右邊則會顯示步驟列表 Screen Shot 2017-07-21 at 2.18.15 PM

Secret 設定頁面

不需要透過 Command Line 也可以將 Secret (像是 Docker 帳號密碼等) 透過此頁面設定,不過這邊有個缺陷,不能指定 Image,在 Command line 可以設定 Secret 綁定在特定 Docker image 身上。 Screen Shot 2017-07-21 at 2.17.20 PM

Registry 設定頁面

如果在公司內部有架設 Docker Registry 的話,可以透過此頁面將帳號密碼設定 Screen Shot 2017-07-21 at 2.17.30 PM

Project 設定頁面

此頁面可以設定專案狀態,包含執行幾分鐘後就直接停止等。 Screen Shot 2017-07-21 at 2.17.37 PM

結論

此版的 UI 畫面實在是太讚了,尤其是執行步驟畫面,可以看到每個步驟執行時間,早上跟作者聊一下,說下週六我要拿 Drone 現在最新版來教大家,他回說那他會保證這週到下週的修改不會影響到我上課。底下是上課時間跟內容,歡迎大家報名參加『用一天打造團隊自動化測試及部署』。
  • 時間: 2017/07/29 09:30 ~ 17:30
  • 地點: CLBC 大安館 (台北市大安區區復興南路一段283號4樓)
  • 價格: 3990 元

» 台灣第一屆 GoPher 大會

Screen Shot 2017-06-30 at 10.47.50 AM 很高興可以擔任第一屆 GoPher Day 大會講者,每次參加聚會都是跟一堆網友見面,人在新竹很難得大家見到面。很感謝 iThome 大力幫忙舉辦,才可以讓整天議程順利完成。底下分享『用 Go 語言實戰 Push Notification 服務』投影片。

投影片重點大綱

  • Gorush 介紹
  • Gorush 內部 Goroutine 實作
  • Gorush API 實作
  • 用 Drone 打造 Go 語言部署及測試流程
最後花了一些時間介紹 Drone 這套用 Go 語言撰寫的 CI/CD 工具,如果大家有興趣可以參加 7 月底的 iThome 課程『用一天打造團隊自動化測試及部署
  • 時間: 2017/07/29 09:30 ~ 17:30
  • 地點: CLBC 大安館 (台北市大安區區復興南路一段283號4樓)
  • 價格: 3990 元
用 Go 語言實戰 Push Notification 服務 from Bo-Yi Wu

十一月 15, 2016

小惡魔AppleBOY
AppleBOY
is about »

tag cloud

» 用 Docker 發送 Line 訊息

docker 今年各家網路公司 (Facebook, LineTelegram…) 分別推出 Bot 服務,看起來 Bot 會是未來趨勢,對 Bot 不是很了解的話,可以參考 Eric ShangKuan 寫了一篇: 關於寫對談機器人 (bot) 的兩三事。本篇會介紹如何透過 Docker 整合 Line Message API,下面所有指令都會跟 Docker 有關,但是程式碼都是用 Golang 撰寫,想說順便在台灣推廣 ^__^。就在今年四月 Line 推出第一版 SDK,但是到了九月,突然收到 Line 的通知,說舊版的不支援了,請大家換到新板 API,最近更動到新版本時,踩到官網 UI 的雷就是原來 Line 有分 Developer 跟一般帳號,這兩種差別就是在於有無主動 Push Message 功能,後來在 Line-Go-SDK 發問才找到解答。底下會一步一步教大家如何透過 Docker 發送 Line 訊息。

步驟一: 申請 Line Developer 帳號

如果已經有帳戶請略過此步驟。請先到 LINE Business Center,點選 Developer Trial,建立組織及建立帳號,如下圖 Screen Shot 2016-11-15 at 1.45.18 PM 完成後,點選 Line Manager,啟動 API Screen Shot 2016-11-15 at 1.50.52 PM 請務必啟動底下設定
  • Use webhooks
  • Allow Bot to join group chats
如果有看到 Usable APIs 包含底下:
  • REPLY_MESSAGE
  • PUSH_MESSAGE
PUSH_MESSAGE 權限,Bot 才可以主動發訊息給使用者

步驟二: 取 Line Token 和 Secret

回到 LINE Business Center 頁面,Tools 底下選 Line Developers,就可以看到 Channel SecretChannel Access Token,要取 Token 請點選右邊的 Issue 按鈕就可以顯示了 Screen Shot 2016-11-15 at 1.59.12 PM 表單內的 Webhooks URL 是要填寫 https 開頭的 URL,下個步驟會教大家如何透過 Docker 架設 Line Webhook 服務。

步驟三: 用 Docker 啟動 Line Webhook 服務

此步驟是教大家如何取得使用者 ID,前提是使用者必須加 Bot 為好友。要啟動 webhook 服務有兩種方式,一種是透過 docker,另一種則是透過 Golang 方式,我們先來試試看 Docker 方式。

下載程式碼

$ git clone https://github.com/appleboy/drone-line.git
$ cd drone-line

編譯 Docker Image

進入 example 目錄後,會發現有 server.go 跟 Dockerfile 兩檔案
$ docker build -t line example
上面的 line 可以自行換掉,換成自己想要的名字,接著啟動編譯好的 Image。

啟動 Webhook 服務

$ docker run --rm \
  -e CHANNEL_SECRET=xxxx \
  -e CHANNEL_TOKEN=xxxx \
  -p 8089:8089 \
  line
如果不是透過 Docker,請直接執行 Go 指令即可
$ go run server.go

用 ngrok 穿牆

這時候會發現系統聽 8089 port,接著透過 ngrok 來做穿牆,並且提供 https 服務
$ ngrok http 8089
Screen Shot 2016-11-15 at 4.08.47 PM 拿到 https://xxxx.ngrok.io 後,請到 Line Develop Console 填到 Webhook URL 欄位 (請填入: https://xxxx.ngrok.io/callback ),最後透過 QRCODE 加 Bot 為好友,並且發送訊息測試,可以發現在 Console 端會顯示:
2016/11/15 08:04:22 User ID is U77234666b0313021f873b85xxxxxxx
這就是您專屬的 User ID,請記錄下來。

步驟四: 用 Docker 主動發送 Line 訊息

透過 drone-line 包好的 Docker Image (appleboy/drone-line)來主動發送訊息,來到這邊,就是假設你已經取得 Line Secret, Token 及使用者 ID,透過下面 Docker 指令
docker run --rm \
  -e LINE_CHANNEL_SECRET=xxxxxxx \
  -e LINE_CHANNEL_TOKEN=xxxxxxx \
  -e PLUGIN_TO=xxxxxxx \
  -e PLUGIN_MESSAGE=test \
  appleboy/drone-line
其中 LINE_CHANNEL_SECRET, LINE_CHANNEL_TOKENPLUGIN_TO 請填入相對應設定。如果覺得指令太長,也可以把設定包在 .env 檔案內
LINE_CHANNEL_SECRET=xxxxxxx
LINE_CHANNEL_TOKEN=xxxxxxx
PLUGIN_TO=xxxxxxx
PLUGIN_MESSAGE=test
請務必將檔案放在執行指令的目錄底下,接著透過底下指令發送訊息
docker run --rm \
  -e ENV_FILE=your_env_file_path \
  -v $(pwd):$(pwd) \
  -w $(pwd) \
  appleboy/drone-line

總結

本來 drone-linedrone ci server 的 plugin,用來完成測試後,通知相關開發者,當然要整合其他 CI 像是 Jenkins 也是可以的,基本上都包成指令了,只要有 Bash 環境都可以運作。老實說 Line 的開發網站,介面不是很人性化,很多功能都不知道在哪邊,也蠻亂的,另外 Line Developer 也有提供綁定 Server IP 才可以發送訊息,這功能不是很即時性,所以大家盡量不要去用。目前也只有 Line 有提供這功能,應該是要避免 Token 跟 Secret 被偷走。最後要注意的是免費的 Developer 帳號一次只能發五則訊息。超過五則訊息,則會吐出底下錯誤:
[messages] Size must be between 1 and 5
怎麼發送多個訊息呢?請用 , 來分隔 (不要超過 5 個喔)
docker run --rm \
  -e LINE_CHANNEL_SECRET=xxxxxxx \
  -e LINE_CHANNEL_TOKEN=xxxxxxx \
  -e PLUGIN_TO=xxxxxxx \
  -e PLUGIN_MESSAGE=我,愛,你\
  appleboy/drone-line

九月 13, 2016

小惡魔AppleBOY
AppleBOY
is about »

tag cloud

» Drone CI Server 搭配 Atlassian Bitbucket Server (前身 Stash)

Screen Shot 2016-09-13 at 10.36.58 AM 目前團隊是使用 Atlassian Bitbucket 搭配 Bamboo,雖然 Bamboo 搭配自家的 Bitbucket (前身是 Stash Server) 整合得相當不錯,但是個人覺得設定上蠻複雜的,所以才想測試看看其他家 CI Service 對團隊學習及設定上更容易。最近找到一套用 Golang 寫的 CI Server 就是 Drone,Drone 線上文件提供了 Github, Gitlab, Gogs, Bitbucket (Stash) 等整合。在整合 Drone 搭配 Bitbucket 時,文件寫得不是很清楚,尤其是在 Bitbucket 建立 Application Link 遇到許多問題,官方文件也沒寫得很清楚,故寫此篇記錄如何將 Drone 服務整合 Bitbucket 伺服器。

建立 Application Link

Screen Shot 2016-09-13 at 10.59.51 AM 表單需要注意的地方是 Customer KeyShared Secret 這兩欄位請直接到 Drone 設定檔內找到
DRONE_SECRET: "replace-this-with-your-own-random-secret"
DRONE_STASH_CONSUMER_KEY: "AppleBoy46"
最下面的 Create Incoming Link 要勾選,完成後按下一步會出現底下畫面 Screen Shot 2016-09-13 at 11.07.59 AM 這邊要注意的是我們尚未建立 Public Key,所以請繼續看底下如何建立。

建立 Private Key File

要跟 Bitbucket 的 OAuth 建立連線,則需要 private 跟 public RSA certificate,底下是建立 private certificate
$ openssl genrsa -out /etc/bitbucket/key.pem 1024
上面會建立一把 private key 存放到 mykey.pem,下一個指令則是產生 public certificate
$ openssl rsa -in /etc/bitbucket/key.pem -pubout >> /etc/bitbucket/key.pub
完成後,請打開 /etc/bitbucket/key.pub,將內容複製到上述表單內 public key 欄位。另外要將 /etc/bitbucket/key.pem 位置設定在 Drone config 內。
DRONE_STASH_CONSUMER_RSA: "/etc/bitbucket/key.pem"
完成後就可以看到底下畫面 Screen Shot 2016-09-13 at 11.21.24 AM 看到這畫面算是大功告成了。送了新 PRDrone 官方團隊,今天寫文件才知道之前送的 PR 有錯誤。

參考

support:

biggo.com.tw

biggo.sg

A Django site.