gitlab-runner+docker实现自动化部署流水线

为什么使用gitlab-runner?

        1、我们所有工程代码都托管于gitlab私服

        2、在基于gitab下就算选择Jenkins也是需要配置runner作为触发入口

        基于前面两点。我们选择直接使用gitlab-runner进行cicd。

目的:

        1、较为简单化的配置

         2、所有构建操作容器化,构建完成即销毁,避免危险命令

GitLab-Runner

        1、实现原理

 

 部署细节

       1、 环境准备

                     

序号系统ip服务
1Centos7192.168.31.11gitlab-14.8.2
2Centos7192.168.31.140gitlab-runner-9.5.1、docker-19.03.11
3Centos7192.168.31.141docker-19.03.11

       2、安装服务

            2.1、安装gitlab


            2.2、安装docker

            2.3、安装runner

                       runner我们选择装直接装在宿主机上,不推荐装在docker里

                        添加源

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash

                        安装runner

yum install gitlab-ci-multi-runner

                        注册runner

sudo gitlab-runner register -n   --url http://192.168.31.11/   --registration-token GR1348941MTY5GcLRdXbiRRcKBE7b   --executor docker   --description "My Docker Runner"   --docker-image "docker:19.03.12"   --docker-privileged   --docker-volumes "/certs/client"

                      向GitLab-CI注册一个Runner需要两样东西:GitLab-CI的url和注册token。其中,token是为了确定你这个Runner是所有工程都能够使用的Shared Runner还是具体某一个工程才能使用的Specific Runner。

                    注册时除却token和url外还需要输入一些参数

                     register gitlab地址

                     registration-token 密钥

                     executor 执行器(可以选择docker、Linux等)

                     description runner描述

                     docker-image docker镜像

                      。。。。

                      可查看runner配置详解

                      执行器种类 :               

                     执行完成注册命令后会在/etc/gitlab-runner/下生成config.toml文件,更多自定义配置可自行在文件里添加。

                       注册完成后可在项目的cicd runner界面看到注册好的runner

                     点击runner的修改按钮,根据自身需要选择是否勾线受保护的分支

         3、编写ci文件

                    在项目根目录下添加gitlat-ci.yml文件。ci文件参考(maven工程):

#添加docker服务并指定私服地址
services:
  - name: docker:19.03.12-dind
    command: ["--insecure-registry=192.168.31.10:8083"]
#docker服务启动参数
variables:
  DOCKER_HOST: tcp://docker:2375/
  DOCKER_DRIVER: overlay2 
  DOCKER_TLS_CERTDIR: ""
#流水线阶段
stages:
  - maven-build
  - docker-build
  - deploy
#maven 打包
maven-build:
  stage: maven-build
  image: maven:3.5.0-jdk-8
  script:
    - mvn package -B -Dmaven.test.skip=true
  artifacts:
    paths: 
      - target/$jar_name
#打包成docker镜像并上传
job_build:
  stage: docker-build
  before_script:
     #设置登录认证
    - mkdir -p $HOME/.docker
    - echo $DOCKER_AUTH_CONFIG > $HOME/.docker/config.json
  script:
    # 通过Dockerfile生成镜像1
    - docker build -t cicdtest .
    # 以流水线id给镜像打tag
    - docker tag cicdtest $NEXUS_IP/cicdtest:$CI_PIPELINE_ID
    #上传镜像
    #- docker login -u $NEXUS_USER -p $NEXUS_PWD $NEXUS_IP
    - docker push $NEXUS_IP/cicdtest:$CI_PIPELINE_ID
#通过脚本拉取镜像并容器化启动镜像
job_deploy:
  stage: deploy
  script:
    #执行脚本
    - sh /home/script/job_deploy.sh $APPLICATION_IP $NEXUS_USER $NEXUS_PWD $NEXUS_IP $APP_NAME $CI_PIPELINE_ID 8080
  only:
    - main

                      文件中定义了一些公共参数,通过gitlab管理员账号在设置→CICD→变量中添加 

                

                 当然runner也有一些内置参数比如CI_PIPELINE_ID(流水线编号),更多参数请参考:      runner参数的使用

至此就可以使用runner进行cicd测试啦。

 部署历程

         1、准备部署环境 gitlab服务器、runner服务器、应用服务器

         2、安装并注册runner

         3、编写项目ci文件

部署中遇到的问题及解决方案 


         1、ci文件传参问题

                需要传参的脚本中不能以单引号包裹,否则会视为字符串

                services:command不能使用变量,(目前还没找到解决方案)

         2、docker in docker 问题

                因为需要做到构建隔离及构建中使用docker命令,所以采用docker in docker模式

实现docker in docker 一般为两种方式:

                 1、通过在runner配置文件config.toml中的runners.docker下配置volumes参数将宿主机 docker.sock 文件挂载到容器,实现容器内 docker 操作宿主机 docker 的目的。

                

                2、使用docker-dind镜像

                

                这里我们使用第二种方式 ,因为第一种方式违背了我构建操作完全隔离的诉求。

                注:docker-dind需要与配置中使用的docker进行版本一致

         3、私服镜像及maven私包拉取问题

                发现使用的公共docker镜像拉不到私服上的镜像及私包,所以我做了一下的尝试,手动启动一个docker-dind镜像,进入容器进行私服配置,之后再把该容器打成私有镜像,随后在runner的services里面进行指定。发现这样根本不行QAQ!

              正确的方法应该是:

              docker私服指定通过services:command指定私服地址。

               maven和npm直接把配置文件挂载进容器进行指定。

参考文档

        官方文档

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值