• docker gitlab版本管理和CI/CD 自动部署go


    一、docker中安装gitlab

    #先拉取镜像
    docker pull gitlab/gitlab-ce:latest
    
    #运行镜像
    docker run -d -p 443:443 -p 80-100:80-100 -p 22:22  --name gitlab  --restart always   --v D:/docker/gitlab/config:/etc/gitlab  -v D:/docker/gitlab/logs:/var/log/gitlab   --v D:/docker/gitlab/data:/var/opt/gitlab  gitlab/gitlab-ce:latest
    
    # 22端口对应的是 ssh  80-100表示80-100之间的所有端口
    # -d:后台运行
    # -p:将容器内部端口向外映射
    # --name:命名容器名称
    # -restart always 表示一直开机启动,docker启动就会启动
    # -v:将容器内目录挂载到宿主机指定目录
    

      安装成功后,打开浏览器输入本地IP即可打开页面

        管理员默认是root,第一次登陆的时候需要设置密码

      进入容器内部

     docker exec -it gitlab /bin/bash
    

      然后输入命令

    gitlab-rails console
    

      

      弹出 Loading production environment 后,在下面逐步输入:

    1、【user=User.where(id:1).first】 查出指定修改的用户,1 为root
    
    2、【user.password='abc123456'】 需要设置的密码
    
    3、【user.password_confirmation='abc123456'】  确认上面输入的密码
    
    4、【user.save!】 保存
    

      

      有了账号登陆进去后,可以在右上角设置里面设置成中文界面。别的用户想要登录,直接页面注册,然后后台审核用户就行。

       新建一个群组,把用户添加进组里面,新建一个git项目指定给某个群组

      额外配置

      gitlab创建项目的时候,默认的git地址是容器本机的IP地址,可以改成一个虚拟主机,修改配置文件 D:\docker\gitlab\config\gitlab.rb 里面的 external_url

    external_url 'http://git.xxx.com'
    

      重启gitlab

    #在gitlab内部重启加载配置
    gitlab-ctl reconfigure
    gitlab-ctl  restart
    

      

    二、安装gitlab-runner CI/CD自动部署

    持续集成 CI(Continuous Integration):在源代码变更后,触发自动检测、构建和测试的过程。在代码提交后,会自动进行构建和测试,并反馈结果。当结果符合预期时,再将代码集成到主干。持续集成的目标是快速确保当前变更是可用的。

    持续交付 CD(Continuous Delivery):是基于持续集成基础上,将集成后的代码自动化部署到各个环境测试,确定可以发布生产版本。

    持续部署 CD(Continuous Deployment):是基于持续交付的基础上,将在各个环境经过测试的应用自动化部署到生产环境。其实各个环境的发布过程都是一样的。应用发布到生产环境后,我们需要对应用进行健康检查、添加应用的监控项、 应用日志管理。

    1. 安装并运行gitlab-runner

    GiTLab Runner是一个脚本运行器,类似于Jenkins,可以为我们执行一些CI持续集成、构建的脚本任务(即.gitlab-ci.yml),运行器具有执行脚本、调度、协调的工作能力。

    #拉去镜像
    gitlab/gitlab-runner:latest
    
    #运行容器
    docker run -d --name gitlab-runner --restart always  -v D:/docker/gitlab/gitlab-runner/config:/etc/gitlab-runner  -v /var/run/docker.sock:/var/run/docker.sock  gitlab/gitlab-runner:latest  

    映射/var/run/docker.sock这个文件是为了让容器可以通过/var/run/docker.sockDocker守护进程通信,管理其他Docker容器,因为docker daemon进程默认监听的是/var/run/docker.sock这个文件,所以docker客户端只要把请求命令发往这里,daemon就能收到并且做出响应。这个命令将外部docker客户端的/var/run/docker.sock映射给了内部docker客户端,使内部docker客户端也可以访问外部的docker daemon服务。否则后面注册如果选择了docker作为执行器时,因为是docker-in-docker模式,内部的docker将无法启动。

      -v D:/docker/gitlab/gitlab-runner/config:/etc/gitlab-runner 是将runner的配置文件映射到宿主机/home/gitlab-runner/config方便调整和查看配置

    安装完成我们需要去注册Gitlab-Runner。

    2. 将gitlab项目或组注册到gitlab-runner

    打开gitlab后台某个项目里面的设置,打开runner,获取配置信息

      开始注册runner
    #首先进入runner容器
    docker exec -it gitlab-runner bash
    
    #开始注册
    gitlab-runner register -n  --url https://gitlab.com/  --registration-token REGISTRATION_TOKEN  --executor docker   --description "My Docker Runner"  --docker-image "docker:19.03.12"  --docker-privileged   --docker-volumes "/certs/client"
    
    #url:后台设置里面的url
    #token:后台设置里面的token
    #executer:使用docker
    #docker-image:docker镜像,一定要使用19.03.12的版本
    

      执行成功后,查看一下生成出来的配置文件,在目录  D:/docker/gitlab/gitlab-runner/config 下的config.toml

    concurrent = 1
    check_interval = 0
    
    [session_server]
      session_timeout = 1800
    
    [[runners]]
      name = "d25fbd515fd7"
      url = "http://192.168.1.106/"
      token = "osaKgBGS7yausc5t4KTg"
      executor = "docker"
      [runners.custom_build_dir]
      [runners.cache]
        [runners.cache.s3]
        [runners.cache.gcs]
        [runners.cache.azure]
      [runners.docker]
        tls_verify = false
        image = "docker:19.03.12"
        privileged = true
        disable_entrypoint_overwrite = false
        oom_kill_disable = false
        disable_cache = false
        volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache","/certs/client"]
        shm_size = 0
       pull_policy="if-not-present"  #选择优先使用本地缓存的镜像还是拉取最新的镜像,官方有比较详细的解释。默认为always,在断网或者想要加快ci执行的速度时貌似可以设置if-not-present。
    

      上面配置完成之后,打开后台设置CI/CD就可以看见一个可用的runner了

     三、在项目根目录创建一个runner执行文件

    配置好runner后,我们把这个项目使用git拉下来本地,然后在项目根目录创建两个文件,一个是  【.gitlab-ci.yml】,一个是【Dockerfile】

    .gitlab-ci.yml

    打包运行一个go语言的项目
    image: golang:1.18.1
    
    stages: # 分段
      - build
      - deploy
    
    cache: # 缓存
      paths:
        - dist
    
    variables:
      DOCKER_TLS_CERTDIR: "/certs"
      
    
    job_build:
      tags:
        - go
      stage: build
      script:
        - go env -w GOPROXY=https://goproxy.cn,direct
        - go build -o dist/main
        - ls -l
        - pwd
    
    job_deploy:
      tags:
        - go
      image: docker:19.03.12
      only:
        - develop 
      services:
        - docker:19.03.12-dind
      stage: deploy
      script:
        - docker build -t goproject .
        - if [ $(docker ps -aq --filter name=goapp) ]; then docker rm -f goapp;fi   #如果存在运行的容器则删除重建
        - docker run -e TZ="Asia/Shanghai" -d -p 980:80 --name goapp goproject
    打包运行一个node项目
    image: node:16.14
    
    stages: # 分段
      - install
      - build
      - deploy
    
    cache: # 缓存
      paths:
        - node_modules
        - dist
    
    variables:
      DOCKER_TLS_CERTDIR: "/certs"
      
    
    job_install:
      tags:
        - web
      stage: install
      script:
        - npm install vue --save
        - npm install vue-router
        - npm install
    
    job_build:
      tags:
        - web
      stage: build
      script:
        - npm install vue --save
        - npm install vue-router
        - npm run build
    
    job_deploy:
      tags:
        - web 
      image: docker:19.03.12
      only:
        - develop 
      services:
        - docker:19.03.12-dind
      stage: deploy
      environment:
        name: web_test
        url: http://192.168.1.106:8080/
      script:
        - docker build -t appimages .
        - if [ $(docker ps -aq --filter name=app-container) ]; then docker rm -f app-container;fi
        - docker run -d -p 8880:80 -p 8080:8080 --name app-container appimages
    参数说明  
    stages
      例子中 stages 值为一个数组(p.s. 用 - 代表数组和 markdown 类似)。包含了三个 job,test, build, deploy分别实现自动测试,打包项目和部署。下方的 stage 必须在全局定义的 stages 内。
    variables
      值为键值对象,为了后续的流程,此处定义了开发项目和部署项目的 namespace 和 repo_name。同 shell 类似,后续使用其值需要加上 $ 符号。定义的变量也有对应的作用域,定义在顶层就可以作为全局变量供所有 job 使用,如果是一些 job 特有的变量,就定义在 job 内部。
    before_script
      值为数组,每一个元素其实就是一个 linux 命令,写的时候装作自己在写 shell 就好。该部分主要生成了后续构建需要的镜像标签,切换当前目录等。为了 debug 方便,这些变量最好打印。类似的,如果在 job 完成后有一些时候操作,可以定义 after_script。需要注意的是如果定义在顶层,内部的命令会在每个 job 运行之前执行,如果某些 job 需要特别的预操作,可以在 job 内部再配置一个 before_script 对象,它会复写外部的全局预操作。
    test_stage
      名为 test 的 job 的具体配置,一般是个复合对象。
    cache
      保留上一阶段的文件数据 stage   job 对应的 stage,如果有多个 job 对应同一个 stage,在执行时会并行执行这些 job。 script   这个 job 执行的命令,此处是进入的项目仓库目录,并且执行了一个 shell 脚本,这个脚本定义了执行项目的所有单元测试。一般建议如果要执行的命令过多,就把这些命令写成脚本放在项目内。CICD 流程直接执行这个脚本。 build_stage   该步骤在测试通过的基础上,把项目编译打包,方便后续部署。 tag   用来选择该标签对应的注册runner的实例,可以在gitlab后台设置指定 only   only 指明了 job 的执行场景,可以是分支名,表明只有 master 分支可以执行 build,如果要用排除法反向指定,可以用 except。 

    Dockefile文件

    FROM golang:1.18.1  #拉取一个镜像
    EXPOSE 8080 80  #对外暴露端口
    WORKDIR /go/   #定义工作目录,没有则创建
    COPY . /go/    #复制文件
    COPY dist/main main   
    CMD ./main  容器启动后执行命令
    

      

    4、git commit、push 提交代码查看结果

     

    打开docker ps查看也会发现有一个容器在运行,后续每次提交都会自动构建发布,一个简单的CI/CD就完成了

  • 相关阅读:
    Golang :索引值对的数组
    MySql-BlackHole:黑洞引擎
    golang fmt 中的 Sprintf、Fprintf和 Printf函数
    golang 中的 rune 和 byte
    mysql 全文索引
    Python 原始字符串
    如何给博客园(或者CSDN)设置域名访问
    CPU、内存、磁盘三者的关系
    018.redis 阶段性总结:1T 以上海量数据+10 万以上 QPS 高并发+ 99.99% 高可用
    017.redis 在实践中的一些常见问题以及优化思路(包含 linux 内核参数优化)
  • 原文地址:https://www.cnblogs.com/pangxiaox/p/16224339.html
Copyright © 2020-2023  润新知