Gitlab-CI 手动搭建、实战体验

℡╲_俬逩灬. 提交于 2020-01-06 14:00:50

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

开源代码托管平台 Gitlab ,从10.0版本开始内置了 CI 功能,开始向 Jenkins看齐。
那么看过了那么多 Gitlab 相关的文章,是时候动手体验它了。
好,咱们从零开始、探其本质之旅……

概述

本篇文章介绍使用Docker快速搭建Gitlab环境,用于安全的学习它的功能。

最大的特点是:快速搭建、最少资源。若在生产上使用,需要更多考虑 可维护性、高可用、数据安全 等因素。

环境

# uname -a
Linux 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u3 (2015-08-04) x86_64 GNU/Linux
 
# cat /etc/docker/daemon.json # 使用国内DaoCloud加速Docker镜像下载的加速
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
 
# docker info
Containers: 3
 Running: 3
 Paused: 0
 Stopped: 0
Images: 10
Server Version: 18.06.3-ce
Storage Driver: aufs
 Root Dir: /mnt/docker/aufs
 Backing Filesystem: xfs
 Dirs: 92
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 468a545b9edcd5932818eb9de8e72413e616e86e
runc version: a592beb5bc4c4092b1b1bac971afed27687340c5
init version: fec3683
Kernel Version: 3.16.0-4-amd64
Operating System: Debian GNU/Linux 8 (jessie)
OSType: linux
Architecture: x86_64
CPUs: 32
Total Memory: 125.8GiB
Name: cn.bilibil.ep
ID: Q5K6:UMW2:ZRVQ:U7GS:Z5EU:5CJF:QA7X:ESRA:U3IG:CCFM:VW36:HMEV
Docker Root Dir: /mnt/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Registry Mirrors:
 http://f1361db2.m.daocloud.io/
Live Restore Enabled: false

安装过程

写在前面

# 本文涉及的常用命令解释
docker -h # 显示命令参考
docker ps # 查看当前运行状态的容器列表
docker ps -a # 查看本地所有容器列表
docker logs ${容器名/容器ID} # 查看容器终端的最新日志
docker logs -f ${容器名/容器ID} # 滚动查看容器的终端日志,Ctrl + C 结束
docker exec -it ${容器名/容器ID} ${终端命令} # 登录容器并执行对应的命令,比如执行 bash 就相当于登录
docker {start,stop,restart} ${容器名/容器ID} # 容器启停

拉取镜像

# 拉取Gitlab社区版的Docker官方镜像最新版
docker pull gitlab/gitlab-ce:latest
 
# 拉取Gitlab-Runner官方镜像最新版
docker pull gitlab/gitlab-runner:latest

创建实例

# 使用本地的Gitlab镜像跑起一套实例(过程需要几分钟时间,完成后访问7780端口、首次登录要设置内置管理员密码)
docker run -d --name gitlab \
--publish 7443:443 \
--publish 7780:80 \
--publish 7722:22 \
--volume /mnt/share/gitlab/config:/etc/gitlab \
--volume /mnt/share/gitlab/logs:/var/log/gitlab \
--volume /mnt/share/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce
 
# 使用本地Gitlab-Runner镜像跑起一套实例
docker run -d --name gitlab-runner \
--volume /mnt/share/gitlab/runner-config:/etc/gitlab-runner \
--volume /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner

配置、验证

连接Gitlab和Runner

  1. 新建一个Gitlab项目,在项目设置的CI/CD配置里有详细的操作说明
    Runner配置
  2. 按照如上说明在配置Gitlab-Runner
# 如下录入 Gitlab 中显示的信息:
docker exec -it gitlab-runner gitlab-runner register
 
# 查看最终效果,显示已配置的 Runner 列表(1个节点可以配置多个Runner)
docker exec -it gitlab-runner gitlab-runner list

验证结果

  • 示例项目
// 仅有的主程序文件: http-server.go
package main

import (
    "fmt"
    "net/http"
)

func pong(w http.ResponseWriter, req *http.Request) {

    fmt.Fprintf(w, "Pong.")
}

func headers(w http.ResponseWriter, req *http.Request) {

    for name, headers := range req.Header {
        for _, h := range headers {
            fmt.Fprintf(w, "%v: %v\n", name, h)
        }
    }
}

func main() {

    http.HandleFunc("/", headers)
    http.HandleFunc("/ping", pong)

    http.ListenAndServe("0.0.0.0:9080", nil)
}
  • 按模板创建 CI 规则文件: .gitlab-ci.yml
image: daocloud.io/library/golang

variables:
  REPO_NAME: simplehttpserver
  BIN_NAME: goweb


before_script:
  - mkdir -p $GOPATH/src/$(dirname $REPO_NAME)
  - ln -svf $CI_PROJECT_DIR $GOPATH/src/$REPO_NAME
  - cd $GOPATH/src/$REPO_NAME

stages:
  - test
  - build
  - deploy

format:
  stage: test
  script:
    - go fmt $(go list ./... | grep -v /vendor/)
    - go vet $(go list ./... | grep -v /vendor/)
    - go test -race $(go list ./... | grep -v /vendor/)

compile:
  stage: build
  script:
    - go build -race -ldflags "-extldflags '-static'" -o $CI_PROJECT_DIR/$BIN_NAME
  artifacts:
    paths:
      - $BIN_NAME
  • 提交一次到主干,触发自动构建
    自动构建

常见错误

  • Gitlab-Runner终端提示ERROR: Checking for jobs... forbidden runner=xxxxxx是Runner在向Gitlab探活时,收到 http/403 的提示伴随错误信息ERROR: Runner http://gitlab.local.domain:xx/xxxxxx is not healthy, but will be checked!可能性:Runner的令牌配置错误、配置文件中有多余的Runner节点配置
    探活失败
  • Runner在线,但CI过程提示无可用Runner。Gitlab默认配置Runner只允许运行有Tag的分支,可以打Tag或允许无Tag
    Runner配置
  • 任务执行失败ERROR: Job failed (system failure): Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
    任务执行失败
  • 流水线执行失败,日志显示连接Gitlab失败。
    流水线执行失败
    需要在Gitlab-Runner的配置文件 config.toml 中增加 Gitlab 服务器对应的 hosts 配置 [[runners]] – [[runners.docker]] – “extra_hosts = ["14b7fab494f8:172.16.0.86"]
    定制Gitlab端口
    在Gitlab的主配置文件中显式申明external_url 'http://172.16.0.86:7780'为自身的IP和端口(注意:如果端口非80,需要保留此配置并删除Gitlab的容器再重开实例才能生效)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!