从0开始的Gitlab-CICD部署过程 - Go语言中文社区

从0开始的Gitlab-CICD部署过程


代码更新后自动部署:使用Gitlab-CI

以前写的代码更新后,都是在本地(Windows)重新编译后通过远程连接复制到服务器,然后再双击运行,以达到更新的目的。后来学长指导用Gitlab-CI来自动更新,于是就趁着寒假在家期间,尝试用之。

0. Docker基础&安装Gitlab

7月份开始进入导师的实验室学习,在Linux平台上使用Docker安装Gitlab,将实验室的gitlab数据迁移到另外一台服务器上,并且完成升级。

学习基础

刚开始我对Linux的了解仅限于它和windows不同。在学长的指导下,我开始学习基础。

  1. Linux基础
    工欲善其事,必先利其器。如今在Windows系统下使用Linux系统可以选择不安装VM虚拟机,而是使用Windows自带的WSL功能,其具体介绍这里不再指出。下面给出安装过程。
    1. 在控制面板->程序和功能->启用或关闭Windows功能->勾选 “适用于Linux的Windows子系统”
    2. 进入Windows自带的应用商店,搜索Ubuntu,然后安装。

      这里安装第一个。完成后进入“开始”菜单,打开安装好的Ubuntu。第一次进入系统可能需要一段时间,之后按照提示注册用户,密码。
    3. 学习linux的操作基础
      我是在C语言中文网http://c.biancheng.net/cpp/html/2726.html上学习了Linux系统的基础知识。一边看一边在Ubuntu上练习,比较简单,因为只用知道如何操作即可。
  2. Docker基础
    Docker单从功能上来说,跟虚拟机很类似。比如我可以在docker上再安装一个utunbu系统,然后进入这个系统操作。使用docker部署web应用更轻巧,快速。
    在docker中,有几个基础概念需要了解。
    1. 镜像-image
      对于一个纯净的windows,需要你自己下载应用程序。docker也是一样,需要自己安装镜像。镜像就像C++中的class,他提供了一个模板给你使用,你需要用这个镜像来构建自己的容器,你也可以自己修改镜像,然后生成自己的镜像,并提交给官方的镜像仓库中。

    2. 容器-container
      容器就是使用镜像创建的具体的应用,就像C++中使用class创建的一个具体的实例。可以将其启动、开始、停止删除,而这些容器都是相互隔离、互不可见的。简单地说,容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层。

    3. 数据卷-volume
      使用容器时的数据会在删除容器后一起删除,想要存放数据,就需要给容器挂载一个数据卷,卷是绕过Union文件系统的一个或多个容器中的特殊指定目录。卷旨在保留数据,与容器的生命周期无关。

    4. 具体的介绍和操作语句可以到Docker官网文档查询,下面写几个常用的语句:
      查看已安装镜像:

      docker image ls  
      

      浏览镜像仓库:

      docker image search`
      

      下载镜像:

      docker pull xxx
      

      创建容器:

      docker run <选项> <镜像名称>   <命令语句> 
      

      选项:
      -i :以交互模式运行容器,通常与 -t同时使用
      -t:为容器重新分配一个伪输入终端。-it则可实现创建后即可持续输入命令
      -d:后台运行,返回容器ID
      -p:指定端口映射,格式为:主机(宿主)端口:容器端口
      –name:为容器指定一个名称
      -v: 绑定一个卷
      命令语句:/bin/bash :交互模式
      查看全部容器:

      docker container ls -a
      

      停止容器:

      docker stop <容器名称或ID>
      

      移除容器(必须先停止):

      docker rm <容器名称或ID>
      

      进入容器:

      docker exec -it <名称或ID> bash
      

      详细的教程和实例练习可以参考https://yeasy.gitbooks.io/docker_practice/

  3. docker-compose
    使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。
    • 安装:安装 Docker Compose 可以通过下面命令自动下载适应版本的 Compose二进制文件,并为安装脚本添加执行权限
      sudo curl -L https://github.com/docker/compose/releases/download/1.22.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose下载
      sudo chmod +x /usr/local/bin/docker-compose添加权限
      
    • 或者:
      apt install docker-compose
      
      具体实例可以apt install docker-compose参考这篇文档:https://yeasy.gitbooks.io/docker_practice/compose/introduction.html

迁移Gitlab的服务器

  1. 备份

    1. 进入旧服务器的gitlab容器,查找备份设定的备份路径
      cat /etc/gitlab/gitlab.rb | grep'backup_path‘
      
      默认在/var/opt/gitlab/backups
    2. 备份(建议与开发约定时间,停止使用的情况下备份)
      1. 停止相关数据连接服务
        gitlab-ctl stop unicorn
        
        ok: down: unicorn: 0s, normally up
        
        gitlab-ctl stop sidekiq
        
        ok: down: sidekiq: 0s, normally up
        
      2. 备份数据
        gitlab-rake gitlab:backup:creat
        
        需要一点时间,最后生成的文件1552531259_2019_03_14_11.3.0_gitlab_backup.tar其中1552531259_2019_03_14_11.3.0为备份的编号,恢复的时候用到。
      3. 备份安全密钥文件(重要)
        查找密钥文件目录
        find  / gitlab-secrets.json
        
        找到后也需要备份,否则会出现问题:https://gitlab.com/gitlab-org/gitlab-ce/issues/53465
      4. 备份配置文件
        在与gitlab-secrets.json文件同一目录下的gitlab.rb文件储存着gitlab的配置信息,如邮箱,网址,端口,内存等,可以备份此文件,从而不需要再次修改。
    3. 下载备份文件
      使用WinSCP下载备份文件(数据+密钥+配置文件)到本地windows里
      winscp的使用可以参考https://winscp.net/eng/docs/lang:chs
  2. 恢复

    1. 安装docker

      1. 如果你过去安装过 docker,先删掉:
      sudo apt-get remove docker docker-engine docker.io
      
      1. 首先安装依赖:
        sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
        
      2. 信任 Docker 的 GPG 公钥:
        curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
        
      3. 添加软件仓库(使用清华大学的):
        sudo add-apt-repository 
          "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu 
          $(lsb_release -cs) 
          stable"
        
      4. 最后安装DOCKER
        sudo apt-get update
        sudo apt-get install docker-ce
        
    2. 安装docker-compose

      sudo apt install docker-compose
      
    3. 安装gitlab

      1. 在新服务器上下载和旧服务器版本相同的Gitlab镜像,旧的版本可以在gitlab网页的管理员控制中心中查看。
      2. 然后下载相应的镜像:
      docker pull gitlab/gitlab-ce:11.4.4-ce.0 #注意要在11.4.4后加上-ce.0才是完整的tag
      
    4. 使用docker-compose搭建旧版本的git服务器

      1. 编写docker-compose
        新建一个空目录,在空目录里新建gitlab.yml文件并编辑

        mkdir git-compose
        
        cd git-compose
        
        touch gitlab.yml
        
        vim gitlab.yml
        

        这是我的compose文件:

        web:
          image: 'gitlab/gitlab-ce'
          restart: always
          hostname: 'git.ahusmart.com'
          environment:
            GITLAB_OMNIBUS_CONFIG: |
              external_url 'https://git.xxxxx.com'
              gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
        https相关设置
              nginx['enable'] = true
              nginx['client_max_body_size'] = '250m'
              nginx['ssl_client_certificate'] = "/etc/gitlab/ssl/ca.cer"
              nginx['ssl_certificate'] = "/etc/gitlab/ssl/fullchain.cer"
              nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/git.ahusmart.com.key"
              nginx['ssl_ciphers'] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
              nginx['ssl_prefer_server_ciphers'] = "on"
          ports:
            - '80:80'
            - '22:22' #注意,22端口原本为ssh登录端口,需要更改ssh登录端口。
            - '443:443'
          volumes:
            - '/mnt/sdc/gitlab/config:/etc/gitlab'
            - '/mnt/sdc/gitlab/logs:/var/log/gitlab'
            - '/mnt/sdc/gitlab/data:/var/opt/gitlab'
            - '/mnt/hdd/gitlab/backups:/var/opt/gitlab/backups'
        
      2. 启动容器
        在与gitlab-yml同一个目录下运行:

        docker-compose up -d
        

        等待完成即可。
        安装完成之后即可测试网站功能是否正常,比如clone,push,pull等。
        在正常之后,即可开始恢复文件。

    5. 使用winscp
      将Windows里的数据备份上传的新服务器的/mnt/sdc/gitlab/backups里,将gitlab-secrets.json上传到/mnt/sdc/gitlab/config里覆盖.

    6. 然后进入容器内:

      docker exec -it <容器名> bash
      

      停止相关服务:

      # gitlab-ctl stop unicorn
      ok: down: unicorn:0s, normally up
      # gitlab-ctl stop sidekiq
      ok: down: sidekiq:0s, normally up
      
    7. 恢复文件:

      # ls /etc/gitlab/backups
      1563006825_2019_07_13_11.4.4_gitlab_backup.tar
      

      把文件名复制下来:注意:复制到11.4.4即可,后面不用,即复制1563006825_2019_07_13_11.4.4

      gitlab-rake gitlab:backup:restore BACKUP=1563006825_2019_07_13_11.4.4
      

      按照提示,都输入yes即可。

    8. 刷新配置文件:

      gitlab-ctl reconfigure
      
    9. 重新启动相关服务

      gitlab-ctl start unicorn
      ok: run: unicorn: (pid2711)0s
      gitlab-ctl start sidekiq
      ok: run: sidekiq: (pid2803)0s
      
    10. 重启服务:

      gitlab-ctl restart
      ok: run: alertmanager: (pid4983)1s
      ok: run: crond: (pid4993)0s
      ok: run: gitaly: (pid5001)1s
      ok: run: gitlab-monitor: (pid5014)0s
      .....
      ok: run: gitlab-workhorse: (pid5027)0sok: run: unicorn: (pid5188)0s
      

      登陆WEB页面查看代码是否存在
      我因为种种原因,反复移除、创建了几次。注意:在重装时,需要把/mnt/sdc目录下的文件都删除,确保重装的纯净。
      这时就可以登上网页查看旧服务器上的仓库是否存在了。
      验证(可选):

      gitlab-rake gitlab:check SANITIZE=true
      Checking GitLab Shell ...
      GitLab Shell version >= 8.3.3 ? ... OK (8.3.3) 
      Repo base directory exists? 
      default... yes 
      Repo storage directories are symlinks?
      default... noRepo 
      ....................
      
      Git user has default SSH configuration? 
      
      ... yes
      
      Active users: ... 17
      
      Checking GitLab 
      
      .. Finished 
      
  3. 升级gitlab版本
    停止容器:

    docker container stop gitlab
    

    移除容器:

    docker rm gitlab
    

    把compose文件gitlab.yml中的

    image: gitlab/gitlab-ce:11.4.4-ce.0
    

    修改为

    image: gitlab/gitlab-ce 
    

    在镜像名称后不加tags,系统会默认使用最新版的官方镜像,如果没有则会自动先下载。

    启动:

    docker-compose up-d
    Creating gitlab ... done
    

到此,完成了迁移升级的全过程。
3. 安装HTTPS证书启用HTTPS
新的风暴已经出现,开哥要用HTTPS!于是,又一轮填坑之旅开始了。

  1. 安装 acme
    curl  https://get.acme.sh | sh
    alias acme.sh=~/.acme.sh/acme.sh
    
  2. 生成证书(手动模式-manual-mode)
    acme.sh --issue -d git.ahusmart.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
    
  3. 在DNS控制台添加TXT记录
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ly0aNMH8-1580478436914)(https://s2.ax1x.com/2020/01/31/13OVAS.md.png)]
  4. 更新证书
    acme.sh --issue -d git.ahusmart.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please --renew
    
  5. 安装证书
    acme.sh --installcert -d  git.ahusmart.com --key-file /mnt/sdc/gitlab/config/ssl/git.ahusmart.com.key --fullchain-file /mnt/sdc/gitlab/config/ssl/fullchain.cer --cert-file /mnt/sdc/gitlab/config/ssl/git.ahusmart.com.cer --ca-file /mnt/sdc/gitlab/config/ssl/ca.cer --reloadcmd "docker restart gitlabcompose_web_1"
    
    注意安装的路径要与你docker-compose文件中挂载的宿主机的路径相同。
  6. 按照我之前的docker-compose文件,应该已经开启了HTTPS服务。
  7. 警告!手动模式无法自动更新,所以证书到期后需要再次执行4-3-4,待优化。

1. 将应用部署到Docker中

之前都是Windows平台运行,现在采用微服务+docker,所以将应用部署到Docker中

  1. 再看Dockerfile
    在之前学习docker时,只是涉及容器的使用,对定制镜像没有深入学习。现在,涉及到在镜像中编译代码,就需要对Dockerfile做一个学习了。
    1. 镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。
    2. Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction)每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
    3. 以本人的Dockerfile 1.0为例,学习常用的指令
      # 使用定制的golang版本作为基础镜像
      FROM kesu/gochina:latest
      #设置环境变量
      ENV GO111MODULE on
      # 工作目录设置成/opt/aplus
      WORKDIR /opt/n2/
      # 拷贝所有源代码到工作目录
      COPY . /opt/n2/
      # 设置log文件夹为挂载点
      VOLUME /opt/n2/log
      # 下载go mod文件
      RUN go mod download 
         && CGO_ENABLE=0 go build -o n2
      # 暴露6060端口
      EXPOSE 6060
      # 运行程序
      ENTRYPOINT ["./n2"]
      
  2. 使用多阶段构建镜像
    1. 在上文中,我们的Dockerfile构建成功后的镜像体积大小为480M,其中包含着GO的各种环境、工具等。而我们只要他编译成功后的可执行文件,这就造成了空间上的浪费。
    2. 解决方法:在前一个镜像构建完成后,生成了静态编译的可执行文件,不需要依赖其他的环境就可运行。因此只要把可执行文件放到Scratch或者Alpine镜像中,就可以执行了。
    3. 2的过程包括编译和复制,需要两个镜像:GO和Alpine。这就引出了
      多阶段构建:允许一个Dockerfile 中出现多个 FROM 指令。
    4. 能够将前置阶段中的文件拷贝到后边的阶段中,就是他最大的意义。
    5. 下面,以我的Dockerfile 2.0为例,了解多阶段构建。
      # 一阶段构建编译
      # 使用定制的golang版本作为基础镜像
      FROM kesu/gochina:latest AS build-env
      
      #设置环境变量
      ENV GO111MODULE on
      
      # 工作目录设置成/opt/aplus
      WORKDIR /opt/n2/
      
      # 拷贝所有源代码到工作目录
      COPY . /opt/n2/
      
      # 下载go mod文件
      RUN go mod download 
         && CGO_ENABLE=0 go build -o N2Go
      
      # 二阶段构建运行
      FROM alpine:latest AS run-env
      
      # 设置时区
      RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
         && echo "Asia/Shanghai" > /etc/timezone 
         && apk del tzdata
      
      # 设置工作区
      WORKDIR /root/N2Go
      
      # 从上个镜像中复制可执行文件
      COPY --from=build-env  /opt/n2/N2Go ./N2Go
      
      # 设置log文件夹为挂载点
      VOLUME ./log
      
      # 暴露6060端口
      EXPOSE 6060
      
      # 运行程序
      ENTRYPOINT ["./N2Go"]
      
      先看第一行的FROM kesu/gochina:latest AS build-env,对比Dockerfile 1.0,多了 AS build-env,就是讲当前阶段起个名字叫build-env。
      COPY --from=build-env /opt/n2/N2Go ./N2Go这一行中,我们用build-env来指代第一阶段产生的镜像,从中复制出可执行文件到第二阶段中来。也可以用--from=0来指代上一个镜像。
    6. 我们看一下docker build -t n2go .的结果:镜像大小只有15.7M,用docker run ......启动一个容器,完美运行。极大的缓解了我的空间不足恐惧症和强迫症
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/ccstudyforever/article/details/104128633
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 10:41:58
  • 阅读 ( 1445 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