共计 4872 个字符,预计需要花费 13 分钟才能阅读完成。
本篇是系列中的第五篇内容,咱们持续聊聊如何把一个简化过的公有云环境部署在笔记本里,以满足低成本、低功耗、低延时的试验环境。如果你有闲置的轻量云服务器,也能够入手试试。
写在后面
作为“继续集成”章节的第一篇内容,咱们先来聊聊在单机服务器上的 CI 的应用。
对于根底的搭建,之前的文章中曾经屡次提到,所以我就不再赘述,本文将着重介绍过程中的一些细节,如果你对 Gitea 和 Drone 或者 GitLab 感兴趣,能够浏览之前的内容:
- 《容器形式下的轻量仓库与 CI 应用计划:Gitea + Drone 根底篇》
- 《应用容器形式编译无性能限度的 Drone CI》
- 《轻量平安的部署计划》
- 《应用 Docker 和 Traefik v2 搭建轻量代码仓库(Gitea)》
- 一些 GitLab 相干的内容
为了更低的保护老本,以及后续多机扩大应用,本文所有程序的应用均在容器环境下。
单机 CI 设计
在开展实际细节之前,咱们得先来聊聊“设计”。
架构设计
CI 过程中的参与者次要有上面这几类(本篇暂不聊软件仓库局部):用户、Git 服务、CI 服务、CI 执行器。
简略针对下面的参与者进行定义:“用户”能够是有血有肉的人,也能够是自动化的脚本或者 BOT,各种数据的创造者;“Git 服务”,用于存储代码数据,提供根底的权限性能和界面治理的程序;“CI 服务”,提供继续集成的工作的调度和治理的程序;“CI 执行器”,用于执行具体的 CI 工作的程序。
思考到单机服务器上除了 Git 服务和 CI 服务之外,还会运行咱们须要更新和部署的程序,为了让资源应用效率更好、保护老本更低、防止咱们为每一个 Web 程序配置 HTTPS 证书,咱们能够增加一个反对服务发现的利用网关。
即便是单机服务器,咱们仍旧须要留神 SSH 的应用平安,在多机环境下,咱们会应用跳板机和云服务器安全策略来进行集中的平安治理,在单机场景下,我应用 SSH 服务开关来实现简略的平安防护(不必的时候,间接敞开,也为互联网上的嗅探机器人省点电)。
如果将下面的“参与者”用图例来示意,一个最根底的单机 CI 应用模式会相似上面这样:
我将图中不同角色的数据交互进行的数字序号标注,简略解释一下这些序号代表的具体内容:
- “1”示意了用户应用具体的域名来拜访咱们的 Git 服务和 CI 服务,来进行仓库治理或者配置 CI 工作。这类交互应用的是 HTTP 的形式,比方在浏览器中拜访
https://gitea.lab.com
、https://gitlab.lab.com
、https://drone.lab.com
。 - “2”示意了用户或者客户端应用 SSH 的形式拜访 Git 仓库,须要搭配 RSA Key 应用。
- “3”和“4”示意了 Traefik 应用服务发现的形式,聚合 Git 服务和 CI 服务,为用户提供域名模式的拜访形式,这里应用的代理模式同样也是 HTTP。
- “5”示意了 SSH 开关和 Git SSH 服务之间的数据交互,交互模式为 TCP。
- “6”和“7”示意了 CI 服务 别离和 Git 服务、CI 执行器之间的数据交互,从 Git 获取仓库变动,而后创立 CI 工作,接着将 CI 工作执行状态一直推送至 Git 服务中,交互模式不限,能够应用 HTTP API,也能够应用各种基于 TCP 的 RPC 的形式。
- “8”则示意了 CI 执行器如何从 Git 服务器的代码仓库中获取代码,或者将一些数据更新回 Git 服务器中,个别状况下是应用 HTTP 的形式,我更举荐应用 Git Over SSH 进行交互。
部署模式
在单机全容器模式下,咱们个别会用两种形式能够实现部署。
一类是基于文件挂载的形式,比方在 CI 过程中将 CI JOB 容器中的文件系统和宿主机买通,而后将构建产物同步到宿主机中、相似的变体还有应用各种网络文件协定进行文件系统挂载;另外一类,则是应用 SSH 或者 SCP、Rsync 等形式,在容器中拜访宿主机实现数据交换或者服务初始化或启停操作。
除此之外,如果咱们借助软件仓库、容器仓库,还可能实现纯容器交付,让交互更纯正和“洁净”。这个话题,咱们会在后续文章中开展。
单机 CI 配置实际
接下来,咱们以上文中的“SSH 开关”这个利用,在 Gitea 和 Drone 环境中进行继续集成和部署实际为例,来聊聊如何在单机模式下应用 CI。
因为这个我的项目类型是一个不反对热加载的、须要继续运行的网络程序,程序的更新须要重启服务。所以咱们恰好能够应用“部署模式”中的挂载文件的形式更新文件,以及应用 SSH
的形式来进行服务的进行和重新启动。(如果是动态资源类的我的项目部署,则只须要实现资源替换更新即可)
定义 CI 配置文件
首先将须要集成 CI 的我的项目搁置上传到 Gitea 中的某个仓库中,这里以上文中提到的 Git SSH 开关为例。在我的项目中创立一个名为 .drone.yml
的 CI 配置文件。
一个绝对通用的 CI 配置能够用上面的模式来表白:
---
kind: pipeline
name: default
steps:
- name: clone
- name: stop-previous-services
depends_on: [clone]
- name: update-services
depends_on: [stop-previous-services]
- name: start-new-services
depends_on: [update-services]
下面的配置蕴含了:下载仓库代码、进行原先的服务、更新服务程序代码、重新启动服务四个过程。在理论生产中,依据业务类型,咱们的执行程序可能会有变动,甚至不再是下面的“串行”形式执行。
依照下面的配置将 CI 配置好之后,当咱们推送代码到代码仓库触发 CI 工作后。在图形界面中,咱们将看到相似上图的后果。
应用 SSH 协定下载代码
不论是应用哪一种 CI 工具,我都举荐你应用 Git Over SSH 的形式来获取代码,而非应用 Git Token 或者账号密码的形式来进行交互。这样能够让你的程序对于某一种 CI 或者 Git 仓库的依赖更低,更容易在适合的工夫点、以低成本切换到更适合的工具。
在 Drone CI 中,如果想应用 SSH 形式来下载代码,能够应用上面的配置:(在 GitLab Runner 中同理)
---
kind: pipeline
name: default
clone:
disable: true
steps:
- name: clone
image: alpine/git
pull: if-not-exists
environment:
KEY:
from_secret: ssh_key
commands:
- GIT_HOST=$(echo $DRONE_GIT_SSH_URL | sed 's/git@/\1/' | sed 's/:.*/\1/') && mkdir "$HOME/.ssh" && echo "$KEY" > "$HOME/.ssh/id_rsa" && chmod 600 $HOME/.ssh/id_rsa && eval `ssh-agent -s` && ssh-add $HOME/.ssh/id_rsa && ssh-keyscan $GIT_HOST > ~/.ssh/known_hosts && chmod 400 "$HOME/.ssh/known_hosts";
- git clone $DRONE_GIT_SSH_URL .
- git -c advice.detachedHead=false checkout $DRONE_COMMIT
下面的代码中,为了应用 SSH 形式下载程序代码,CI 程序会做两件事:
- 从 CI 软件中读取咱们事后配置好的
ssh_key
环境变量,而后将变量输入成程序能够间接应用的rsa_key
,并设置好权限,应用ssh-agent
加载程序。 - 将仓库应用默认的
HTTP
协定替换为Git
协定,以备程序应用。
当然,想要应用 SSH 形式下载代码,咱们须要在 Git 软件的账号或者仓库中配置 SSH Key
。
应用 SSH 形式操作服务启停
这个利用中,咱们在 docker-compose.yml
定义了容器的启动形式,所以服务的启动和敞开能够应用咱们相熟的命令 docker-compose up -d
和 docker-compose down
来实现。
因为 CI 在容器中执行,咱们不能间接操作宿主机,所以须要借助 SSH 或者 dind 模式的 docker.sock
来实现服务状态的扭转。
本文先聊聊如何应用 SSH 来解决根底的部署操作:
- name: stop-or-start-services
image: deploy-tool
depends_on: [clone]
pull: if-not-exists
environment:
KEY:
from_secret: ssh_key
# 环境变量,除了私密的定义在 CI 软件的环境变量中,也可显式申明在 CI 配置中
TARGET_HOST: user@host
TARGET_PORT: 22
commands:
- mkdir "$HOME/.ssh" && echo "$KEY" > "$HOME/.ssh/id_rsa" && chmod 600 $HOME/.ssh/id_rsa && eval `ssh-agent -s` && ssh-add $HOME/.ssh/id_rsa";
# 敞开服务
- ssh -i "$HOME/.ssh/id_rsa" -p $TARGET_PORT -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $TARGET_HOST "bash -c \"cd /app-path/ && docker-compose down\""
# 启动服务
- ssh -i "$HOME/.ssh/id_rsa" -p $TARGET_PORT -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $TARGET_HOST "bash -c \"cd /app-path/ && docker-compose up -d\""
和下载代码相似,咱们从环境变量中初始化 rsa key
,而后在 ssh-agent
中加载私钥。而后应用 ssh
客户端连贯宿主机,切换工作目录,执行命令操作服务的启动和敞开即可。
同样的,想要应用 SSH 操作服务器,咱们须要在服务器对应用户的 ~/.ssh/authorized_keys
中配置对应的公钥。
应用文件挂载的形式更新代码
更新代码有两种形式,一种是应用上文中提到的 SSH 的形式,近程执行 scp
、rsync
等命令同步数据,另外一种则是应用文件挂载的形式。因为咱们的部署在同一台机器上,所以文件挂载不失为一个高效的形式。
以 Drone CI 配置为例,演示如何挂载宿主机目录到容器内:
- name: update-services
image: deploy-tool
depends_on: [stop-previous-services]
pull: if-not-exists
commands:
- rm -rf /deploy/*
- cp -r /drone/src/* /deploy/
- cp -r /drone/src/.env /deploy/
volumes:
- name: host-dir
path: /deploy
volumes:
- name: host-dir
host:
path: /app-path
最初
在接下来的“继续集成”相干文章中,我将开展聊聊 CI 在多机和绝对简单场景下的应用,以及其余场景类型的部署实战细节。
–EOF
咱们有一个小小的折腾群,外面汇集了几百位喜爱折腾的小伙伴。
在不发广告的状况下,咱们在外面会一起聊聊软硬件、HomeLab、编程上的一些问题,也会在群里不定期的分享一些技术沙龙的材料。
喜爱折腾的小伙伴欢送扫码增加好友。(增加好友,请备注实名,注明起源和目标,否则不会通过审核)
对于折腾群入群的那些事
如果你感觉内容还算实用,欢送点赞分享给你的敌人,在此谢过。
本文应用「署名 4.0 国内 (CC BY 4.0)」许可协定,欢送转载、或从新批改应用,但须要注明起源。署名 4.0 国内 (CC BY 4.0)
本文作者: 苏洋
创立工夫: 2022 年 01 月 02 日
统计字数: 5438 字
浏览工夫: 11 分钟浏览
本文链接: https://soulteary.com/2022/01…