乐趣区

关于cicd:装在笔记本里的私有云环境持续集成上

本篇是系列中的第五篇内容,咱们持续聊聊如何把一个简化过的公有云环境部署在笔记本里,以满足低成本、低功耗、低延时的试验环境。如果你有闲置的轻量云服务器,也能够入手试试。

写在后面

作为“继续集成”章节的第一篇内容,咱们先来聊聊在单机服务器上的 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.comhttps://gitlab.lab.comhttps://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 程序会做两件事:

  1. 从 CI 软件中读取咱们事后配置好的 ssh_key 环境变量,而后将变量输入成程序能够间接应用的 rsa_key,并设置好权限,应用 ssh-agent 加载程序。
  2. 将仓库应用默认的 HTTP 协定替换为 Git 协定,以备程序应用。

当然,想要应用 SSH 形式下载代码,咱们须要在 Git 软件的账号或者仓库中配置 SSH Key

应用 SSH 形式操作服务启停

这个利用中,咱们在 docker-compose.yml 定义了容器的启动形式,所以服务的启动和敞开能够应用咱们相熟的命令 docker-compose up -ddocker-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 的形式,近程执行 scprsync 等命令同步数据,另外一种则是应用文件挂载的形式。因为咱们的部署在同一台机器上,所以文件挂载不失为一个高效的形式。

以 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…

退出移动版