用 DevStream 搭建 Gitlab CI + Argo CD 工具链,管理 Python Flask 项目

0 目标

在本教程中,我们将尝试通过 DevStream 来实现以下目标:

  1. 使用 Docker 安装 GitLab,作为代码仓库(如果你的服务器上已经安装了 GitLab,可以跳过这一步);
  2. 在 GitLab 上创建一个 Python Web 应用程序仓库,基于 Flask 框架;
  3. 使用 GitHub CI 为我们创建的仓库设置基本的 CI 流水线;
  4. 一个已有的 Kubernetes 集群 中安装 Argo CD 以实现 GitOps;
  5. 创建一个 Argo CD 应用程序,用于部署第 1 步中生成的 Web 应用程序。

先决条件:

  • Docker (GitLab 使用 Docker 来安装)
  • Kubernetes 集群(Argo CD 安装在 Kubernetes 集群中)

如果你想跟着本教程自己尝试一下,但不知道如何在本地启动和运行 Kubernetes 集群,下面的博客(也来自 DevStream)可能会有所帮助:


1 概览

DevStream 将使用下面的插件来实现第 0 节中描述的目标:

  1. gitlab-ce-docker:用于在 Docker 中安装 GitLab;
  2. repo-scaffolding: 用于在 GitLab 上创建一个 Python Web 应用程序仓库;
  3. gitlab-ci:用于为我们创建的仓库设置基本的 CI 流水线;
  4. helm-installer: 用于在 Kubernetes 集群中安装 Argo CD;
  5. argocdapp: 用于创建一个 Argo CD 应用程序,来部署第 1 步中生成的 Web 应用程序。

我们将分成两个步骤来完成这些目标:

  1. 编写一个配置文件,完成工具的安装,GitLab 和 Argo CD;
  2. 编写一个配置文件,完成后续流水线的创建、代码仓库的创建,并将其部署到 Argo CD 中。

说明:实际上,DevOps 工具的安装和配置可以在同一个配置文件中完成,但 GitLab 较为特殊,需要在安装完成之后由用户手动创建 token,因此我们将工具的安装单独拆分出来了。

2 启程:下载 DevStream (dtm)

为本教程创建一个临时工作目录:

Bash

  1. mkdir test
  2. cd test/

接着,在新创建的目录下,运行下面的命令:

Bash

  1. sh -c "$(curl -fsSL https://download.devstream.io/download.sh)"

这个脚本会根据你的操作系统来下载对应的 dtm 二进制文件,保存到当前目录。然后,赋予其可执行权限。

可选:你可以把 dtm 移动到 $PATH 环境变量中的某个目录下。例如:mv dtm /usr/local/bin/。这样,你就可以直接运行 dtm 而不需要再加上 ./ 前缀了。

更多安装方式详见安装 dtm

2 安装 GitLab 和 Argo CD

2.1 配置准备

创建 config-tools.yaml 文件,你可以修改 vars 中的值来适应你的环境:

config-tools.yaml

  1. config:
  2. state:
  3. backend: local
  4. options:
  5. stateFile: devstream-1.state
  6. vars:
  7. gitlabHostname: gitlab.example.com
  8. gitlabSSHPort: 30022
  9. gitlabHttpPort: 80
  10. gitlabHttpsPort: 30443
  11. tools:
  12. - name: gitlab-ce-docker
  13. instanceID: default
  14. dependsOn: []
  15. options:
  16. hostname: [[ gitlabHostname ]]
  17. gitlabHome: /srv/gitlab
  18. sshPort: [[ gitlabSSHPort ]]
  19. httpPort: [[ gitlabHttpPort ]]
  20. httpsPort: [[ gitlabHttpsPort ]]
  21. rmDataAfterDelete: false
  22. imageTag: "rc"
  23. - name: helm-installer
  24. instanceID: argocd

并修改服务器的 /etc/hosts 文件,添加 gitlab.example.com 的域名解析。如果你的服务器 ip 是 44.33.22.11,就可以这样配置:

/etc/hosts

  1. 44.33.22.11 gitlab.example.com

2.2 初始化(Init)

运行下面的命令来下载安装 GitLab 和 Argo CD 所需的插件:

Bash

  1. dtm init -f config-tools.yaml -y

2.3 应用(Apply)

运行下面的命令来通过配置文件来安装 GitLab 和 Argo CD:

Bash

  1. dtm apply -f config-tools.yaml -y

你会看到类似于下面的输出:

2.4 检查安装结果

2.4.1 访问 GitLab

你可以在自己的 PC 里配置 44.33.22.11 gitlab.example.com 静态域名解析记录,然后在浏览器里通过 http://gitlab.example.com 访问到 GitLab(如果浏览器报了:

GitLab 登录界面

GitLab 登录界面

通过执行如下命令,你可以设置 GitLab 的 root 密码:

get GitLab root Password

  1. docker exec -it gitlab bash # 进入容器
  2. gitlab-rake "gitlab:password:reset" # 执行后按照提示输入用户名 root,回车后输入密码

拿到 root 密码后,你可以尝试用 root/YOUR_PASSWORD 来登录 GitLab。因为后面你还需要用到 GitLab 的 token,所以这时候你可以顺手先创建一个 token:

