docker学习06 - cd持续交付

配置docker cd

1.1 什么是cd

cd 持续交付 ,持续部署

持续交付 : 将代码交付给专业的测试团队进行测试

持续部署 :将测试通过的代码,部署到生产环境

1.2 安装jenkins
1.2.1 jenkins 的作用

在整个自动化集成中,jenkins的作用是拉取gitlab中的代码,打包好发送到目标服务器上

我们提交代码 -> gitlab -> jenkins 拉取、编译、打包 -> 发送到目标服务器

1.2.2 使用docker-compose 安装
1.2.3 创建目录
# 目录的结构是
mkdir /usr/local/jenkins
mkdir /usr/local/jenkins/jenkins01
mkdir /usr/local/jenkins/jenkins01/data

# 给data文件赋予权限
chmod 777 data

jenkins01/
├── data
└── docker-compose.yml
1.2.4 创建docker-compose.yml文件
# 创建docker-compose.yml文件
vi docker-compose.yml

version:"3.1"
services:
  jenkins:
    image: jenkins/jenkins
    restart: always
    container_name: jenkins
    ports:
      - 8888:8080
      - 50000:50000
    volumes:
      - ./data/:/var/jenkins_home

# 验证是否启动成功
docker-compose logs -f
# 出现以下,说明启动成功

jenkins    | *************************************************************
jenkins    | *************************************************************
jenkins    | *************************************************************
jenkins    |
jenkins    | Jenkins initial setup is required. An admin user has been created and a password generated.
jenkins    | Please use the following password to proceed to installation:
jenkins    |
jenkins    | 3b01bc3108********5dcc7069335
jenkins    |
jenkins    | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
jenkins    |
jenkins    | *************************************************************
jenkins    | *************************************************************
jenkins    | *************************************************************
1.2.5 在浏览器输入地址,172.16.195.134:8888
1.2.6 首次登录,会提示输入管理员密码,就是上面这个打印的值 3b01bc3108********5dcc7069335
1.2.7 选择插件安装,我们点击选择插件安装
1.2.8 选择安装两个软件,Git ParameterPublish Over SSH
1.2.9 安装的过程很慢,这个是正常现象
1.2.10 安装完成后,开始创建账户信息,我自己设置的都是root
1.2.11 设置ip,默认就是当前网页的ip:端口,然后点击完成,就安装完成了
1.3 jenkins的使用
1.3.1 配置jenkins指定目标服务器

进入jenkins页面,点击左侧的manage jenkins -> 系统设置 -> Publish over SSH -> 点击新增 -> 分别录入 name【用于区分不同服务的名字】 、hostname【服务器ip】、username【账户】、Remote Directory【服务器上指定路径,例如:我们这里设置为/usr/local/jenkins/workspaces/jenkins01_workspaces,这个路径在服务器上必须存在的,否则会报错】

然后点击高级,勾选 Use password authentication, or use a different key -> Passphrase / Password 输入服务器密码 -> port 设置端口号,默认是22(由于我们之前设置的测试服务器端口改成了 60022 ,现在这个地方设置为 60022,否则连不上)

