特性:

跨平台,支持大部分操作系统

基于脚本构建,支持所有语言

基于Pipeline连接不同阶段的工作流

支持docker

缺点:

将部署固化在.gitlab-ci文件中,部署环境需要稳定

Runner可访问所有发布机器,存在一定安全性问题

程序发布没有审计,在大公司存在权限管理问题

安装gitlab

version: '3.3'
services:
    gitlab:
      image: 'gitlab/gitlab-ce'
      restart: unless-stopped
      hostname: '${your_domain_name}'
      container_name: gitlab
      environment:
        TZ: 'Asia/Shanghai'
        GITLAB_OMNIBUS_CONFIG: |
          external_url 'http://gitlab.domain.com/'
          registry_external_url 'https://gitlab.domain.com'
          gitlab_rails['gitlab_shell_ssh_port'] = 1022
          gitlab_rails['time_zone'] = 'Asia/Shanghai'
          # gitlab_rails['smtp_enable'] = true
          # gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
          # gitlab_rails['smtp_port'] = 465
          # gitlab_rails['smtp_user_name'] = "xxxx@xx.com"
          # gitlab_rails['smtp_password'] = "password"
          # gitlab_rails['smtp_authentication'] = "login"
          # gitlab_rails['smtp_enable_starttls_auto'] = true
          # gitlab_rails['smtp_tls'] = true
          # gitlab_rails['gitlab_email_from'] = 'xxxx@xx.com'
      ports:
        - '1080:80'
        - '10443:443'
        - '1022:22'
      volumes:
        - ./data:/var/opt/gitlab
        - ./config:/etc/gitlab
        - ./logs:/var/log/gitlab

运行

docker-compose up -d

启动容器。启动后,通过域名或者ip访问。

然后,设置root密码,记住此密码。

通过root用户登陆,进入Admin Area/Sign up 关闭注册功能

添加新用户,并设置为管理员账户

退出后以新用户登陆,配置SSH key,过程和配置github一致。配置后,即可通过ssh连接1022端口。

新建一个项目仓库,通过git进行初始化。

安装gitlab-runner

version: '3'
services:
    runner:
      image: 'gitlab/gitlab-runner:v11.4.2'
      container_name: gitlab-runner
      restart: always
	  #networks: 如果有配置gitlab的网络,则此处应保持一致,否则为default
      network_mode: bridge
      volumes: 
        - ./config:/etc/gitlab-runner
        - /var/run/docker.sock:/var/run/docker.sock
networks:
  default:
    external: 
	  name: bridge
	  

运行```docker exec -it gitlab-runner gitlab-runner register

按照gitlab的项目/Setting/CICD/Runner的提示,设置要注册的gitlab的url,token, runner的描述,标签,并选择不锁定到当前项目,选择docker作为执行器,选择默认docker镜像 docker:stable

此时在gitlab的项目/Setting/CICD/Runner下方可以看到runner的信息,同时在github-runner/config文件夹下生成了配置文件,内容如下:

concurrent = 1
check_interval = 0

[[runners]]
  name = "test"
  url = "http://192.168.1.157/"
  token = "69c0ff735a76c0bb3cce977a361661"#这个token是gitlab-runner根据第三步骤的token生成的
  executor = "docker"
  [runners.docker]
    extra_hosts = ["gitlab.domain.com:192.168.1.157"] #如果在执行上面步骤中碰到连接不上gitlab,是因为gitlab-runner在docker内部解析不了gitlab.domain.com,通过添加配置这个可以解决问题
    tls_verify = false
    image = "docker:stable" #这里之所以这样是因为基于这个镜像它包含了docker等工具,可以在gitlab-runner执行的.gitlab-ci.yml中有docker指令时而无需再安装docker 参考地址:https://docs.gitlab.com/ee/ci/docker/using_docker_build.html
    privileged = false #使用docker-in-docker时通常为true
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
    shm_size = 0
   [runners.cache]

配置项目自动化

在项目根目录下添加.gitlab-ci.yml文件,此文件的语义详见官网文档

before_script:
  - apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs
  - ruby -v
  - which ruby
  - gem install bundler --no-ri --no-rdoc
  - bundle install --jobs $(nproc)  "${FLAGS[@]}"

rspec:
  script:
    - bundle exec rspec

rubocop:
  script:
    - bundle exec rubocop

push项目代码到仓库时,即触发自动流程,也叫做pipeline。pipeline是由不同的jobs构成的流程,为YAML文件,需要格外注意缩进,使用空格,而不是tabs. .gitlab-ci.yaml受版本控制,在不同的分支,可以有不同的流程。

上面的文件是一个Ruby on Rails项目示例。定义了两个jobs: rspec, rubocop ; 在每个jobs之前,执行before_script.  每个jobs包含如何运行和何时运行的定义,包括一个名字作为顶级元素,包含script关键字。每个jobs独立运行。