相信有那麼一天,我們將可以像畢凱艦長一樣用嘴巴叫所有主機做事!


Cheng Wei Chen



建立 PHPConf 2016 自動化與持續整合實作工作坊 的實作環境 (Azure)

這次受邀擔任 PHPConf 2016 的工作坊講師,負責一場「自動化與持續整合」的實作工作坊,除了有事先預備了 Local VM 提供參與者事先安裝設置之外,要特別感謝微軟贊助本工作坊,每位學員都會擁有一組 Azure Pass 一個月內有限額的 Azure 試用,讓學員可以直接在 Azure 上建立工作坊的實作環境。

此文即是紀錄在 Azure 上要如何建立實作環境。

環境描述

再重複一次我們會需要用到下面四種 Server:
  • CI Server:這次工作坊會以 GitLab 作為主要的 CI Server。
  • CI Worker:即是 GitLab Runner。
  • Web Server:標準的 Nginx + Php-fpm,而且要開放可以 SSH Login。
  • Selenium Server:測試案例中會用到 Selenium。
在 Azure 上,其實有各種方式可以組合出實作環境,但既然我們有 Azure 免費試用,當然可以選一種相對簡單,但又很奢侈的建置方式,即是「建立多台 VM 並安裝好 Docker,讓每台 VM 都只用 Docker 建立 1~2 種 Service。」

如此一來由多台 VM 各自負擔工作,不用擔心資源不足,也不用煩惱 IP 的問題。
所以讓我們再次感謝微軟的大力贊助!

不過我想 Azure 專家們應該會跳出來說,Azure 明明就有很多好作法,所以我只好維持一樣的回答,此文不是 Azure 教學文啊,只是想用最簡單的方式建構出本次工作坊的實作環境,就請專家們睜一隻眼閉一隻眼嘍。

當然,你也可以開一台超大超強的 VM,然後和上一篇文章的 Local VM 一樣,在一個 VM 內用 Container 提供多種服務的方式建置環境,做起來也不難,但這就留給有心人自己去嘗試了。

環境建置

登入 Azure Portal

首先請各位先利用分配給各位學員專屬的 Azure Account 登入 Azure Portal。
https://portal.azure.com/

登入之後,請先前往 Billing 中確認你擁有 Azure Pass 的 subscriptions。

若沒有,請嘗試重新登入,有時它會需要等待一下才會產生。

善用 Marketplace 節省時間

要在 Azure 上建立預先安裝好 Docker 的 VM,最簡單的方式之一就是透過 Marketplace。

請在左邊主選單中找到 More services,接著在新彈出的視窗中搜尋 Marketplace

找到 Marketplace 先不要急,可以先點擊右邊的「星號」,將它固定於主選單上,方便下次快速進入此功能。



接著請點擊 Marketplace

進入 Marketplace 之後,會分為左右兩個視窗,左邊預設會停在 Everything
我們直接在右邊視窗上方的「搜尋欄」中輸入 docker,接著就會幫我們找出 Marketplace 內與 docker 相關的結果。



而我們要選用的就是其中的 Docker on Ubuntu Server,請點擊它。

接著會繼續向右開啟新的視窗,會有一堆說明,就放心的點擊最下方的 Create



按下 Create 之後,就會進入更詳細的 VM 建置設定。

首先要填寫基本項目 Host NameUser nameAuthentication type
  • Host Name 就取名為 workshop-gitlab 吧!
  • User name 就取名為 php 吧!
  • Authentication type 我選用比較簡單(不安全)的 Password,密碼我當然不會告訴你!
以上三項請隨己意設定,但設定的內容自己要記好,特別是 User nameAuthentication type,因為後續我們可是要 SSH 登入它,再操作 Docker。



因為第一台 VM 要預備來建置 GitLab 因此需要給予較多的資源,在 Pricing Tier 至少請選擇規格較好的 A2 Standard,如果你選 A1,很抱歉可能常常會出現 This page isn’t working,因為 GitLab 可是很吃資源的。

點擊 Select 確定選擇 A2 Standard。

接著要設定 Optional Configuration 中的 Endpoints



VM 預設只會開通 22 port,我們要增加一項,讓它開通 80 port。

