CI/CD阿里云镜像仓库+docker+jenkins+webhook实现项目自动化部署

实现项目自动化部署,解放双手啦

这篇文章使用Docker+Jenkins+阿里云镜像仓库实现Go语言项目的CI/CD。

首先讲一下大致的实现思路:

  1. 推送代码至Git服务器
  2. 阿里云镜像仓库自动构建镜像
  3. 触发Jenkins服务器配置的 Web Hooks
  4. 从Jenkins服务器进入远程应用服务器
  5. 从docker镜像仓库中拉取镜像
  6. 停止并删除该项目正在运行的docker容器
  7. 使用该新镜像构建并启动docker容器
  8. 删除其他旧版本镜像
  9. 完成

然后讲一下实践过程中用到的一些技术点:

  • Docker

    使用Docker的主要原因主要有,应用移植方便,并且可有效解决同一应用在不同服务器上部署带来的环境问题影响。

  • Docker Compose

    docker-compose也是由Docker提供的一个命令行工具,这里主要用于简化Jenkins服务器上对容器的操作,仅此而已,可直接使用shell脚本代替。

  • Jenkins

    Jenkins是一个自动化服务器,也可以作为简单的CI/CD服务器。

  • Git

    Git想必大家都不会陌生,这里同样使用它作为项目的代码管理仓库,并且利用它的Web Hooks,作为Jenkins任务构建的触发器。

  • 镜像仓库

    这里选择阿里云提供的容器服务作为我们的镜像仓库,因为当git仓库代码更新后阿里云可以自动构建镜像。

安装 Jenkins

  • 拉取 Jenkins 镜像
    1
    docker pull jenkins/jenkins:latest
  • 编写 docker-compose.yml 文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    version: "2"
    services:
    jks:
    image: jenkins/jenkins:latest
    ports:
    - 8080:8080
    - 50000:50000
    volumes:
    - /data/jenkins:/var/jenkins_home
    - /var/run/docker.sock:/var/run/docker.sock #docker Server
    - /bin/docker:/bin/docker #docker client
    container_name: jks
    user: root
  • 创建用于挂载的 /data/jenkins 文件夹, 并修改该文件夹的拥有者为 ID=1000 的用户

    1
    2
    mkdir -p /data/jenkins
    chown -R 1000:1000 /data/jenkins
  • 通过 docker-compose 启动 jenkins 容器

    1
    docker-compose -f /data/compose/docker-compose.yml up -d jks

安装 Jenkins 插件

  1. 在浏览器输入 http://IP:8080 进入 Jenkins 管理页面

  2. 通过命令 cat /data/jenkins/secrets/initialAdminPassword 获取初始密码,对 Jenkins 进行解锁,解锁后先跳过插件安装(无需担心漏装推荐的插件,在后续安装插件过程中,会自动安装解锁后推荐的所有插件)

  3. (可选)修改配置文件,并重启 Jenkins 容器,实现插件安装加速

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 编辑jenkins配置文件
    vim /data/jenkins/updates/default.json

    # 执行ex命令, 替换所有插件下载URL
    :1,$s/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g

    # 执行ex命令, 替换连接测试URL
    :1,$s/http:\/\/www.google.com/https:\/\/www.baidu.com/g

    # 重启jenkins容器
    docker-compose -f /data/compose/docker-compose.yml restart jks
  • 进入Jenkins -> Plugin Manager页面安装以下插件
    • Localization: Chinese (Simplified)
    • Generic Webhook Trigger

配置 Jenkins

构建任务

  1. 点击Jenkins -> 新建任务,创建一个 Jenkins 任务

  2. 点击构建触发器

    • 勾选Generic Webhook Trigger
    • token那一栏填写自己的token,最好是项目名清晰明了
    • 然后通过 http://用户名:用户APIToken 或者密码@IP:PORT/generic-webhook-trigger/invoke?token=你填写的TOKEN
      例如:http://admin:admin@127.0.0.1:8080/generic-webhook-trigger/invoke?token=test
    • 阿里云镜像中心创建仓库并填写触发器

在jenkins任务构建中填写shell语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 容器名
name=test1
# 容器标签
tag=latest
# 仓库域名
domain=registry.cn-hangzhou.aliyuncs.com
# 仓库URL
url=***/****
# 登录阿里云镜像仓库
docker login --username=**** --password=**** registry.cn-hangzhou.aliyuncs.com
# 从阿里云镜像仓库中拉取镜像
docker pull $domain/$url

# 停止该镜像正在运行的Docker容器
#line=`docker ps | grep $name`
echo "with argument"
if [ -n "`docker ps | grep $name`" ]; then
echo "存在正在运行的$name容器, 正在使其停止运行..."
docker stop $name
echo "$name容器, 已停止运行"
fi
echo "with argument1"
# 删除该镜像的Docker容器
# line=`docker ps -a | grep $name`
if [ -n "`docker ps -a | grep $name`" ]; then
echo "存在$name容器, 对其进行删除..."
docker rm $name
echo "$name容器, 已被删除"
fi
echo "with argument2"
# 启动容器
docker run --rm --name $name -p 9090:9090 -d -v /usr/workspace/src/cicd:/home -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime $domain/$url:$tag

IFS=$'\n'

# 删除多余镜像
images=`docker images | grep none`
for i in "`docker images | grep none`"
do
# echo $i
# id=`echo "$i" | awk '{print $3}'`
docker rmi `echo "$i" | awk '{print $3}'`
done

这就大功告成了

docker相关请查看docker基本命令

demo地址

https://github.com/likewl/CICD

您的支持将鼓励我继续创作!