gitlab+drone1.0+sonarqube6.7.5+rancher+harbor实现CI-CD

CI-CD搭建全流程

gitlab本地搭建流程

### centos
1.安装openssh及客户端,postfix服务器和lokkit命令
  sudo yum install -y curl policycoreutils-python openssh-server openssh-clients postfix cronie lokkit
2. 启动postfix邮件服务器和sshd,并设置为开机自动启动
  sudo systemctl enable sshd
  sudo systemctl start sshd
  sudo systemctl enable postfix
  sudo systemctl start postfix
  sudo chkconfig postfix on
3.使用lokkit命令设置防火墙,打开http和ssh的访问权限
  sudo lokkit -s http -s ssh
4. 添加gitlab镜像
  wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-10.0.0-       ce.0.el7.x86_64.rpm
##4.获取Gitlab源
  ##curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-             ce/script.rpm.sh | sudo bash
5.下载安装gitlab
  rpm -i gitlab-ce-10.0.0-ce.0.el7.x86_64.rpm
6.初始化配置
  sudo vim /etc/gitlab/gitlab.rb
  6.1.配置external_url
    external_url 'http://192.168.206.130/' # 将url换成本机ip,为gitlab对外提供的访问链接,也可以是域名。
  6.2.修改gitlab服务端口
   unicorn['port'] = 8081 # 将Unicorn打开并将默认端口从8080改为8081避免端口冲突,如本机没有使用8080端口,则可不改。
  6.3.重载配置
    sudo gitlab-ctl reconfigure
7.首次登录为root设置初始密码,配置邮箱,配置邮箱需要开启该邮箱的smtp授权,并记录授权码,否则会无法接收到gitlab发   送的邮件。
8.修改gitlab.rb
  ## GitLab email server settings
  ###! Docs: https://docs.gitlab.com/omnibus/settings/smtp.html
  ###! **Use smtp instead of sendmail/postfix.**
  gitlab_rails['smtp_enable'] = true
  gitlab_rails['smtp_address'] = "smtp.qq.com"
  gitlab_rails['smtp_port'] = 465
  gitlab_rails['smtp_user_name'] = "[email protected]" # 接收邮箱
  gitlab_rails['smtp_password'] = "zobvwuxginehbeda" # 授权码
  gitlab_rails['smtp_domain'] = "smtp.qq.com"
  gitlab_rails['smtp_authentication'] = "login"
  gitlab_rails['smtp_enable_starttls_auto'] = true
  gitlab_rails['smtp_tls'] = true
  gitlab_rails['gitlab_email_from'] = '[email protected]' # 此行必须新增
  然后 sudo gitlab-ctl reconfigure  重载配置
  然后在gitlab上选择settings 将其默认邮箱改为配置邮箱,发送邮件,并在配置邮箱中确认邮件信息,就会更新邮箱配置。   后续用管理员添加新用户并登陆。
9.配置git存储仓库目录及进行数据仓库迁移
  sudo vim /etc/gitlab/gitlab.rb
  配置git存储仓库:
  git_data_dirs({
    "default" => { "path" => "/home/gitlab/git-data" }
  })
  gitlab数据仓库迁移:
  sudo gitlab-ctl stop
  sudo rsync -av /var/opt/gitlab/git-data/repositories /home/gitlab/git-data/
  sudo gitlab-ctl upgrade # 组件版本更新(可选)
  sudo ls /home/gitlab/git-data/
  sudo gitlab-ctl start
  sudo gitlab-ctl reconfigure
### ubuntu
安装依赖
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates
sudo apt-get install -y postfix
信任Gitlab的GPG公钥
curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null  
配置镜像路径加速(清华镜像)
sudo vim /etc/apt/sources.list.d/gitlab-ce.list
到此路径:https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/ # 寻找对于你系统版本的镜像
Ubuntu18.4: deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu bionic main # 将其写入 gitlab-ce.list
安装gitlab-ce
sudo apt-get update
sudo apt-get install gitlab-ce
执行配置
sudo gitlab-ctl reconfigure
启动gitlab
sudo gitlab-ctl start
后续配置的更改和centos基本没差别
只是更改unicorn的时候连带更改
unicorn['listen'] = '127.0.0.1'
unicorn['port'] = 8081

