首先介绍下环境部分,文章中共涉及到三台服务器,分别用 Gitlab,Jenkins,Deploy 三个名称代替,部署在内网环境,同时因为政策原因,服务器无法直接连通外网。下载 Jenkins 插件时需要添加代理,如服务器可直接联通外网,忽略即可。

其中服务器详细信息如下:

服务器名称 服务器 IP 作用
Gitlab http://10.124.207.51/ 代码管理
Jenkins http://10.124.205.60/ Jenkins 所在服务器
Deploy http://10.124.205.69/ UTC 部署环境

实现功能:

Jenkins 通过监听 GItlab 分支变化,实时更新代码,并将编译后的代码部署在 UTC 环境。

实现思路:

  1. 在 Jenkins 所在服务器,使用 docker 安装 Jenkins,启动并下载所需插件。

  2. 通过 Jenkins 提供的管理页面,创建管理员用户。并配置所需凭证。

    关于凭证这里详细说下,共需要配置如下凭证:

    • 配置用于访问 Gitlab 的凭证
    • 配置用于拉取 Gitlab 仓库代码的凭证
    • 配置用于访问 UTC 部署环境的凭证
  3. 创建任务,将三者连接起来。

Jenkins 安装

这里 docker 安装就不演示了,相关配置可参考这篇,使用 docker pull 镜像:

docker pull jenkinsci/blueocean

运行 Jenkins :

docker run \
-u root \
-d \
-p 50001:8080 \
-p 50000:50000 \
-v /etc/localtime:/etc/localtime \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins \
jenkinsci/blueocean

Jenkins 插件安装

在浏览器输入 http://10.124.205.60:50001 进入 jenkins 管理页面,之后会提示输入密码。

jenkins 的初始登录密码可进入 docker 所在的容器中,可以通过 cat /root/.jenkins/secrets/initialAdminPassword 获取。

代理配置

由于公司 ACL 的限制,无法直接访问外网,这时会在页面上提示,当前 Jenkins 为离线版本,故需要配置代理:

在服务器输入框中输入代理地址:proxy.esl.cisco.com
端口:80
测试 URL:用于测试代理是否配置成功。
在下载插件后,可以将代理清掉,以免在内网访问时出现问题。

插件安装

在配置代理成功后,会提示安装插件,这里选择推荐的插件选项安装。

登录成功后,由于 Jenkins 自带的插件中,没有 Gitlab 和 Publish Over SSH ,需要我们手动安装下,在 系统管理/插件管理/可选插件目录下 ,搜索关键字即可。其中 GitLab Plugin 用于对 Gitlab 的访问,Publish Over SSH 用于传输文件以及在目标服务器上执行命令。

凭证配置

配置 Gitlab

系统管理/系统配置页面,向下滑动,找到 gitlab 的选项,该配置用于访问 Gitlab.

Connection name: 随便起一个连接名称
Gitlab host URL: 为 Gitlab 的地址
Credentials:选择一个认证的方式。因为咱们是第一次,选择添加,类型为 Gitlab API token. 将 gitlab 的 token 粘贴到 API token 中。接着点击添加。最后通过,点击测试判断是否正常。

如果不知道如何获取 gitlab 的 token,可以参考下图,在 Gitlab 管理页面创建:

Git 配置

向下滑动,找到 git plugin 配置,配置上用户名和邮箱即可:

Publish over SSH 配置

该插件的作用主要是通过 SSH 命令,操作目标服务器,实现自动部署。

SSH 连接一般有两种方式,用户名密码或公私匙的方式,下面用公私匙的方式操作:

# 首先进入 Jenkins 所在的 docker 容器
docker exec -it jenkins /bin/bash # 生成公私匙,需要注意的是新版本的格式 Jenkins 插件不支持,请使用 PEM 这种格式
ssh-keygen -t rsa -b 4096 -m PEM # 将公匙拷贝至目标服务器
ssh-copy-id -i .ssh/id_rsa.pub root@10.124.205.69

下面开始配置 Jenkins:

Passphrase: 这个是在生成 ssh key 时,输入的密码,不填写就行。
Path to key: 这个是 ssh 私匙文件所在的绝对位置,当填写下面的 Key 不填写即可。
Key:生成的私匙密码
SSH Server 配置:
Name:随便起名就可以
Username:ssh 登录的用户名
Remote Directory:这个一定要填写根路径,之后的操作都会基于该路径。 可点击 `Test Configuration` 是否配置成功,点击应用,保存即可。

