目 录CONTENT

文章目录

# 云原生 | Docker + GitLab + GitLab Runner 自动化部署 ## `CI/CD`

如风
2023-05-13 / 0 评论 / 1 点赞 / 29 阅读 / 1,330 字

云原生 | Docker + GitLab + GitLab Runner 自动化部署

CI/CD

CI/CD 是持续集成 (CI-Continuous Integration) 和持 续交付(Continuous Delivery) 或持续部署(CD-Continuous Deployment) 的组合实践。CI/CD 实践构成了现代 DevOps 操作的支柱。

持续集成主要包含以下步骤:

  • 自动化构建Continuous Build
  • 自动化测试Continuous Test, 验证软件功能
  • 自动化集成Continuous Intergration

GitLab

目前市面上实现自动化部署的开源方案一般有两个(JenkinsGitLab)。从可扩展性而言Jenkins是更好的选择,不过自由也意味着很多东西都需要自己配置

Gitlab 是开源的 devops 平台,集成了 Gitlab CI/CD 功能,GitLab作为代码仓库管理系统,提供了可视化界面、版本控制、代码审核等功能,而GitLab Runner则是CI/CD的执行器,负责执行GitLab中配置的任务,可以自动从GitLab上获取任务并执行

  • 开发者在commit代码或者提交merge request会自动触发CI/CD流程
  • 流程开始后,会主动读取项目根目录下的 .gitlab_ci.yml 文件,获取构建镜像,构建步骤,构建命令等,并运行一个 CI pipeline(一个pipeline通常分为三个阶段:build,test,deploy),即会执行一系列任务,如用eslint校验代码规范,单元测试等。
  • 根据.gitlab_ci.yml中配置的stage中的tags,选择对应的GitLab Runner,根据配置的image启动容器,并在该容器中执行stage中的构建命令

Gitlab CI/CDpipeline(流水线),stage(阶段),job(任务)之间的关系为:pipeline 包含了若干个 stagestage 包含了多个 jobjob 是流水线中最小的单位,这些任务是在 GitLab Runner 中运行。

GitLab还集成了sentry sdk,可通过连接sentry进行监控,还可以接入kubernets集群等

实践开始

GitLab环境安装配置

  1. docker拉取GitLab镜像,运行

    ## 拉取镜像
    sudo docker pull docker.io/gitlab/gitlab-ce
    
    ## 创建目录
    sudo mkdir -p /gitlab/data
    sudo mkdir -p /gitlab/logs
    sudo mkdir -p /gitlab/config
    
    ## 运行
    sudo docker run --detach \
        --publish 8443:443 --publish 8000:80 --publish 2222:22 \
        --name gitlab \
        --restart unless-stopped \
        --volume /gitlab/config:/etc/gitlab \
        --volume /gitlab/logs:/var/log/gitlab \
        --volume /gitlab/data:/var/opt/gitlab \
        -log-driver=none \
        docker.io/gitlab/gitlab-ce:latest
    

    速度过于慢了😭

    image-20230513144344483

    解决方式

    登录

    1. 在config下有一个文件存放了root用户的密码

      image-20230616014041752

    2. 修改root密码

    3. GitLab里面的模板创建个 项目

    在浏览器打开 http://ip:8000

    image-20230623140515015
  2. 为了正常使用,我们还需要配置GitLab。修改配置文件 /gitlab/config/gitlab.rb

修改external_urlexternal_url 'http://IP:8000' # IP填写GitLab部署的服务器的IP

修改ssh端口: gitlab_rails['gitlab_shell_ssh_port'] = 2222

修改nginx监听的端口nginx['listen_port'] = 80

修改完成重启容器

docker restart gitlab

出现问题 502 We’re sorry. GitLab is taking too much time to respond.

image-20230623141302771

根据网上的解决方式,一方面就是服务器的配置太低了,然后就是等待一段时间可能就好了

GitLab Runner环境安装配置

docker拉取gitlab/gitlab-runner镜像,运行

docker pull gitlab/gitlab-runner
docker run -d --name gitlab-runner --restart unless-stopped \
  -v /home/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest

Go项目的自动化部署

GitLab创建一个项目

image-20230616110855638 image-20230616110906574

设置免密登录

进入到文件夹 cd ~/.ssh/, 复制 pub 文件内容

点击头像 Lkd2020.0921.,添加 SSH KEY,粘贴到这里即可

image-20230623145152714

拉取代码

image-20230623141813462
git clone http://192.168.253.128:8000/root/hello.git

通过 Git add,commit,push 上传一个 Go 项目

package main

import (
        "fmt"
        "net/http"
)

func indexHandler(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "hello CI/CD")
}
func main() {
        http.HandleFunc("/", indexHandler)
        fmt.Println("listening on http://localhost:8009")
        http.ListenAndServe(":8009", nil)
}

设置一些基本的变量,包括docker的用户和密码

image-20230623144006226

之后复制这里的 Registration token

image-20230616104551003

进入gitlab-runner容器中, 注册 runner

docker exec -it gitlab-runner /bin/bash

进入容器后输入

gitlab-ci-multi-runner register

image-20230616105548731

执行之后可以看到注册的 Runner

image-20230616105617255

自动化部署项目

首先在仓库中添加文件:.gitlab-ci.yml,内容如下

stages:
  - test
  - build

variables:
  GOPROXY: https://goproxy.cn

lint:
  stage: test
  script:
    - echo "hello world lint"
  only:
    - branches
  tags:
    - test

test:
  stage: test
  script:
    - echo "hello world test"
  only:
    - branches
  cache:
    key: "bazel"
    paths:
      - .cache
  tags:
    - test

提交到仓库,查看流水线可以看到

image-20230616110016880

出现问题:一直处于pending状态

进入 gitlab-runner 容器

docker exec -it gitlab-runner /bin/bash

执行以下命令查看 gitlab-runner的状态

gitlab-ci-multi-runner list    # 查看发现runer还在
gitlab-ci-multi-runner verify  # 发现runer还活着
gitlab-ci-multi-runner run     # 他会去执行runner任务,但是每次都需要运行次命令才回去执行任务

最后发现是tag的问题,在创建Runner的时候 tag,所以.gitlab-ci.yml 文件tag必须保持一致.

成功执行!!!

image-20230623153738811

参考

1

评论区