gitlab集成drone

1.登入gitlab,选择settings,application。新建一个new application,注意 Redirect URL(回调地址) 这与使用drone   的版本有关,
  drone 0.x  url 应如 http://ip or 域名/authorize
  drone 1.x  url 应如 http://ip or 域名/login
  记录application ID 和 Secret
2.build主机(启动drone) 
  2.1 安装docker和docker-compose (网上找教程,很简单)
  2.2 通过docker-compose来启动drone,注意drone不单单需要启动drone-server还有drone-agent/drone-runner
      创建docker-compose.yml
# ip:xxxxxxxx ci-build
### docker-compose.yml
version: "2.1"

services:

  drone-server:
    image: drone/drone:1
    ports:
      - 443:443
      - 80:80
    volumes:
      - /var/lib/drone:/data
    restart: always
    environment:
      - DRONE_AGENTS_ENABLED=true
      - DRONE_LOGS_DEBUG=true
      - DRONE_GIT_ALWAYS_AUTH=false
      - DRONE_GITLAB_SERVER=http://192.168.206.130/ # gitlab服务器地址
      - DRONE_GITLAB_CLIENT_ID=  # application ID
      - DRONE_GITLAB_CLIENT_SECRET= # Secret
      - DRONE_RPC_SECRET=e349d16fa70e27bdd1043c1ec3d83478 # 为server和agent设置一个统一识别码 随便输,但必须前后一致
      - DRONE_USER_CREATE=username:tklin,admin:true # 为drone的settings添加Trued username是gitlab用户名 admin默认为true
      - DRONE_RUNNER_CAPACITY=3
      - DRONE_SERVER_HOST=ip  # drone服务器地址
      - DRONE_SERVER_PROTO=http
      - DRONE_TLS_AUTOCERT=false
    networks:
      - ci_net


  drone-agent:
    image: drone/drone-runner-docker:1
    restart: always
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:rw
    environment:
      - DRONE_RPC_PROTO=http
      - DRONE_RPC_HOST=ip # 服务器地址
      - DRONE_RPC_SECRET=e349d16fa70e27bdd1043c1ec3d83478
      - DRONE_RUNNER_CAPACITY=3
      - DRONE_RUNNER_NAME=ip # runner名字 默认为服务器ip 
      - DRONE_LOGS_TRACE=true
    networks:
      - ci_net

networks:
  ci_net:

自搭建的gitlab需要在root登录的情况下到Admin Area -- Settings下 找到OutBound Request 勾选上Allow Requests To The Local Network From Hooks And Services,否则drone会因为权限问题,找不到gitlab的储存库。
### ubuntu配置免密
1.查看是否存在id_rsa.pub或id_dsa.pub,如果存在就跳过第二步
cd ~/.ssh
ls
2.创建一个ssh-key,连续enter,就会在~/.ssh下创建id_rsa.pub等文件
ssh-keygen -t rsa -C "邮箱"
3.添加ssh-key到gitlab
拷贝id_rsa.pub中的内容到gitlab配置ssh的地方,保存。
4.测试
ssh -T git@gitlab_ip
出现Are you sure you want to continue connecting (yes/no)? 输入yes
如果前面配置了密码,接下来就会输入密码,没有配置就不用输入,会出现welcome to gitlab 表明配置成功。

drone调用sonarqube执行代码扫描

### docker搭建本地sonarqube服务器
1. 配置数据库,注意sonarqube7.9以上不支持mysql数据库,并且sonarqube7.9以下对于mysql数据库版本要求在5.78.0之    间。
  1.1. 本地拉取mysql5.7镜像 
       docker pull mysql:5.7 
  1.2. 启动mysql镜像 
       docker run -p 3307:3306 --name mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v            $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 
  1.3. 进入启动的mysql container
       docker exec -it mysql(容器名) bash
  1.4. 创建sonar数据库和sonar用户
       mysql -u root -p  # 登陆mysql
       create database sonar # 创建sonar数据库
       CREATE USER 'sonar'@'%' IDENTIFIED WITH mysql_native_password BY 'sonar';
       GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'%'; # 添加远程登录用户