Jenins Job 配置

在首页上,点击新建任务。输入任务名称,类型选择第一个,构建一个自由风格的软件项目,点击确定,任务就创建完成了。

然后将鼠标放在名称这列,可以看到一个小三角,点击展开后,对任务进行配置:

源码配置

选择源码管理,选择 Git,用于获取源代码。这里简单提一下,之前配置的 Gitlab 用于对 Gitlab 的访问,而这里配置的 GIt 用于对某个仓库进行访问。

这里需要将之前生成 ssh 公匙放到 Gitlab 的 SSH Keys 中,将 ssh 私匙放在当前的 key 中。用于拉取代码。

将公匙放入 Gitlab 中:

接着点击应用和保存。

构建触发器的配置

触发器的作用就是在什么情况下,会开始执行该任务。这里配置的是轮询 SCM 系统,也就是 Gitlab 分支的内容出现变化时,触发任务,轮询的时间为 1s.

构建配置

构建的作用在获取 SCM 上的代码后,执行的操作:

执行 shell: 注意这里编写的 shell 的运行环境是在 jenkins 所在容器内部的。

选择添加 Sendfiles or execute commands over SSH

Name: 这里选择,之前建好用于访问目标服务器的凭证
Source files: **/*.* 表示递归传输文件夹下的包含 . 的所有文件
Remote directory: 表示传送的目标目录
Exec command: 表示所有文件传输成功后,在目标服务器执行的 shell 命令。

下面是服务器中执行的脚本,用于编译代码以及重启服务。

# 注意添加可执行权限
chmod +x deploy_shell.sh
cat deploy_shell.sh #!/bin/bash # constant
containerName="ctg_backend"
WORKING_DIR="/home/yuwzhang/docker-compose/project/temp_build"
TODAY=`date +%Y-%m-%d.%H:%M:%S` echo "Enter deploy script..." echo "\nStep1: Copy data to docker web container.."
# delete old dir
if [ -d "$WORKING_DIR" ]; then rm -Rf $WORKING_DIR; fi
# cp new dir
cp -r /home/yuwzhang/jenkins/project /home/yuwzhang/docker-compose/project/temp_build echo "\nStep2: Enter web container and build py files to bytecode.."
docker exec $containerName bash -c "cd /src/temp_build && python -m compileall -b . && find . -name '*.py' |xargs rm -rf && find . -name 'pycache' |xargs rm -rf"
cp /home/yuwzhang/docker-compose/project/gunicorn_config.py /home/yuwzhang/docker-compose/project/temp_build/gunicorn_config.py
cp -r /home/yuwzhang/docker-compose/project/frontend /home/yuwzhang/docker-compose/project/temp_build/frontend echo "\nStep3: Stop web services.."
cd /home/yuwzhang/docker-compose
docker-compose stop web echo "\nStep4: replace new project dir to old project dir.."
mv project/temp_build new_build
mv project project_`date +%Y-%m-%d.%H:%M:%S`
mv new_build project echo "\nStep5: Start web services.."
docker-compose start web echo "\nStep6: check web services status.."
sleep 20s
exist=`docker inspect --format '{{.State.Status}}' ${containerName}`
echo "web status is $exist"

现在,一个基础版的 CI/CD 流程就搭建完了,可以通过 Blue Ocean 来观察任务的执行情况:

设置时间

在运行 Jenkins 容器时,已经挂载了宿主机的时间到容器内,可是发现 Jenkins 显示的时间还是不正确,在容器内查看时间是正常的,也许和 Jenkins 的配置有关,在系统管理/脚本命令行中执行如下命令,时间就恢复正常了。

System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')

参考

Jenkins Book

Docker 集成 Jenkins Gitlab 实现 CI/CD的更多相关文章

  1. 持续集成指南:GitLab 的 CI/CD 工具配置与使用

    前言 写代码这项工作,本质就是将工作自动化,减少手工操作提供效率,因为人的本质都是懒狗,程序员也不能例外,为了各种意义的效率提升(懒),我们需要持续集成工具,将代码测试.编译.发布这些重复性很高的工作 ...

  2. Azure DevOps+Docker+Asp.NET Core 实现CI/CD(二.创建CI持续集成管道)

    前言 本文主要是讲解如何使用Azure DevOps+Docker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目). 上一篇: Azure DevOps+Docker+Asp.N ...

  3. 使用Gitlab的CI/CD功能自动化推送docker镜像到Nexus仓库出现的问题

    在服务器中可以直接使用命令行登录,推送docker镜像等 但是在使用Gitlab的CI/CD功能中,gitlab-ci.yml文件执行过程中出现如下错误: 原因分析: 服务器上之前使用命令行登陆过Ne ...

  4. 庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境

    庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境 一.介绍 说起微服务架构来,有一个环节是少不了的,那就是CI/CD持续集成的环境.当然,搭建CI/CD环境的工具很多, ...

  5. [转] gitlab 的 CI/CD 配置管理

    [From] http://blog.51cto.com/flyfish225/2156602 gitlab 的 CI/CD 配置管理 (二) 标签(空格分隔):运维系列 一:gitlab CI/CD ...

  6. Azure Data Factory(三)集成 Azure Devops 实现CI/CD

    一,引言 由于上一节文章内容过长,无法分享Azure Data Factory 的持续集成,持续发布.今天将着重介绍一下在使用 Azure DevOps Pipeline 发布,自动进行持续集成,并且 ...

  7. Kubernetes+Jenkins+Nexus+Gitlab进行CI/CD集成

    前面已经完成了 二进制部署Kubernetes集群,下面进行CI/CD集成. 一.流程说明 应用构建和发布流程说明: 1.用户向Gitlab提交代码,代码中必须包含Dockerfile: 2.将代码提 ...

  8. 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作

    一.各个组件的功能描述: Docker 是一个开源的应用容器引擎. Jenkis 是一个开源自动化服务器. (1).负责监控gitlab代码.gitlab中配置文件的变动: (2).负责执行镜像文件的 ...

  9. docker | jenkins 实现自动化CI/CD,后端躺着把运维的钱挣了!(下)

    前言 在上一篇文章中,我们使用docker编写Dockerfile文件,将我们自己的项目构建成镜像,然后发布到Docker Hub中,并且用自己的云服务器拉取Docker Hub上我们自己上传的项目镜 ...

随机推荐

  1. 2019-2020-1 20199310《Linux内核原理与分析》第六周作业

    1.问题描述 在前面的文章中,学习了系统调用的相关理论知识,并使用库函数API和C代码中嵌入汇编代码两种方式使用getpid()系统调用.本文将内容围绕系统调用system_call的处理过程,在Me ...

  2. (一)PL/SQL简介

    PL/SQL PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语句的使用上增加了编 ...

  3. java中Runnable和Callable的区别

    文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...

  4. Shutdown SpringBoot App

    文章目录 Shutdown Endpoint close Application Context 退出SpringApplication 从外部程序kill App Shutdown SpringBo ...

  5. Gym 101194D Ice Cream Tower

    被一道数位DP折磨得欲仙欲死之后,再做这道题真是如同吃了ice cream一样舒畅啊 #include<bits/stdc++.h> using namespace std; #defin ...

  6. CF1285 --- Dr. Evil Underscores

    CF1285 --- Dr. Evil Underscores 题干 Today as a friendship gift, Bakry gave Badawy \(n\) integers \(a_ ...

  7. 【Linux题目】第五关

    1. 如何取得/etiantian文件的权限对应的数字内容,如-rw-r-r 为644,要求使用命令取得644或0644这样的数字. 解答: 方法1:用sed获取stat filename里的属性值 ...

  8. python 类C数组的两种形式:list -->内容可变, tuple --->内容不可变

    python 中的列表相当与 C 中的数组,列表:list 初始化使用[ ], 元组:tuple 初始化使用(): 一.列表list 1 #!/usr/bin/python  2   3 #list初 ...

  9. 02-线性结构3 Reversing Linked List

    02-线性结构3 Reversing Linked List   (25分) 时间限制:400ms 内存限制:64MB 代码长度限制:16kB 判题程序:系统默认 作者:陈越 单位:浙江大学 http ...

  10. GCD-Euclidean Algorithm

    求解两个正整数的最大公约数(Greatest Common Devisor),可以采用循环进行遍历,不过效率很低.所以引入欧几里得算法(Euclid's algorithm). 欧几里得算法基于GCD ...