就如下圖,Name 可隨意填,我就填 httpPROTOCOLTCP,而 PRIVATE PORTPUBLIC PORT 請輸入 80。



再來要設定 Resource Group,如下圖,因為是首次使用,還沒有建立過任何 Resource Group,所以請選擇 Create a new resource group,接著在右邊的視窗的 Name 則隨你輸入,我這裡輸入的是 workshop

(不過我的圖片中,其實我已經建立過一個叫 phpconfResource Group。)



最後要設定的是 Location

如下圖,會有各地的機房可以選擇,當然我們要選離台灣比較近的,這裡有三個選項可以考慮,分別是
  • East Asia
  • Japan West
  • Japan East
這個就自己選吧!我是比較喜歡 Japan West 啦,East Asia 其實就是香港,但是香港機房最近好像出過幾次問題,讓人有點擔心。



以上都設定完畢後,還有一個可以勾選的項目是 Pin to dashboard,此項建議可以打勾,這樣等下可以直接在 Dashboard 找到這台 VM,在操作上比較方便。

請重複以上動作再兩遍

前面有說過我們需要多台 VM,我的計畫是總共建立三台 VM,因為我打算將 Selenium Server 與 GitLab Runner 共用一台 VM,所以我們要重複上面的動作再兩次。

那重複的動作中有哪些不同之處呢?分別是:
  • Host NameUser nameAuthentication type
  • Pricing Tier
  • Optional Configuration 中的 Endpoints

Host Name 建議取不同的名字,方便自己區別,所以我三台 VM 分別命名為:
  • workshop-gitlab
  • devserver
  • runner

User nameAuthentication type 就看你啦,我是偷懶都設相同,因為這些 VM 也只有用在工作坊而已,結束後我就會刪一刪了。

分別要設定的 Pricing Tier 則是:
  • workshop-gitlab = A2 Standard (或 A3 Standard)
  • devserver = A1 Standard (或 A2 Standard)
  • runner = A1 Standard (或 A2 Standard)

分別要設定的 Endpoints 則是:
  • workshop-gitlab = 要多開通 80 port
  • devserver = 要多開通 80、2222 port
  • runner = 要多開通 4444 port
另外補充一下 resource group 可以都選一樣的,不用每次的建新的。

查看 VM 的 IP

建立 VM 需要幾分鐘的時間,等待它們建立完畢之後,我們可以透過 Dashboard 一一查詢他們的 IP。

首先點擊左上角 Microsoft Azure 的 Icon 即可回到 Azure 的 Dashboard (儀表板)。

然後注意到 Dashboard 會多了好幾個方塊,這些就是我們前面建立的 VM。




(補充,如果找不到它們,也可在左側主選單,進入 All resources,這裡也能找到 VM。)

於是點擊其中一台,就會出現它的詳細內容,如下圖,我們即可在 Overview 中的 Essentials 查看 VM 的 Virtual IP address



請分別將三台 VM 的 IP 記錄下來,接著我們要準備 SSH 登入它們了。

SSH 登入建立 Container

查到 IP 之後就分別登入這三台 VM 吧。

以我的 VM 為例,指令會是
ssh php@138.91.26.13

然後就用自己設定的密碼登入。

登入之後三台 VM 分別要啟動不同的 Container,這些我分別都寫成 bash shell script,如下。

首先是 GitLab 這台 VM,要注意這一行 -e GITLAB_HOST=xxx.xxx.xxx.xxx \,請將 xxx.xxx.xxx.xxx 改成你的 GitLab VM IP。

#!/bin/bash

#2
docker run -i -d -v /home/workshop/gitlab/postgresql:/var/lib/postgresql -e DB_USER=gitlab -e DB_PASS=password -e DB_NAME=gitlabhq_production --env 'DB_EXTENSION=unaccent,pg_trgm' --name postgresql sameersbn/postgresql:9.5-1

#3
docker run -i -d -v /home/workshop/gitlab/redis:/var/lib/redis --name redis sameersbn/redis:latest

