第二十七天:用 TeamCity 部署 API 文件

在昨天的练习里,我们使用 TeamCity 在建置流程的最後一步产生 API 文件,并让文件可以直接显示在该 Build 的页签里,方便我们直接浏览。不过显示在 Build 页签里只是方便我们可以检查和除错,实际上这个 API 文件应该要部署到网路主机让使用者可以浏览才对。因此,今天我们就来挑战使用 TeamCity 部署 API 文件到网路主机,真正从 CI 一路做到 CD 的完整流程。

主机前置作业

今天的练习会把昨天产生出来的 docs.zip 以 SSH 的方式上传到目标主机上,为了让这个流程可以自动化,我们需要先做 2 个前置作业。

设定 SSH 登入用的 Key

为了让 TeamCity 能够登入目标主机,我们要先产生出一组 TeamCity 专用的 SSH Key,并把 Private Key 放到 TeamCity 上,把 Public Key 放到目标主机上。

首先在本机端先用 ssh-keygen 指令产生一组 Key:

$ ssh-keygen -m PEM -t rsa -b 4096

把产生出来的 id_rsa.pub 的内容,写入到目标主机的 ~/.ssh/authorized_keys 里,并测试一下是不是能用这组 Key 登入:

$ ssh -i id_rsa <username>@<ip> -p <port>

接着进入 TeamCity 的 Web UI,进到 ShoppingCart 专案设定,选择左边侧边栏的 SSH Keys 选项。

点选画面上方的 Upload SSH Key 按钮,设定 Key 的名称,并选择刚刚产生出来的 id_rsa Private Key,按下 Save 上传。

设定目标主机的 Site

接着我们要在目标主机上开两个资料夹,一个拿来放从 TeamCity 上传上来的档案,我们就取名叫 upload、一个则是对外的网站根目录,我们就取名叫 docs。先用指令把这两个资料夹建立起来:

$ mkdir upload
$ mkdir docs

接着我们要设定网页服务器,让它可以把 docs 资料夹当网站根目录对外服务。在这边笔者以 Nginx 为例,先在 /etc/nginx/sites-available 建立一个 Site Config。

$ sudo vim /etc/nginx/sites-available/<网站网址>

指令中的 <网站网址> 请更换成您自己的 Domain,Site Config 的内容如下:

server {
    server_name www.shengyoufan.com;
    
    listen 80;
    listen [::]:80;
    
    root <资料夹路径>;
    index index.html;

    location / {
        try_files $uri $uri/ /error.html;
    }
}

完成後把这个网站挂载到 Nginx 底下:

$ sudo ln -s /etc/nginx/sites-available/<网站网址> /etc/nginx/sites-enabled/

设定完成後,重新载入 Nginx 设定档来套用这些变更:

sudo systemctl reload nginx

新增 Build Configuration

这次我们要在 TeamCity 的动作跟以往有些不同,我不需要跟建置任务绑在一起、我也只需要在我想部署文件的时候「手动部署」,所以这次我想要建立一个全新的 Build Configuration。首先进到 ShoppingCart 专案设定的 General Settings,并点选画面中间的 Create build configuration 按钮:

因为这次部署的来源不再是原本的 VCS,所以这次我选择 Manually 设定方式,并把这个 Build Configuration 取名为 Deploy document:

设定来源相依

下一步会被带到 Deploy document 的设定页,我们想要把之前 Build Configuration 产生出的 Artifact 当成这系列动作的来源,所以我们要把上一个 Build Configuration 当成我们的相依(Dependencies)。点选左边侧边栏的 Dependencies,选择画面上的 Add new artifact dependency:

在弹出式视窗里,设定 Depend on 为 Shopping Cart / Build,Get artifacts from 为 Latest successful build(上一次成功的建置),Artifacts rules 要包含我们想要从 Artifact 拿出来的档案路径 +:docs.zip,完成後按 Save 储存。

设定 Build Step

接下来就要设定我们的部署动作,从左边侧边栏切换到 Build Steps,并点击 Add build step。第一步我们要先把 docs.zip 上传到目标主机上,Runner type 选 SSH Upload、Step name 取名为 Upload,Target、Port、Username 请依照您的目标主机来设定,Paths to sources 则是设定我们要上传上去的档案,完成後按 Save 储存。

上一步我们只是把 API 文件的压缩档上传上去,还没办法让使用者浏览。所以我们要搭配第二步动作,直接 SSH 进我们的主机,把压缩档解开放到 Nginx Site 底下。回到 Build Steps 设定再新增第二个 Build Step。这次 Runner type 选 SSH Exec,Step name 取名为 Publish,Target、Port、Username 请依照您的目标主机来设定,Commands 就直接把我们会在主机上执行的 Shell Script 直接贴上去:

mv upload/docs.zip upload/docs-%build.number%.zip
unzip upload/docs-%build.number%.zip -d upload/docs-%build.number%
mv upload/docs-%build.number% docs/

上面的 Script 仅供参考,实际动作可以依照每台主机的不同做调整,大至上的流程就是把压缩档重新命名、解压缩、把资料夹搬到 Nginx Site 底下,设定好後按 Save 储存。

完成後回到首页,每次我们在 Build 那步的 API Docs 页签确认没问题,想要部署 API 文件到主机上时,就可以点选 Deploy document 旁的 Run,这样 TeamCity 就会把文件部署到主机上了,是不是很方便呢?

小结

今天我们练习了如何用 TeamCity 做 API 文件的部署,主要以两个 SSH 的 Runner 为主。当然,依据每个团队惯例、专案需求的不同,可能在设定、上传路径和 Shell Script 的动作都会有些不同,大家在练习时候务必要依据自己的情境来做调整喔!

另外,部署也不是只有 SSH 一种方法,TeamCity 也支援很多不同开发生态系的部署工具,目前很受欢迎的 Docker 及 Docker Compose 也有对应的 Runner 可以使用。有兴趣的读者也可以试试看喔!

参考资料


<<:  JavaScript入门 Day27_while回圈

>>:  D24 - Transaction

33岁转职者的前端笔记-DAY 7 常见的卷轴 scollbar 做法

第七篇一样来写写公司专案用到的排版技能 在注册页面还没填资料时很多网站都会先跳出「个人资料使用声明同...

Day16 资料库-model的创建(2)

我们昨天教了最基本的model建立了,相信大家应该大致都懂那些流程了吧!(应该都懂吧...) 大家一...

[Day 18] 今晚我想来点tinyML加Arm不加香菜

今天(2021/10/3)是星期日,本来想接着写Edge Impulse云端一站式tinyML开发平...

鬼故事 - 不是,你偷这些干嘛

鬼故事 - 不是,你偷这些干嘛 Credit: System32Comics 灵感来源:UCCU H...

[day-18] 认识Python的资料结构!(Part .5)

认识dict(字典)   dict(字典)跟set(集合)很像,不过dict(字典)采用的元素储存方...