GitLab token

Generate GitLab token

2.4.2 查看 Argo CD

可以看到 Argo CD 已经被安装到了 Kubernetes 的 argocd 命名空间中:

Bash

  1. [root@ip-10-18-13-200 devstream]# kubectl get ns
  2. NAME STATUS AGE
  3. argocd Active 36s
  4. default Active 6d4h
  5. kube-node-lease Active 6d4h
  6. kube-public Active 6d4h
  7. kube-system Active 6d4h
  8. [root@ip-10-18-13-200 devstream]# kubectl get pods -n argocd
  9. NAME READY STATUS RESTARTS AGE
  10. argocd-application-controller-0 1/1 Running 0 49s
  11. argocd-applicationset-controller-7f4577c5fd-8z926 1/1 Running 0 49s
  12. argocd-dex-server-7cdb45c7c9-nspgz 1/1 Running 0 49s
  13. argocd-notifications-controller-65b77fb646-phdwh 1/1 Running 0 49s
  14. argocd-redis-577c6c8f5c-nf5xm 1/1 Running 0 49s
  15. argocd-repo-server-7bd9fd899c-7f6cp 1/1 Running 0 49s
  16. argocd-server-6686bbcf68-fms5w 1/1 Running 0 49s

3 创建、部署应用程序

3.1 配置准备

创建 config-apps.yaml 文件,你可以修改 vars 中的值来适应你的环境(尤其是dockerhubUser这个配置):

config-apps.yaml

  1. config:
  2. state:
  3. backend: local
  4. options:
  5. stateFile: devstream-2.state
  6. vars:
  7. appName: myapp
  8. gitlabURL: http://gitlab.example.com
  9. defaultBranch: main
  10. dockerhubUser: DOCKERHUB_USER
  11. apps:
  12. - name: [[ appName ]]
  13. spec:
  14. language: python
  15. framework: flask
  16. repo:
  17. url: [[ gitlabURL ]]/root/[[ appName ]].git
  18. branch: [[ defaultBranch ]]
  19. token: [[ env GITLAB_TOKEN ]] # use "GITLAB_TOKEN" env var
  20. repoTemplate:
  21. url: https://github.com/devstream-io/dtm-repo-scaffolding-python-flask.git
  22. ci:
  23. - type: template
  24. templateName: ci-pipeline
  25. cd:
  26. - type: argocdapp
  27. pipelineTemplates:
  28. - name: ci-pipeline
  29. type: gitlab-ci
  30. options:
  31. runner:
  32. enable: true
  33. imageRepo:
  34. user: [[ dockerhubUser ]]
  35. password: [[ env DOCKERHUB_TOKEN ]] # use "DOCKERHUB_TOKEN" env var

你可能已经注意到了,上面的配置中有形如 [[ env XXX ]] 的内容,这表示我们引用了 “XXX” 环境变量来填充配置。所以我们还需要设置如下两个环境变量:

Bash

  1. export GITLAB_TOKEN="YOUR_GITLAB_TOKEN_HERE"
  2. export DOCKERHUB_TOKEN="YOUR_DOCKERHUB_TOKEN_HERE"

提示:

如果你不知道如何创建 DockerHub 的 token,可以参考:Manage access tokens

3.2 初始化(Init)

同样地,我们需要下载第二个配置文件中所需的插件,运行:

Bash

  1. dtm init -f config-apps.yaml

3.3 应用(Apply)

运行:

Bash

  1. dtm apply -f config-apps.yaml -y

你会看到类似下面的输出:

3.4 查看结果

3.4.1 查看 在 GitLab 上创建的 Flask 仓库

Flask 仓库

Flask 仓库

3.4.2 基于 GitLab CI 的 CI 流水线

通过浏览器访问 http://gitlab.example.com,依次点击 CI/CDPipelines

GitLab CI 概览

GitLab CI 概览

3.4.3 基于 Argo CD 的持续交付/部署

CI 流水线已经构建了一个 Docker 镜像并推送到了 Dockerhub,而 DevStream 创建的 Argo CD 应用也部署了这个应用:

Bash

  1. [root@ip-10-18-13-200 devstream]# kubectl get deployment -n default
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. myapp 1/1 1 1 101s
  4. [root@ip-10-18-13-200 devstream]# kubectl get pods -n default
  5. NAME READY STATUS RESTARTS AGE
  6. myapp-b65774f56-8cmjc 1/1 Running 0 106s
  7. [root@ip-10-18-13-200 devstream]# kubectl get services -n default
  8. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  9. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12d
  10. myapp ClusterIP 10.101.148.66 <none> 8080/TCP 110s

我们可以通过端口转发来访问这个应用:

Bash

  1. kubectl port-forward -n default svc/myapp 8080:8080

在浏览器中访问 localhost:8080,你可以看到应用返回了一个 “Hello, World!”。大功告成!

4 清理

4.1 删除 Web 应用

运行:

Bash

  1. dtm delete -f config-apps.yaml -y

4.2 删除 GitLab 和 Argo CD

运行:

Bash

  1. dtm delete -f config-tools.yaml -y

4.3 删除其他文件

Bash

  1. cd ../
  2. rm -rf test/
  3. rm -rf ~/.devstream/