#4
docker run -i -d -v /home/workshop/gitlab/gitlab:/home/git/data --name gitlab --link redis:redis --link postgresql:postgresql \
-p 80:80 -p 10122:22 \
-e DEBUG=false \
-e DB_ADAPTER=postgresql \
-e DB_HOST=postgresql \
-e DB_PORT=5432 \
-e DB_USER=gitlab \
-e DB_PASS=password \
-e DB_NAME=gitlabhq_production \
-e REDIS_HOST=redis \
-e REDIS_PORT=6379 \
-e TZ=Asia/Taipei \
-e GITLAB_TIMEZONE=Taipei \
-e GITLAB_HTTPS=false \
-e SSL_SELF_SIGNED=false \
-e GITLAB_HOST=xxx.xxx.xxx.xxx \
-e GITLAB_PORT=80 \
-e GITLAB_SSH_PORT=22 \
-e GITLAB_RELATIVE_URL_ROOT= \
-e GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string \
-e GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string \
-e GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string \
-e GITLAB_ROOT_PASSWORD=phpconf2016 \
-e GITLAB_ROOT_EMAIL= \
-e GITLAB_NOTIFY_ON_BROKEN_BUILDS=false \
-e GITLAB_NOTIFY_PUSHER=false \
-e GITLAB_EMAIL=notifications@example.com \
-e GITLAB_EMAIL_REPLY_TO=noreply@example.com \
-e GITLAB_INCOMING_EMAIL_ADDRESS=reply@example.com \
-e GITLAB_BACKUP_SCHEDULE=disable \
-e SMTP_ENABLED=false \
-e IMAP_ENABLED=false \
-e OAUTH_ENABLED=false \
sameersbn/gitlab:8.12.4

再來是 devserver 這台 VM。
#!bin/bash

docker run -d -i --name dev_server -p 80:80 -p 2222:22 chengweisdocker/phpconf2016-devserver:16.04 bash

docker exec dev_server service ssh start
docker exec dev_server service php7.0-fpm start
docker exec dev_server service nginx start

最後是 runner 這台 VM。
#!/bin/bash
#6
docker run -d --name runner -v /run/docker.sock:/var/run/docker.sock -v /home/workshop/gitlab/runner-testing:/etc/gitlab-runner gitlab/gitlab-runner:latest

#8 selenium_server
docker run -d -i --name selenium_server -p 4444:4444 selenium/standalone-firefox:2.53.1

明眼人應該看得出來,其實就是 Local VM 的那些 Container 分別拆出來放在各台!

註冊 Runner

三個 bash shell script 都分別跑過之後,一樣我們還要來註冊 Runner。

這裡的動作就跟上一篇文 Local VM 建置一樣,我們要先登入 GitLab 查看 Token 接著註冊 Runner。

這裡就再重複寫一遍吧。

透過瀏覽器瀏覽你剛才建好的 GitLab 管理介面,帳號密碼分別是 rootphpconf2016
接著進入 Admin Area 中 Overview 的 Runners。來這裡的目的是為了查看 Runners 的 Registration token。



複製好 Token,再回到 runner 這台 VM 的 command line 中。

執行下面的指令,即可完成註冊 Runner。當然 Token 要改成你實際查到的 Token,還有 xxx.xxx.xxx.xxx 要改成你 GitLab VM 的 IP。

docker exec runner gitlab-ci-multi-runner register -n \
  --url http://xxx.xxx.xxx.xxx/ \
  --registration-token uUuusWxRKAQAokau1AxR \
  --executor docker \
  --description "My Docker Runner" \
  --docker-image "chengweisdocker/phpconf2016-ansible:dev" \
  --docker-volumes /var/run/docker.sock:/var/run/docker.sock

若註冊成功,應該在 GitLab 後台就會出現類似下圖的資訊,顯示你已經註冊了一個 shared Runner。










以上就是在 Azure 上建立實作環境的步驟,我自己估算了一下開三台 VM 大概一個晚上會燒掉你台幣 300 元以內吧,而 Azure Pass 提供的免費額度綽綽有餘夠我們開三台 VM 好幾天。

所以如果你在 PHPConf 2016 Workshop 當天沒有時間抽空建置 Azure 環境,那可以現在趕快建置。(謎之音,都幾點了才叫別人現在趕工?)

一樣有遇到問題,歡迎留言給我,或者去收信,我有邀請各位加入本次工作坊的 FB 秘密社團,也可以在社團上提問,我與助教們會協助回答。

沒有留言:

張貼留言

不歡迎留言打廣告,所以有進行留言管理,敬請見諒。