搭建环境是 Centos 7.2,本地测试是本身搭建的虚拟机,测试环境是阿里云ECS的Centos 7.2python
yum默认带有的docker版本比较低,我通常都是会安装更新版本的dockerlinux
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
复制代码
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce
复制代码
systemctl enable docker
systemctl daemon-reload
systemctl start docker
复制代码
docker --version
Docker version 18.09.6, build 481bc77156
复制代码
docker-compose是一个python编写的docker编排工具,后面的启动服务都是以docker-compose来启动,这样就不须要每次都手动输入docker启动命令的各项配置参数,简化操做,最后也能够吧gitlab,jenkins等关联的服务编写在同一个 docker-compose 脚本中,方便一块儿管理nginx
咱们部署环境有python3环境,因此直接使用pip3安装docker-composegit
sudo pip3 install docker-compose
复制代码
首先在工做目录下,建立一个docker-compose的脚本,docker
# /data/gitlab 是自定义映射gitlab存放配置参数及数据的目录,能够修改为本身须要的目录
cat > docker-compose.yml << EOF
version: '2'
services:
jenkins:
image: gitlab/gitlab-ce:12.0.3-ce.0
container_name: gitlab
ports:
- "9022:9022"
- "9080:80"
volumes:
- "/data/gitlab/cfg:/etc/gitlab"
- "/data/gitlab/logs:/var/log/gitlab"
- "/data/gitlab/data:/var/opt/gitlab"
restart: always
EOF
# 后台启动服务,第一次或自动pull镜像,添加 -d 表示后台启动
docker-compose up -d
复制代码
gitlab会监听22端口(ssh链接),80端口(http)及443端口(https),咱们gitlab前面加上一个haproxy作反向代理,haproxy监听443端口代理到9443端口,docker不开80端口所有都走9443端口(映射至433端口)shell
使用vim编辑gitlab的配置文件,gitlab的配置文件默认为 /data/gitlab/cfg/gitlab.rb ,前面的目录就是docker中配置的映射目录vim
docker container exec -it gitlab bash
vim /etc/gitlab/cfg/gitlab.rb
# 如下为gitlab的配置项
# 配置 gitlab 显示 url 的内容,external_url配置为https的连接时,gitlab会自动建立监听443端口的nginx配置,证书须要放置在 /etc/gitlab/ssl 目录下,而且文件名为配置的域名.crt
# 例如配置域名为 https://git.xxx.com,则须要证书文件为 git.xxx.com.crt 及 git.xxx.com.key
external_url 'https://git.xxx.com'
# 配置邮箱信息
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'no-reply@xxx.com'
gitlab_rails['gitlab_email_display_name'] = 'gitlab'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "hwsmtp.xxx.com"
gitlab_rails['smtp_port'] = 994
gitlab_rails['smtp_user_name'] = "no-reply@xxx.com"
gitlab_rails['smtp_password'] = "xxx"
gitlab_rails['smtp_domain'] = "qiye.xxx.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
# 配置完成后输入一下命令从新配置gitlab
sudo gitlab-ctl reconfigure
复制代码
gitlab正常使用能够参考网上其余的资料,主要是用户,组及项目的建立centos
# /data/jenkins 是自定义映射jenkins存放数据的目录,能够修改为本身须要的目录,docker的映射是为了让jenkins能使用宿主环境下的docker
cat > docker-compose.yml << EOF
version: '2'
services:
jenkins:
image: jenkins/jenkins:lts
user: root
container_name: jenkins
ports:
- "8002:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "/data/jenkins:/var/jenkins_home"
- "/usr/bin/docker:/usr/bin/docker"
restart: always
EOF
# 后台启动服务,第一次或自动pull镜像,添加 -d 表示后台启动,能够添加这个参数用于后台启动
docker-compose up
复制代码
当 jenkins 正常运行时,启动日志中会有第一次登录须要的管理员密码,以下:bash
拷贝此密码,而后登录主机地址:8002访问,会进入jenkins初始化页面,输入刚才拷贝的密码,而后进入引导页面,根据引导安装推荐的插件app
完成插件以后能够添加一个管理员帐号,添加完毕后会进入jenkins的主页
在 系统管理 > 插件管理 > 可选插件中搜索并安装gitlab,docker相关插件
须要再gitlab中添加一个测试项目,而且该项目须要有dockerfile脚本,咱们测试主要流程是gitlab push tag,而后 jenkins 触发构建开始自动部署,项目部署以docker镜像生成及部署的方式实现
# 生成密钥对, 输入后一路回车,默认保存密钥在 ~/.ssh 目录下, id_rsa(私钥)及id_rsa.pub(公钥)
ssh-keygen -o -t rsa -b 4096 -C "email@example.com"
复制代码
拷贝 公钥信息,在gitlab > 用户设置 > SSH密钥 > 添加一个SSH密钥
在jenkins中添加一个任务
任务中须要配置源码信息,这里使用gitlab托管代码,因此须要gitlab仓库的地址,用户须要对仓库具备相应的权限,这里由于还没配置gitlab用户信息,因此提示没法读取仓库源码
点击 Credentials 后面的添加按钮能够添加证书信息,类型选择 SSH username with private key,而后添加以前生成密钥的私钥,再点击添加完成录入
而后在在源码管理中选择刚刚添加的认证信息,添加没问题则红色的出错信息将会消失
在构建中增长一个构建步骤,即将代码构建 docker 镜像
完成后点击保存完成任务的添加,而后再首页点击构建按钮查看构建效果,第一次会触发docker 下载相应的未下载的镜像,可能会比较慢,以后能够看到任务构建成功,查看控制台输出能够看到构建时shell的输出日志,至此任务的构建已经没有问题,接下去要实现 gitlab push 自动触发构建
在 jenkins 任务的构建触发器中开启 push event 的触发器,而后在高级中点击生成生成一个回调地址的 Secret token,而后保存
在 gitlab 项目 > 设置 > 集成 中将 Jenkins 及 生成的 token配置到gitlab 中,事件选择 tag push
而后建立一个标签,jenkins 收到回调会自动构建,在首页能查询构建的历史记录
能接受 tag 推送回调以后,须要修改构建的shell脚本
# 定义变量,CONTAINER_NAME 是项目名称,对应阿里云镜像服务中的仓库名称,GIT_TAG 变量是自动获取本地git版本的tag
CONTAINER_NAME="citest"
GIT_TAG=`git describe --always --tag`
CONTAINER_FULL_NAME=${CONTAINER_NAME}-${GIT_TAG}
REPOSITORY=registry.cn-shanghai.aliyuncs.com/xxx/${CONTAINER_NAME}:${GIT_TAG}
# 构建Docker镜像
docker build -t $REPOSITORY -f Dockerfile .
# 推送Docker镜像,username 跟 password 为 阿里云容器镜像服务的帐号密码
docker login --username=xxxxx --password=xxxxxx registry.cn-shanghai.aliyuncs.com
docker push $REPOSITORY
# 删除生成的image
docker images | grep citest | awk '{print $1":"$2}' | xargs docker rmi
# 删除名称或标签为none的镜像
docker rmi -f `docker images | grep '<none>' | awk '{print $3}'`
复制代码
修改至这个版本,能够在gitlab中建立一个tag,而后gitlab会回调至jenkins,而后jenkins开始构建并将生成的镜像推送至阿里云registry中并清理现场
目前已经完成了 gitlab ——— jenkins ——— DockerRegistry 的镜像发布,后续会继续实现 jenkins 将发布的镜像分发到每一个机器并部署的功能