【珍爱生命,远离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%自动化才爽,我是一点也不想干预其中的任何事。
毕竟程序员最重要的两件事:
- 多写代码
- 少写代码
