【珍愛生命,遠離UI】CI/CD對接阿里雲
- 2019 年 10 月 7 日
- 筆記
| 前言
GUI是自動化路上的絆腳石,身為偉大的程式設計師,干任何事情首先要想的是能不能讓程式幫你干,而不是把生命浪費在介面上點點點和填表單上。
所以你在做東西時也會考慮使用你東西的可能不是人而是另一個程式,所以 API>CLI>GUI成為鐵的定律。
公有雲誕生之日起,很多人都覺得介面上點點虛擬機就來了,真是太方便了,而高端玩家已經意識到其真正價值在於雲的「可編程性」。
我同樣也是深受介面之苦,每次都圖短暫的方便而長期的噁心自己。當一切都走了命令行之後,整個世界都輕鬆了。。。
| 命令行創建虛擬機效率對比

拋去登錄和找到虛擬機創建頁面不算,創建一台虛擬機需要經過五個步驟,每個步驟需要操作一堆表單。大概需要消耗2min左右。
但是如果通過命令行的話,僅需1s

有人反駁,寫創建命令不需要時間嘛?確實需要,而且研究那些參數含義可能需要個一天半天,但是一旦寫完,就可復用,所以如果你是八百年才創建一次虛擬機確實不太需要走命令行。但是如果你是頻繁創建那命令行絕對就是必備良藥。
| 場景介紹
這要從sealos的自動化測試說起,為什麼每次離線包我們都能那麼快的發布出來,這就離不開高度的自動化,應該是100%的自動化(不是99%)
我們是需要對安裝k8s進行測試,那與普通的測試就不太一樣,主要是需要虛擬機,測試完成後進行自動釋放。
| 命令行管理虛擬機
高端玩家可以使用編排工具terraform,命令行基本能滿足我的需求。

鏡像ID怎麼查:
aliyun ecs DescribeImages --Architecture x86_64 --OSType linux --PageNumber 1 --PageSize 2
獲取實例類型列表:
aliyun ecs DescribeZones --RegionId cn-hongkong
設置密鑰:
--KeyPairName release # release密鑰對先創建好
安全組ID與vswitchID:
安全組ID比較簡單,vswitchID可以在專有網路VPC中找到

| 獲取實例資訊
我們需要FIP IP等資訊
# 創建命令太長我省略了 aliyun ecs RunInstances ... > InstanceId.json ID=$(jq -r ".InstanceIdSets.InstanceIdSet[0]" < InstanceId.json) # 這裡睡一個等FIP IP分配好 sleep 40 # 把實例資訊寫到json文件中 aliyun ecs DescribeInstanceAttribute --InstanceId $ID > info.json # 從json文件中獲取FIP和IP FIP=$(jq -r ".PublicIpAddress.IpAddress[0]" < info.json) IP=$(jq -r ".VpcAttributes.PrivateIpAddress.IpAddress[0]" < info.json)
| 釋放虛機
# $ID也是上一步獲取到的 aliyun ecs DeleteInstances --InstanceId.1 $ID --RegionId cn-hongkong --Force true # 強制刪除,否則需要先停虛擬機
| 虛擬機遠程執行命令
drone有個插件可以遠程執行ssh命令,用起來非常簡單:

也支援密鑰,但是非常抱歉用不了!詳細原因
因為CI/CD時我們先通過aliyun-cli這個插件申請的虛擬機,然後調用ssh插件:
step1: 插件:阿里雲命令行 step2: 插件:ssh 我需要FIP配置在yaml上
可以看到第二步需要第一步的FIP,但是兩個步驟之前數據傳遞只能通過共享文件,所以沒有辦法能把第一步產生的FIP傳遞給第二步,除非你修改ssh插件讓其支援從文件讀取配置,我們太懶,不想改,那麼就自己寫一個吧:
於是小夥伴花了十分鐘寫了個遠程執行的工具使用非常簡單:
sshcmd --passwd Fanux#123 --host $FIP --cmd "yum install -y docker"
當然如果你通過密鑰,那直接ssh就行。我們把這個一起打到我們的鏡像中作為drone插件即可。
FROM golang:1.11.3 COPY config.sh . RUN wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 && mv jq-linux64 jq && chmod +x jq && mv jq /usr/bin && wget https://github.com/aliyun/aliyun-cli/releases/download/v3.0.26/aliyun-cli-linux-3.0.26-amd64.tgz && tar zxvf aliyun-cli-linux-3.0.26-amd64.tgz && cp aliyun /usr/bin && rm aliyun-cli-linux-3.0.26-amd64.tgz && wget https://github.com/cuisongliu/shell/releases/download/v1.0/shell && chmod +x shell && mv shell /usr/bin/sshcmd
順便提一句sshpass這個很火的工具,簡直難用到令人髮指,還沒有任何執行結果的返回,我們寫的好用一萬倍。。。
| 對接CI/CD系統
首先操作虛擬機是通過aliyun這個二進位文件進行操作的,安裝直接下載二進位即可,配置時要注意:
aliyun configure Configuring profile 'default' ... Aliyun Access Key ID [None]: <Your AccessKey ID> Aliyun Access Key Secret [None]: <Your AccessKey Secret> Default Region Id [None]: cn-hangzhou Default output format [json]: json Default Languate [zh]: zh
先在容器里互動式的配置好,最後它會寫入~/.aliyun/config.json里,我們需要的就是這個config.json,這東西千萬別放鏡像里,別人拿到就能操作你虛擬

base64一下,設置成drone的secret:


讀取這個secret並保存到文件中,這樣執行流程時陪著文件就來了
steps: - name: createVM image: fanux/aliyun-cli environment: CONFIG: from_secret: aliyun-cli commands: - mkdir ~/.aliyun - echo $CONFIG | base64 --decode >> ~/.aliyun/config.json - aliyun ecs RunInstances ... # 獲取FIP FIP ID - sshcmd --passwd xxx --host $FIP --cmd "yum install docker" # 其它操作
| 吐血推薦

aliyun的cloudshell里能直接使用命令行,不需要你自己再裝了,非常好用,而且可以綁定一個NAS,這樣寫的腳本也不會丟
| 總結
有些非常底層的一些軟體測試往往需要用到虛擬機甚至物理機,那麼這塊的自動化就變得非常有必要了。學習了本文之後把你雲上的操作變成命令行變成腳本接入到其它系統中,一定會解放雙手,奔向自由~
還有很多與我們自身業務強相關的邏輯就不需要在本文中進行展示了,以前我覺得要實現系統90%以上的自動化,我錯了,這塊需要實現100%自動化才爽,我是一點也不想干預其中的任何事。
畢竟程式設計師最重要的兩件事:
- 多寫程式碼
- 少寫程式碼
