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就完成了

posted @ 2022-05-05 12:49  wcu1117  阅读(1119)  评论(0编辑  收藏  举报