2. 启动sonar
   docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 --link=mysql:mysql -e 				    SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e                                    SONARQUBE_JDBC_URL="jdbc:mysql://ip:3307/sonar?                                                      useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=
   true&useConfigs=maxPerformance&useSSL=false" sonarqube:6.7.5
###.drone.yml 调用sonar-plugin进行代码扫描并发送报告到sonar-server
kind: pipeline
name: sonar

steps:
  name: code-analysis
  image: aosapps/drone-sonar-plugin:1.0
  settings:
    sonar_host: sonarqube服务器ip:port
    sonar_token: drone_secret # drone定制页面添加的sercet

drone+Dockerfile+harbor实现项目镜像的打包上传到私有镜像库

harbor搭建

# xxxxxxxx ci-data
1. 私有仓库harbor的搭建,harbor的搭建基于docker和docker-compose
  1.1.下载harbor离线安装包并解压
      wget https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.5.0.tgz
      tar xf harbor-online-installer-v1.5.0.tgz
  1.2.根据下载的harbor版本不同,解压后harbor文件夹下的文件也不相同,harbor1.x版本解压后会有harbor.cfg这个文         件,而harbor2.x版本解压后会有harbor.yml.tmpl这个文件,两个文件都是harbor的配置文件,不同的时,需要把2.x       版本中新建一个harbor.yml文件,并将harbor.yml.tmp1中的内容复制到harbor.yml中,不然后续启动harbor会因找       不到配置文件而出错。
  1.3.修改配置文件
      将harbor配置文件中hostname设置为访问地址,这个地址是作为外部访问仓库的唯一凭证,可以使用ip/域名,但不可         设置为127.0.0.1 && localhost,如果是harbor2.x版本,还需要将配置文件中 https related config 部分注释         掉,在未给harbor配置ssh证书的情况下。注意,2.x版本,harbor.yml harbor.yml.tmpl文件都需要修改。
      #### harbor.yml
      # https related config
      # https:
        # https port for harbor, default is 443
        # port: 443
  1.4.启动harbor,第一次启动harbor使用 sudo ./install.sh,这过程可能需要几分钟,需要拉取harbor所需的依赖镜像。
      启动成功后harbor文件夹下会多出docker-compose.yml文件,后续stop,restart,start都可以使用docker-             compose.yml文件来执行。
      注意:此时要先docker-compose stop   
      sudo vim docker-compose.yml 
      在ports处添加:- 443:443
                   - 8443:8443
      配置443端口和8443端口,不然本地是不能登录的。
  1.5.使用ip登陆harbor,账号admin,密码默认Harbor12345
  1.6.harbor客户端配置免https
      harbor客户端其实就是任何一个安装了docker的主机,及代表有能力将镜像传送到仓库。
      首先cd etc/docker, 查看该目录下是否有daemon.json文件,没有则创建(touch daemon.json)。
      sudo vim daemon.json
      添加:{ "insecure-registries":["harbor_server ip"] }
      sudo systemctl daemon-reload
      sudo systemctl restart docker
      测试:
            docker login docker_server_ip
            登陆成功则表示配置成功
  1.7.镜像上传到harbor
      docker pull nginx  # 从docker hub 拉取nginx镜像
      docker tag nginx:版本(latest) harbor_server_ip项目名称(library)/nginx:1.0  # 给镜像打标签
      docker push harbor_server_p/项目名称(library)/nginx:1.0
  1.8.从harbor拉取镜像
      docker rmi -f 镜像id  # 删除本地镜像
      docker pull harbor_server:ip/项目名称(library)/nginx:1.0(镜像名称及版本)

Dockerfile

