概述

  • 本篇主要为个人在jenkins持续集成中遇到的坑点。不会特别详细的叙述整个CI/CD流程

    容器化Jenkins没有JDK

  • 不知道是不是自己下的镜像版本的问题,jenkins容器起起来以后没有jdk运行环境。

  • 使用docker 挂载数据卷的方式蹭宿主机的jdk来用,见下面的一长串启动命令配置
  • 个人不是很熟悉 docker-compose,所以本篇基本都是docker 原生命令

    1. docker run -d -it --name my_jenkins -p 8000:8080 -p 50000:50000 -v ${JAVA_HOME}:/usr/local/jdk cijenkins
    2. # -it 交互式运行
    3. # -v 挂载数据卷 宿主机:容器内目录
  • 如果跑ci/cd任务中jenkins的任务日志依然提示 java command not found啥的,那还是没找到jdk

    • 解决思路
    • 进入容器内部去配置环境变量,载这里不展开说了,默认阅读者有一定的docker与代码经验
    • docker exec -it 容器名 bash
      • bash 有的时候是 bin/bash 进不去的话去百度一下,
      • 之后按照正常的linux进行操作

        容器化Jenkins没有maven

  • 这个问题当时让我挺头大的,列一下我尝试过的方法

  • 数据卷挂载

    1. docker run -d -it --name my_jenkins -p 8000:8080 -p 50000:50000 -v ${JAVA_HOME}:/usr/local/jdk -v ${MAVEN_HOME}:/usr/local/maven -v
  • 容器内设置环境变量

    • 这个自己进入容器设置,没有截图。
  • jenkins 页面上设置全局变量,最终是这个生效了,列出来全部是想着有可能有同学跟我情况不同。
  • jenkins - 系统配置 - 全局属性,键值对搞起,上面设置过的属性在下面可以${变量名}复用
  • image.png

    容器化Jenkins没有Git

  • 设置一下自己让jenkins自己安装即可

  • jenkins 全局工具配置
  • image.png

    容器化Jenkins无法执行Docker命令坑点

  • 解题思路

    • 容器卷挂载
      1. docker run -d -it --name my_jenkins -p 8000:8080 -p 50000:50000 -v ${JAVA_HOME}:/usr/local/jdk -v ${MAVEN_HOME}:/usr/local/maven -v /opt/myjenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker cijenkins
  • 挂载之后仍无法解决的时候,因为dokcer容器内执行docker命令是用的宿主机的docker,宿主机的docker用户群里没有容器内的用户,所以无法执行,最终使用下面这句代码解决问题

    1. -v /var/run/docker.sock:/var/run/docker.sock

    项目目录下Dockfile命名坑点

  • 保持在target同级目录下,且不能乱命名,否则在jenkins哪里编写pipline 的时候需要 build -f 指明,给自己徒增烦恼。贴一下自己的工程目录

  • image.png

    Docker build 镜像时命名坑点

    ```shell

    1. stage('构建镜像'){
    2. steps {
    3. echo "start build image"
    4. echo "-----当前地址 ----"
    5. //dir('demo') {
    6. // build镜像
    7. //sh 'docker build -f Dockerfile -t addicated/adiblog:1.0 .'
    8. sh 'docker build -t addicated/adiblog:1.0 .'
    9. // 登录镜像仓库
    10. //sh 'docker login -u addicated -p 1981925d7'
    11. sh 'docker login -u cn-east-3@KIUXSRDS4MPONUMUG9Q2 -p 2e28420f0982d067e79b1e87b534bd2989c5504f27c2b5cf2f40dad61c01bc64 swr.cn-east-3.myhuaweicloud.com'
    12. // 推送镜像到镜像仓库
    13. //sh 'docker push addicated/adiblog:1.0'
    14. sh 'docker tag addicated/adiblog:1.0 swr.cn-east-3.myhuaweicloud.com/addicated/adiblog:1.0'
    15. //sh 'docker tag adiblog:1.0'
    16. sh 'docker push swr.cn-east-3.myhuaweicloud.com/addicated/adiblog:1.0'
    17. //}
    18. }
    19. }
  1. - docker build -t dockerhub的用户名/镜像名字:镜像tag(版本)
  2. <a name="kqJwR"></a>
  3. # Docker build 后 push 前 对tag进行规范化的坑点
  4. - 这一步没好好做的话会在build的时候被卡住,因为我用的是华为的容器镜像服务。所以按照华为的容器镜像来记述。至于为什么用华为的容器镜像服务,md,还不是因为dockerhub太鸡儿卡,build总不成功。
  5. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1608527/1607683111109-c58d32b3-1ba7-4429-b067-71d7b6fca773.png#align=left&display=inline&height=409&margin=%5Bobject%20Object%5D&name=image.png&originHeight=818&originWidth=2802&size=441180&status=done&style=none&width=1401)
  6. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1608527/1607683132872-daecadd0-69a5-47fc-908e-d87ec3acd4be.png#align=left&display=inline&height=483&margin=%5Bobject%20Object%5D&name=image.png&originHeight=966&originWidth=1428&size=371418&status=done&style=none&width=714)
  7. - 先登陆,再进行上传,比较简单,没有什么好记述的,重点是下面的上传镜像两步,不得不说这个指引不合格。。
  8. ```shell
  9. sh 'docker tag addicated/adiblog:1.0 swr.cn-east-3.xxxxaddicated/adiblog:1.0'
  10. # tag 后面不要像指引那样用[]之类的玩意,只会失败
  11. sh 'docker push swr.cn-east-3.myhuaweicloud.com/addicated/adiblog:1.0'
  12. # 同样,上传的命令也没有{}

Docker push 到Dockerhub 失败与替代方案

  • 这个在上一个标题说了,参考使用免费的容器镜像服务,华为云或者其他。

    项目部署后连接 DB mysql失败爬坑-docker内容器互联

  • 项目部署之后发现项目无法链接到mysql,我的mysql也是docker起的容器。

  • 尝试过使用link进行链接,但失败。
    • 解决: 创建一个 bridge 类型的docker network ,然后吧之前的mysql删掉,重新启动在network环境下,之后启动build镜像的时候同样启动在network环境下,实现容器内部互联,解决问题。 ```shell

      创建网络环境,相关的请自行学习

      docker network create -d bridge my_net

[root@VM-0-10-centos ~]# docker run -d -p 3306:3306 —name mysql —network my_net -e MYSQL_ROOT_PASSWORD=”123456” mysql:5.7

build镜像部分

sh ‘docker run -d -p 8081:8081 —network my_net —name=AdiBlog addicated/adiblog:1.0’

这样两个容器在同一个网络环境下,实现联通

```

针对不想删除mysql容器,比如内部有很多数据

  • docker commit mysql 做成一个新的镜像在本地,之后通过镜像再启动新容器即可。