1.3.2 设置gitlab免密码登录
  1. 进入jenkins容器内部

    # 查看所有容器
    [root@centOS jenkins01_workspaces]# docker ps
    CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                  PORTS                                                          NAMES
    19fd402acb35        jenkins/jenkins                 "/sbin/tini -- /usr/…"   8 hours ago         Up 8 hours              0.0.0.0:50000->50000/tcp, 0.0.0.0:8888->8080/tcp               jenkins
    # 进入容器内部
    [root@centOS jenkins01_workspaces]# docker exec -it 19 bash
    
    
  2. 生成ssh秘钥

    # 生成ssh秘钥  邮箱随便写
    jenkins@19fd402acb35:/$ ssh-keygen -t rsa -C "XXXX@qq.com"
    Generating public/private rsa key pair.
    Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa):
    Created directory '/var/jenkins_home/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /var/jenkins_home/.ssh/id_rsa.
    Your public key has been saved in /var/jenkins_home/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:xxxxxxxxxxxxxxxxxx XXXX@qq.com
    The key's randomart image is:
    +---[RSA 2048]----+
    |  .=B.. E+.      |
    |  .+.= + .+      |
    |    B = ..oo     |
    |   o * o o...    |
    |    . + S o..    |
    |     o *.. +     |
    |    . =o*.o      |
    |   . +.Oo.       |
    |    ..Boo        |
    +----[SHA256]-----+
    

    从日志信息中就可以看出,生成的秘钥放到var/jenkins_home/.ssh/ 目录下,但是由于之前创建jenkins的时候其实指定了 数据卷 volumes: - ./data/:/var/jenkins_home,所以这个文件实际上在宿主机的/usr/local/jenkins/jenkins01/data/.ssh,如果在data目录下使用ls查看,是找不到.ssh的,因为这是个隐藏文件夹,所以可以使用 ls -a的命令

    进入到.ssh目录下,打开id_rsa.pub

  3. 把生成的秘钥配置到gitlab上

    进入gitlab页面,选择设置-> ssh,添加一个key

  4. jenkins 配置jdk 和 配置maven

    1. 本地上传jkd和maven上传到jenkins服务器上指定目录上,这里我们上传到 /usr/local/jenkins/jenkins01/data,因为这个路径是jenkins映射到宿主机目录下的

    2. 分别解压这两个压缩包到当前目录下

      tar -zxvf jdk-8u221-linux-x64.tar.gz
      tar -zxvf apache-maven-3.6.3-bin.tar.gz
      
    3. 到jenkins页面,系统管理 -> 全局工具配置 -> 分别选择jdk安装和maven安装(注意,因为我们已经把jdk和maven上传到服务器上了,所以不用勾选自动安装),

      1. 设置别名

      2. 设置安装路径

        安装路径的设置要注意不能使用宿主机的地址,而是要使用jenkins容器内部的地址,例如:

        jdk在宿主机的路径是 : /usr/local/jenkins/jenkins01/data/jdk1.8.0_221,其实对应的jenkins路径是 /var/jenkins_home/jdk1.8.0_221

        mavne在宿主机的路径是: /usr/local/jenkins/jenkins01/data/apache-maven-3.6.3, 对应的jenkins容器路径是

        /var/jenkins_home/apache-maven-3.6.3

    4. 最后点击保存即可

  5. 通过jenkins手动拉取gitlab中的项目

    1. 服务器上第一次拉取项目的时候需要一个手动确认

      1. 进入jenkins容器内部

        # 查看容器
        [root@centOS apache-maven-3.6.3]# docker ps
        CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                  PORTS                                                          NAMES
        19fd402acb35        jenkins/jenkins                 "/sbin/tini -- /usr/…"   10 hours ago        Up 10 hours             0.0.0.0:50000->50000/tcp, 0.0.0.0:8888->8080/tcp               jenkins
        # 进入容器内部
        [root@centOS apache-maven-3.6.3]# docker exec -it 19 bash
        jenkins@19fd402acb35:/$
        
        # 进入/var/目录下
        jenkins@19fd402acb35:/$ cd /var/
        # 拉取代码 注意 这里由于已经设置了ssh无密码连接,所以clone 使用的地址是 gitlab 项目页面下的 ssh 地址,而不是 http 地址
        jenkins@19fd402acb35:~$ git clone git@172.16.195.134:root/testci.git
        Cloning into 'testci'...
        The authenticity of host '172.16.195.134 (172.16.195.134)' can't be established.
        ECDSA key fingerprint is SHA256:3fDPexPrQSbb3qL958cWyECJ+XhWcTMBx3NJwUPUa8E.
        Warning: Permanently added '172.16.195.134' (ECDSA) to the list of known hosts.
        remote: Counting objects: 87, done.
        remote: Compressing objects: 100% (39/39), done.
        remote: Total 87 (delta 42), reused 80 (delta 35)
        Receiving objects: 100% (87/87), 7.54 KiB | 0 bytes/s, done.
        Resolving deltas: 100% (42/42), done.
        
      2. 拉取成功后就可以删除这个项目了,因为我们的目的就是要第一次拉取的时候的那个手动确认

  6. 在jenkins中配置maven任务

    在jenkins中配置maven任务,让jenkins从gitlab中拉取代码,并且用maven打成一个war包

    1. 创建一个maven项目,我们起名testcd(步骤参考创建testci),并推送到gitlab中

    2. 在jenkins 页面中,创建一个任务

      1. 首页-创建任务-输入任务名-点击创建一个自由风格的任务,点击确定
      2. 勾选丢弃旧的构建,并设置保留的最近的任务数,我们设置的是10(不用设置保留的天数)【可配置可不配置】
      3. 源码管理部分勾选-git ,并设置gitlab中ssh 类型的路径,设置分支(默认是master分支)
      4. 构建部分,选择 调用顶层maven目标,并选择maven 版本,并设置目标(maven命令),我们使用的是package命令
      5. 点击保存
    3. 执行创建的任务,使用jenkins构建一个项目

      1. 点击进入创建的任务中

      2. 点击左侧的立即构建,会出现一个带有进度条的窗口,就会开始构建

      3. 点击进度条,可以跳转到一个页面,点击左侧的控制台输出,可以看到构建的日志信息(第一次构建会很慢,因为要下载一些包)

        Downloaded from central: https://repo.maven.apache.org/maven2/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar (431 kB at 10 kB/s)
        [INFO] Packaging webapp
        [INFO] Assembling webapp [testcd] in [/var/jenkins_home/workspace/testcd/target/testcd-1.0-SNAPSHOT]
        [INFO] Processing war project
        [INFO] Copying webapp resources [/var/jenkins_home/workspace/testcd/src/main/webapp]
        [INFO] Webapp assembled in [42 msecs]
        [INFO] Building war: /var/jenkins_home/workspace/testcd/target/testcd-1.0-SNAPSHOT.war
        [INFO] WEB-INF/web.xml already added, skipping
        [INFO] ------------------------------------------------------------------------
        [INFO] BUILD SUCCESS
        [INFO] ------------------------------------------------------------------------
        [INFO] Total time:  04:11 min
        [INFO] Finished at: 2020-08-31T02:22:32Z
        [INFO] ------------------------------------------------------------------------
        Finished: SUCCESS
        
      4. 从上面的打印信息可以看出,已经构建完成了,并且放到 /var/jenkins_home/workspace目录下,聪明的你想到了什么? 对,数据卷,所以,这个构建好的项目也应该在 我们配置好的数据卷目录下,即 /usr/local/jenkins/jenkins01/data/下

        [root@centOS target]# pwd
        /usr/local/jenkins/jenkins01/data/workspace/testcd/target
        [root@centOS target]# ll
        总用量 4
        drwxr-xr-x. 2 ordinary-01 ordinary-01   28 8月  31 10:22 maven-archiver
        drwxr-xr-x. 4 ordinary-01 ordinary-01   55 8月  31 10:22 testcd-1.0-SNAPSHOT
        -rw-r--r--. 1 ordinary-01 ordinary-01 2099 8月  31 10:22 testcd-1.0-SNAPSHOT.war
        