### Dockerfile 这里是简单的go项目镜像打包
 FROM golang:1.10.2 # 基础镜像
 ADD . /go/src/drone-tklin # 复制文件到容器的指定目录
 WORKDIR /go/src/drone-tklin # 指定工作目录,并且会一直存在
 RUN go install drone-tklin # 执行创建镜像
 ENTRYPOINT ["golang","drone-tklin.dll"] # 运行程序
 EXPOSE 8080 # 映射端口

.drone.yml调用Dockerfile并将打包好的镜像上传到harbor

特别说明:在.drone.yml中在同一个kind:pipeline上 steps是依次执行,前一个错误会导致整个drone.yml结束。因此在对项目ci-cd的流程中,如果steps之间没有前后关系的限制,可以在drone.yml新建kind:pipeline,来达到并发运行的状态。
目录结构:
  /go
    /src
      /drone-tklin
        /Dockefile
        /.drone.yml
        /main.go
#### .drone.yml
kind:pipeline
name:default

steps:
- name: publish
  image: plugins/docker
  settings:
    dockerfile: ./Dockerfile.txt  # 执行Dockerfile打包镜像
    registry: harbor_server_ip  # 仓库地址
    repo: harbor_server_ip/项目名称/镜像名称  # 打包好的镜像的推送位置
    secrets: [drone_secret_name, drone_secret_password] # 这里是drone配置的secret,如果没配置也可以使用harbor的账号密码。建议使用drone—secret,可以避免私有仓库账号密码直接明文暴露。
    tags:
      - '1.0'  # 给打包的镜像贴标签,如果不指定默认为latest
    insecure: true # 免https
  volumes:
  - name: docker
    path: /var/run/docker.sock
volumes:
- name: docker
  host:
    path: /var/run/docker.sock

rancher搭建及集成harbor

### rancher配置
# xxxxxxxxx ci-deploy
环境要求: linux主机,内核高于3.10,主机内存不低于1GB,rancher不支持Docker for Windows及 Docker for Mac
rancher服务器是个docker image 因此rancher本身不需要安装,只需要执行docker命令下载并且成功运行docker服务器镜像
启动 rancher 
# 单机模式(测试环境)
docker run -d --restart=always -p 8080:8080 rancher/server  # 单机模式 仅仅适用于测试环境,生产使用rancher,需挂载外置数据库(mysql)或者将数据挂载到宿主机上。使用数据库,还需要对数据库做性能优化,保证rancher运行的最佳性能。
登陆rancher
http://ip:port
初次登陆需配置访问控制。
注册url(提供访问-ui界面): 初次登陆ui界面提示-注册url(这个url是rancher—server运行所在的url,并且此url能够被主机所访问)
添加主机:基础架构-主机-添加主机-Custom(默认)-在第四步输入主机ip-第五步会获得注册rancher脚本,复制到rancher主机并运行,主机注册成功后,点击关闭,就可以主机界面看到注册好的主机了。
### 集成harbor
基础架构-镜像库-添加镜像库-选择CuSTOM-私有仓库address(harbor_server_ip)
用户名和密码是harbor服务器的账号密码
添加服务 -- 选择镜像(harbor_server_ip/项目名称/镜像名:tag) -- 端口映射
访问rancher_ip:映射的端口号,如果可以访问成功,如镜像是nginx,则可以看到welcome to nginx 表示集成成功。
另外,尽量不要将rancher主机和rancher服务器架设在一台主机上,这样会导致rancher server出现问题

drone集成rancher

### .drone.yml
kind: pipeline
name: default

steps:
- name: rancher
  image: pelotech/drone-rancher
  settings:
    url: 'http://rancher_ip:port' # rancher访问地址
    access_key: user # rancher_api登录账号
    secret_key: password # rancher_api登录密码
    service: huh/service1 # rancher服务升级
    docker_image: huh/image # 用于升级环境的docker镜像

### 如何获取rancher_api的账号密码,注意 access_key和secret_key并不是登录rancher的账号密码。
### 获取途径如下:在ui界面中, API-密钥-添加账号API-Key-创建。然后就会得到只显示一次的api_key。

你可能感兴趣的:(个人技术分享,docker,ubuntu,运维,服务器,devops)