基于云端的持续集成实践

前言

为了达到产品快速交互,缩短产品开发周期,我们引入了持续集成,现持续集成有两种方案

  • 方案一.
    aliyun代码管理,阿里云做镜像管理,并且使用阿里云做自动部署
    1.使用aliyun的代码管理
    2.使用阿里云的镜像管理
    3.阿里云自动部署
  • 方案二.
    使用gitlab做代码管理,jenkins做测试与镜像构建,aliyun做镜像管理,并采用阿里云自动部署
    1.使用aliyun的代码管理
    2.jenkins做自动哈测试,与镜像构建
    3.aliyun做镜像管理
    4.采用aliyun自动部署
    我们根据情况,选择了第二种方案。

拓扑图

网络图谱图

流程图

流程图

工具

代码管理

由于现在国内的好多的代码管理平台,是基于gitlab进行修改的,并且对gitlab的功能进行了阉割,对jenkins的支持也不是很好,所以我选择gitlab作为代码管理工具
使用方法与本地的gitlab相近
这里需要注意的是通过github联合登录后,需要重新设置访问的密码,linux的用户可以不重新设定,这里主要是通过开发工具clone项目的时候,windows操作系统需要输入用户名与密码

jenkins

jenkins现在没有网络版本的,所以我们现在需要自己搭建jenkins,jenkins功能,进行持续集成

镜像管理

由于我们整个是采用docker进行构建与部署,所以我们采用aliyun自带的私有镜像管理,对于私有镜像,阿里云有个数限制,限制数量为3个。

自动部署

自动部署,采用的是aliyun的容器服务,采用集群与docker.

配置

gitlab配置

新建项目(略)

  • jenkins-ci 设置
    这里的用户名与密码是有构建与读权限的用户
  • 设置发布key

jenkins配置

  • jenkins 安装

    1
    2
    3
    4
    wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
    sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
    sudo apt-get update
    sudo apt-get install jenkins
  • 安装nginx
    sudo aptitude -y install nginx

  • 配置nginx

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    upstream app_server {
    server 127.0.0.1:8080 fail_timeout=0;
    }
    server {
    listen 80;
    listen [::]:80 default ipv6only=on;
    server_name ci.kopbit.com;
    ignore_invalid_headers off;
    location / {
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect off;
    proxy_pass http://app_server;
    }
    }
  • jenkins 配置
    jenkins 基础设置
    这里的配置,涉及到权限与初始化,在初始化,需要
    安装必要插件git,git-client,gitlab-client
    gitlab-client插件设置
    这里需要注意的是,要在gitlab中获取api token
    gitlab配置
    Gitlab Notifier Configuration
    gitlab notifier configuration
    在访问控制中,消炎药进行项目矩阵授权
    项目举证授权
    jenkins 项目设置
    常规设置

    源代码管理配置
    在源代码管理中,生成的key必须在jenkins目录下的.ssh目录

    1
    2
    3
    4
    5
    6
    root@iZu1bcv8djtZ:~# ^C
    root@iZu1bcv8djtZ:~# su jenkins
    jenkins@iZu1bcv8djtZ:/root$ cd ~
    jenkins@iZu1bcv8djtZ:~$ ls .ssh/
    id_rsa id_rsa.pub known_hosts
    jenkins@iZu1bcv8djtZ:~$

生成key的命令

1
ssh-keygen -C "park@kopbit.com"

然后将此key设置到gitlab中。

触发器设置

  • 设置域名
    在阿里云的域名管理中,添加域名 ci.abc.com

docker 配置

  • docker安装
  • docker配置
    安装docker,并且加入docker的启动参数,修改路径/etc/default/docker
    1
    DOCKER_OPTS=' --host=unix:///var/run/docker.sock --restart=false -g /opt/app/jenkins/docker -G jenkins'

重新启动docker
service docker restart

aliyun镜像服务配置

  • 新建镜像
    镜像服务访问地址:
    https://cr.console.aliyun.com/?spm=5176.1971733.0.2.cnJySP#/docker/image/list
    初次进来的时候,需要修改仓库的密码
    点击创建按钮
    创建镜像
    必填项
    1> 镜像名称
    2> 摘要
    3> 仓库类型为私有

aliyun集群服务配置

  • 新建集群
    在管理控制台,点击产品与服务,在弹性计算中,点击容器服务,点击左侧的集群
    创建集群
    这里需要注意有两个方面
    (1) 需要选择自动穿件负载均衡
    (2) 集群所在地与添加的实例必须在同一个地域
  • 添加实例
    在集群列表中,对应的集群行,选择更多操作,执行添加已有实例
    选中实例,点击下一步,这里需要执行相关的脚本,并且安装docker
    1
    curl -Ls http://aliyuncontainerservice.oss-cn-hangzhou.aliyuncs.com/1.11/attachNodeScript | sudo -H bash -s 1367f76c5fb2028ee56a1f64454f1f46f5974368 --instance-id i-94o82v9bt

没添加一个实例的脚本都不一样,请仔细辨认。

选择服务,就可以看见相关的服务列表
这些都是系统的服务
系统服务

  • 创建应用
    创建应用前,需要准备编排模板
    编排模板脚本
    1
    2
    3
    4
    5
    6
    7
    web:
    image: 'registry.aliyuncs.com/stephen/kop-onteditor-ui'
    ports:
    - "58200:80"
    - "58222:22"
    volumes:
    - /etc/localtime:/etc/localtime:ro

使用编排模板创建应用
创建应用
选择上面准备的模板
模板
点击创建并且部署,我们在应用列表可参看相关应用

  • 设置域名
    选择服务,并变更配置,在web路由规则中添加端口与域名

脚本准备

autologin.sh 自动登录脚本

1
2
3
4
5
6
7
8
#!/usr/bin/expect
spawn docker login --username=demo@kopbit.com registry.aliyuncs.com
expect "Password:"
send "1231321\r"
expect "Email:"
send "demo@kopbit.com\r"
expect eof
exit

autlogout.sh 自动登出脚本

1
2
#!/usr/bin/env bash
docker logout registry.aliyuncs.com

测试

访问http://web1.abc.com

结论

可以满足自动构建,自动发布的需求
缺点:

  1. 就是太慢了,jenkins的效率要提高。
关注链智思维导图,最新文章主动推送
关注链智思维导图(linqmind)