1.4 实现持续交付,持续部署

注意,ci 与 cd的不同点之一是部署的频率问题,ci是每次提交都部署,但是cd是提交到达一定版本后才部署,频率相对于ci要低很多

1. jenkins 安装git parameter插件

Git parameter 插件跟版本有关系的,如果不能使用,我们就需要使用另个 插件 Persistent Parameter,为了以防万一,直接在jenkins中安装这个插件吧。

系统管理-> 插件管理-> 可选插件 -> 搜索 Persistent Parameter -> 勾选 构建参数 -> 点击下面的 立即安装,安装完成后重启jenkins即可

2. 重新制定构建项目的方式
  1. 勾选丢弃旧的构建,并设置保留的最近的任务数,我们设置的是10(不用设置保留的天数)【可配置可不配置】

  2. 在安装Persistent Parameter后会在任务详情里出现一个勾选项 参数化构建过程,通过这个来实现手动控制版本部署的目的

    1. 勾选后,添加参数选择 git 参数
    2. 依次录入 名称 、 描述、参数类型 、默认值
      1. 名称: 可以随便起,下面要引用的,所以用英文 ,例如 Tag
      2. 描述: 可以填可不填
      3. 参数类型:选择标签
      4. 默认值:master
  3. 构建部分

    1. 由于要实现生产环境的持续交付和持续部署,因此简单的maven已经不能实现了,所以这里选择 执行shell【如果之前设置了maven,需删除】

    2. 源码管理部分勾选-git ,并设置gitlab中ssh 类型的路径,设置分支(默认是master分支)

    3. 使用shell命令执行操作,命令如下:

      # 打印上面配置的tag命令
      echo $Tag
      # 切换到容器内存放项目的位置 
      cd /var/jenkins_home/workspace/testcd
      # git 切换分支
      git checkout $Tag
      # 从分支下拉取代码
      git pull origin $Tag
      # 使用maven命令打包 因为是容器内,所以需要使用绝对路径来执行mvn 命令
      /var/jenkins_home/apache-maven-3.6.3/bin/mvn clean package
      
  4. 构建后操作部分

    1. 项目构建成功后,就要开始执行构建后的操作了,在任务详情页面,下拉到构建后操作部分,选择 send build artifacts over ssh,这是我们之前安装的Publish over SSH插件

    2. 配置一些ssh信息

      1. name : 选择我们之前配置好的目标服务器地址

      2. transfers :

        1. source files :配置要把当前工程下的那些内容添加到目标服务器

          **/*.war,docker-compose.yml,docker/**
          

          ** 代表全部路径

        2. remote directory : 配置目标服务器用来放当前工程下的文件的文件夹名

          testcd
          

          jenkins会默认把工程文件放到容器的 我们在构建jenkins的时候用来放 docker-compose.yml文件的路径下,也就是/usr/local/jenkins/jenkins01/ 下,但是为了更好的jenkins 构建的项目,通过上面指定的路径,实际这个构建工程就放到了 /usr/local/jenkins/jenkins01/testcd/ 路径下了

        3. exec command :执行的命令

          # 跳转到放工程的目录下
          cd /usr/local/jenkins/jenkins01/data/workspace/testcd
          # 把 target 文件夹下的.war包放到 docker 文件夹下 
          cp target/testcd-1.0-SNAPSHOT.war docker
          # 关闭 dcoker-composer 构建的容器
          docker-compose down
          # 重新构建
          docker-compose up -d --build
          # 删除镜像名为null的镜像
          docker image prune -f
          
      3. 点击保存

3. 修改程序代码,添加dockerfile和compose文件

项目与pom.xml文件同一目录下创建docker文件夹,并在其中添加一个Dockerfile文件,内容如下

FROM daocloud.io/library/tomcat:8.5.15-jre8
COPY testcd-1.0-SNAPSHOT.war /usr/local/tomcat/webapps

项目与pom.xml同一路径下创建一个docker-compose.yml文件,配置内容如下

version: "3.1"
services:
  testcd:
    build: docker
    restart: always
    container_name: testcd
    ports:
      - 8081:8080
4. 构建工程

我们上面的设置是想要交付部署指定版本的工程,但是到底哪些版本可以部署呢? 是怎么设置的呢?

  1. 我们可以给我们想要部署的项目设置标签
    1. 进入gitlab页面,进入我们的项目,找到我们想要部署的代码的版本,点击标签按钮,点击创建一个标签,在tag name 下输入标签名,点击完成
    2. 进入jenkins页面,进入任务,点击左侧的 build with parameters ,会看到一个 用以下参数构建项目,这个就是在任务配置中配置的Tag,里面的参数就是 gitlab中的 标签
    3. 点击构建项目
    4. 点击构建项目的进度条,点击进去后点击控制台输出,可以看到输出信息
5.测试
  1. 按照上面构建工程的步骤,可以实现版本1的部署
  2. 接着在项目中index.html页面添加新的代码,提交到gitlab上,在最新的版本上设置标签
  3. 刷新jenkins 任务页面,点击构建项目(build with parameters),选择新创建的标签,点击构建
  4. 点击进度条,点击控制台输出,查看打印日志
  5. 构建完成后,在浏览器输入 http://172.16.195.134:8081/testcd-1.0-SNAPSHOT/,就可以看到更新后的信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker Client是Docker的命令行工具,可以通过命令行操作Docker Engine。它通过REST API与Docker Engine进行通信,因此可以在任何支持REST API的操作系统上运行。 Docker Client可以通过在本地计算机上安装Docker Desktop或在运行Docker Engine的任何计算机上安装Docker CLI来获得。Docker CLI是Docker Client的另一个名称。 为了使Docker Client更加有用,可以将其与其他工具和平台进行整合,例如: 1. Docker Compose:Docker Compose是一个工具,可以使用YAML文件定义和运行多个Docker容器Docker Compose可以与Docker Client一起使用,以便轻松管理和运行多个容器。 2. Kubernetes:Kubernetes是一个开源平台,用于自动化容器部署、扩展和管理。Docker Client可以与Kubernetes一起使用,以便将容器部署到Kubernetes集群中,并管理它们。 3. Jenkins:Jenkins是一个流行的持续集成和持续交付(CI/CD)工具。Docker Client可以与Jenkins一起使用,以便在Jenkins中构建、测试和部署Docker容器。 4. Ansible:Ansible是一个自动化工具,可用于配置和管理远程计算机。Docker Client可以与Ansible一起使用,以便在远程计算机上安装和配置Docker。 5. GitLab:GitLab是一个代码托管和CI/CD平台。Docker Client可以与GitLab一起使用,以便在GitLab CI/CD管道中构建、测试和部署Docker容器。 通过将Docker Client与其他工具和平台整合,可以更轻松地管理和部署Docker容器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值