type
Post
status
Published
date
Aug 14, 2023
slug
summary
tags
开发
建站
环境配置
DevOps
category
技术基本功
icon
password
Property
Aug 18, 2023 10:07 AM
GitLab 是一个开源的 Git 服务器。
同时集成了 GitLab CI/CD,几乎兼顾了 DevOps 的整个流程。
而且可以使用 Docker 快速部署,非常方便。

部署 GitLab

使用 Docker 部署 GitLab 并设置主机名(Host)通常涉及以下几个步骤:
  1. 选择或创建一个 Docker Compose 文件:你可以使用 Docker Compose 来定义和运行 GitLab 的容器。以下是一个示例的 docker-compose.yml 文件,用于部署 GitLab:
    1. version: '3' services: gitlab: image: 'gitlab/gitlab-ce:latest' container_name: gitlab hostname: 'gitlab.example.com' # 设置主机名 environment: GITLAB_OMNIBUS_CONFIG: | external_url '<http://gitlab.example.com>' # 设置主机名 gitlab_rails['initial_root_password'] = "your-password-here" gitlab_rails['initial_root_email'] = "[email protected]" ports: - '80:80' - '443:443' - '22:22' volumes: - './gitlab/config:/etc/gitlab' - './gitlab/logs:/var/log/gitlab' - './gitlab/data:/var/opt/gitlab'
      在这个示例中,hostnameexternal_url 用于设置 GitLab 的主机名。你应该将其替换为你自己的域名。一定要设置,不然GitLab上的某些功能页面的URL会指向gitlab.example.com/xxx。
  1. 配置 DNS:你需要确保你的域名解析到运行 GitLab 容器的服务器的 IP 地址。这通常涉及在你的 DNS 提供商的控制面板中创建一个 A 记录。
  1. 启动容器:在包含 docker-compose.yml 文件的目录中运行以下命令来启动 GitLab 容器:
    1. docker-compose up -d
  1. 配置反向代理(可选):如果你想在 HTTPS 上提供 GitLab,并且/或者在同一台服务器上运行其他 web 服务,你可能还需要配置一个反向代理,例如 Nginx 或 Apache。这将允许你为 GitLab 设置 SSL 证书,并将流量路由到正确的容器。
  1. 配置防火墙(可选):确保你的服务器防火墙允许通过 HTTP(端口 80)、HTTPS(端口 443)和 SSH(端口 22,如果你想通过 SSH 使用 Git)的流量。
请注意,这只是一个基本示例,根据你的具体需求和环境,可能还需要进行其他配置。在生产环境中部署 GitLab 时,务必参考 GitLab 的官方文档,以确保你的部署安全、可扩展且符合最佳实践。
 

GitLab CI/CD

GitLab CI/CD 的配置需要配置 .gitlab-ci.ymlGitLab Runner
GitLab Runner 就是CI的虚拟运行环境。
.gitlab-ci.yml 就是描述和定义CI/CD的具体行为。

.gitlab-ci.yml 详解

一个例子:
stages: - build - deploy variables: IMAGE_NAME: my-django-app IMAGE_TAG: latest build: stage: build script: - docker build -t $IMAGE_NAME:$IMAGE_TAG . - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker tag $IMAGE_NAME:$IMAGE_TAG $CI_REGISTRY_IMAGE:$IMAGE_TAG - docker push $CI_REGISTRY_IMAGE:$IMAGE_TAG deploy: stage: deploy script: - ssh $DEPLOY_SERVER_USER@$DEPLOY_SERVER "docker pull $CI_REGISTRY_IMAGE:$IMAGE_TAG" - ssh $DEPLOY_SERVER_USER@$DEPLOY_SERVER "docker-compose -f /path/to/docker-compose.yml up -d"
这个文件定义了 GitLab CI/CD 的流程,用于构建和部署 Docker 镜像。

Stages 定义

stages: - build - deploy
  • stages::定义了流水线的阶段。流水线中的任务将按照这些阶段的顺序执行。
  • build:第一个阶段,用于构建 Docker 镜像。
  • deploy:第二个阶段,用于部署 Docker 镜像。

Variables 定义

variables: IMAGE_NAME: my-django-app IMAGE_TAG: latest
.gitlab-ci.yml 文件中,变量是通过 variables 关键字定义的。这些变量可以在整个 CI/CD 流水线中使用。
  • variables::这一行开始定义变量的部分。
  • IMAGE_NAME: my-django-app:定义了一个名为 IMAGE_NAME 的变量,并将其值设置为 my-django-app。这个变量用于指定 Docker 镜像的名称。
  • IMAGE_TAG: latest:定义了一个名为 IMAGE_TAG 的变量,并将其值设置为 latest。这个变量用于指定 Docker 镜像的标签。
