基于Git+Jenkins+Docker的CI/CD实现

文章目录

      • 一.What is CI/CD
      • 二. 环境准备
        • 1.搭建Gitlab私有仓库
        • 2.搭建harbor私有镜像仓库
        • 3.安装jenkins
      • 三.使用Jenkins实现CI/CD
      • 四. 测试CI/CD流程

一.What is CI/CD

基于Git+Jenkins+Docker的CI/CD实现_第1张图片
基于Git+Jenkins+Docker的CI/CD实现_第2张图片
基于Git+Jenkins+Docker的CI/CD实现_第3张图片

二. 环境准备

1.搭建Gitlab私有仓库

docker run -itd --name=gitlab -p 80:80 -v v1:/etc/gitlab -v v2:/var/opt/gitlab gitlab/gitlab-ce

等待几分钟后访问设置的端口,为root用户设置密码,之后便可以使用root用户登录.
基于Git+Jenkins+Docker的CI/CD实现_第4张图片

2.搭建harbor私有镜像仓库

wget https://github.com/goharbor/harbor/releases/download/v2.2.0/harbor-offline-installer-v2.2.0.tgz
# 解压
tar -zxvf harbor-offline-installer-v2.2.0.tgz
# 修改配置文件
cd harbor
cp harbor.yml.tmpl harbor.yml
vim harbor.yml

./prepare
# 启动
./install.sh

harbor.yml

# 注释掉https相关,使用http访问
# https related config
#https:
# https port for harbor, default is 443
#port: 443
# The path of cert and key files for nginx
#certificate: /your/certificate/path
#private_key: /your/private/key/path

# 访问ip
hostname: ${ip}
# 启动端口
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
 port: ${port}
# amdin账户密码
harbor_admin_password: ${password}

基于Git+Jenkins+Docker的CI/CD实现_第5张图片

# 使配置文件生效
systemctl reload docker

向私有仓库提交镜像

私有仓库搭建好后,还不能直接向仓库提交镜像,需要修改/etc/docker/daemon.json文件,加入镜像仓库的访问地址和端口
/etc/docker/daemon.json


{
    "insecure-registries": ["${ip}:${port}"],
    "registry-mirrors": ["http://${ip}:${port}"]
}
docker pull hello-world
docker tag hello-world:latest ${ip}:${port}/${项目名称}/hello-world:latest
docker login ${ip}:${port} -u admin -p ${password}
docker push ${ip}:${port}/${项目名称}/hello-world:latest

基于Git+Jenkins+Docker的CI/CD实现_第6张图片

3.安装jenkins

docker run -itd -u root -p 8080:8080 -p 50000:50000 -v v1:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock --name=jenkins  jenkinsci/blueocean

打开界面,发现要输入密码
基于Git+Jenkins+Docker的CI/CD实现_第7张图片

# 查看jenkins密码
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

三.使用Jenkins实现CI/CD

  1. 安装插件
    Jenkins的很多功能依赖于安装的插件,由于我们要在别的服务器执行脚本,所以需要安装Publish Over SSH插件。

安装插件(系统管理–>插件管理–>可选插件 )
基于Git+Jenkins+Docker的CI/CD实现_第8张图片
配置服务器信息(系统管理–>系统配置–>Publish over SSH )

基于Git+Jenkins+Docker的CI/CD实现_第9张图片

  1. 创建并配置项目
  • 输入项目名,选择构建一个自由风格的软件项目
    基于Git+Jenkins+Docker的CI/CD实现_第10张图片
  • General

输入项目描述和项目URL
基于Git+Jenkins+Docker的CI/CD实现_第11张图片

  • 源码管理

选择Git,输入项目的URL和需要build的指定分支
基于Git+Jenkins+Docker的CI/CD实现_第12张图片

  • 构建触发器
    基于Git+Jenkins+Docker的CI/CD实现_第13张图片

在jenkins上这么设置后,git push 后仍然不会触发构建,还需要在gitlab上创建项目的webhook.

填入上图中绿框中的webhook URL和生成的Secret token,完成后点击Add Webhook.

点击WebHook的Test请求,可以模拟事件触发.

基于Git+Jenkins+Docker的CI/CD实现_第14张图片

  • 构建环境

在构建环境中进入构建目录,拉取代码,执行构建命令.
在指定镜像的tag名称时,用到了jenkins提供的BUILD_NUMBER环境变量,代表构建的次数,更多的环境变量可以点击Jenkins enviroment variables进行查看.
基于Git+Jenkins+Docker的CI/CD实现_第15张图片
构建过程中报错1
ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,004 ms]

原因:
默认的构建超时是120000ms,构建时间太长导致了超时

解决办法:
点击高级,在可能超时的构建步骤那里设置 Exec timeout(ms) 合理的时间,以防止构建步骤超时,同时勾选上 Exec in pty 让控制台及时输出相关日志信息
在这里插入图片描述

构建过程中报错2
SSH: Connecting from host [RITS20200001]
SSH: Connecting with configuration [172.25.78.130] …
ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [-125]]

原因:
git pull未设置免密登录,需要输入用户名和密码,一直阻塞着.

解决办法:
git设置免密登录,并且修改.git/config文件中的url为git开头的url而不是http开头的url,最后一定要记得,清空工作区间

tips: 构建的命令最好在构建的机器上手动的敲一下,通过log不方便排查问题。
在这里插入图片描述
基于Git+Jenkins+Docker的CI/CD实现_第16张图片

  • 构建完成后操作
    构建完成后,将镜像提交到78.130上的harbor私有仓库,并且在72.46上创建新的容器
    基于Git+Jenkins+Docker的CI/CD实现_第17张图片
    基于Git+Jenkins+Docker的CI/CD实现_第18张图片

四. 测试CI/CD流程

  1. 点击立即构建
  2. push 代码
  3. 点击Webhook的Test按钮

以上三种操作都能够触发构建,并且可以看到Build History,查看所有的构建历史。
基于Git+Jenkins+Docker的CI/CD实现_第19张图片
点击单条构建历史,控制台输出,可以看到构建时的log输出.
基于Git+Jenkins+Docker的CI/CD实现_第20张图片
最后的效果就是,开发者往gitlab上push代码,触发事件,拉取代码,构建新的镜像,将镜像提交到harbor私有仓库,并且以此新镜像在测试环境上构建新的容器,完全的自动化。

你可能感兴趣的:(docker,docker,jenkins,CI/CD,harbor,gitlab)