这些变量可以在流水线的任何地方通过 $变量名 的形式引用。例如,在构建 Docker 镜像时,可以使用 $IMAGE_NAME$IMAGE_TAG 来引用这些变量的值。
除了在 variables 部分定义的变量外,GitLab CI/CD 还提供了一些预定义的变量,如 $CI_REGISTRY_USER$CI_REGISTRY_PASSWORD$CI_REGISTRY。这些变量通常由 GitLab 自动设置,并可以用于与 GitLab Docker 注册表进行交互。在你提供的文件中,这些变量用于 Docker 登录和推送镜像的操作。

Build 阶段

build: stage: build script: - docker build -t $IMAGE_NAME:$IMAGE_TAG . - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker tag $IMAGE_NAME:$IMAGE_TAG $CI_REGISTRY_IMAGE:$IMAGE_TAG - docker push $CI_REGISTRY_IMAGE:$IMAGE_TAG
  • build::定义了名为 "build" 的任务。
  • stage: build:指定该任务属于 "build" 阶段。
  • script::定义了任务中要执行的命令。
    • docker build -t $IMAGE_NAME:$IMAGE_TAG .:构建 Docker 镜像,并使用之前定义的名称和标签。
    • docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY:使用 GitLab CI 提供的凭证登录 Docker 注册表。
    • docker tag $IMAGE_NAME:$IMAGE_TAG $CI_REGISTRY_IMAGE:$IMAGE_TAG:标记 Docker 镜像,以便将其推送到注册表。
    • docker push $CI_REGISTRY_IMAGE:$IMAGE_TAG:将标记的镜像推送到 Docker 注册表。

Deploy 阶段

deploy: stage: deploy script: - ssh $DEPLOY_SERVER_USER@$DEPLOY_SERVER "docker pull $CI_REGISTRY_IMAGE:$IMAGE_TAG" - ssh $DEPLOY_SERVER_USER@$DEPLOY_SERVER "docker-compose -f /path/to/docker-compose.yml up -d"
  • deploy::定义了名为 "deploy" 的任务。
  • stage: deploy:指定该任务属于 "deploy" 阶段。
  • script::定义了任务中要执行的命令。
    • ssh $DEPLOY_SERVER_USER@$DEPLOY_SERVER "docker pull $CI_REGISTRY_IMAGE:$IMAGE_TAG":通过 SSH 连接到部署服务器,并从 Docker 注册表拉取镜像。
    • ssh $DEPLOY_SERVER_USER@$DEPLOY_SERVER "docker-compose -f /path/to/docker-compose.yml up -d":通过 SSH 连接到部署服务器,并使用 docker-compose 命令启动服务。
总的来说,这个 .gitlab-ci.yml 文件定义了一个简单的 CI/CD 流程,用于构建 Docker 镜像并将其部署到远程服务器。
 

GitLab Runner

在GitLab的CI/CD设置里添加Runner,然后注册。
Runner 要注意 Tag,对应Tag的Runner只能分配给对应Tag的任务,除非这个Runner可以指派给无Tag的任务。
 
sudo docker pull gitlab/gitlab-runner:latest sudo docker run -d \ --name gitlab-runner \ --network gitlab-network \ --restart always \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:latest
 

注册GitLab Runner时的executor应该怎么选?

GitLab Runner 的执行器(executor)决定了如何运行 CI/CD 作业。选择哪个执行器取决于你的具体需求和环境。以下是一些常用执行器的概述:
  1. shell:在 Runner 主机上直接运行脚本。这是最简单的执行器,但可能会导致安全和隔离问题。
  1. docker:在 Docker 容器中运行作业。这提供了良好的隔离,并允许你为每个作业指定一个 Docker 镜像。如果你已经在使用 Docker,并希望每个作业都在干净的环境中运行,这可能是一个好选择。
  1. kubernetes:在 Kubernetes 集群中运行作业。如果你已经使用 Kubernetes,这可能是一个强大的选项。
  1. ssh:通过 SSH 在远程服务器上运行作业。这允许你在特定的远程机器上运行作业。
  1. virtualboxparallels:在 VirtualBox 或 Parallels 虚拟机中运行作业。这提供了更强的隔离,但可能更复杂和资源密集型。
  1. docker+machine:使用 Docker Machine 创建和管理 Docker 主机。这允许 Runner 在需要时动态创建和销毁虚拟机。
  1. custom:允许你定义自己的执行器。这是一个高级选项,需要你完全理解你的需求和环境。
  1. instancedocker-autoscalerdocker-windows:这些是特定用例或环境的执行器。
通常,如果你已经在使用 Docker,并且希望利用容器的隔离和可重复性,那么 docker 执行器可能是一个很好的选择。如果你在使用 Kubernetes,那么 kubernetes 执行器可能更合适。
选择执行器时,请考虑你的安全、隔离、可扩展性和维护需求。你还可以参考 GitLab Runner 执行器的官方文档,了解每个执行器的详细信息和最佳实践。
 
 
使用清华源部署GitLab Runner
利用Docker容器技术构建自动化分布式Web测试集群 管理 SSH 服务