为什么要用Jenkins

每次开发完成一个项目之后,需要打包部署,没用专门的运维人员,只能由开发人员打包程序,把线上的服务关了,把打包好的应用程序部署进服务器,这是一个繁琐的过程,而Jenkins正好帮助我们解决了这个问题,自动构建部署,非常方便。

Jenkins

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

Jenkins工作原理

image-20211017092457876

以上为基本工作原理,只是为了开发人员更好的理解画的,详情可查看官方文档:https://www.jenkins.io/zh/

安装Jenkins

首先准备一台服务器/虚拟机,安装好Docker,还有远程连接工具等辅助软件。

  1. 从Docker中拉取Jenkins镜像

    docker pull jenkinsci/blueocean
  2. 启动Jenkins服务

    docker run \
      -u root \
    
      -d \
      -p 10240:8080 \
      -p 10241:50000 \
      -v jenkins-data:/var/jenkins_home \
      -v /var/run/docker.sock:/var/run/docker.sock \
      jenkinsci/blueocean
    • -u:使用root用户
    • -rm:关闭时自动删除Docker容器。如果您需要退出Jenkins,这可以保持整洁。
    • -d:在后台运行容器(即“分离”模式)并输出容器ID。如果您不指定此选项, 则在终端窗口中会输出正在运行的此容器的Docker日志。
    • -p: 映射端口
    • -v:目录挂载
  3. 浏览器输入http://192.168.140.128:10240/看到如下界面表示成功

image-20211017094458693
  1. 等待一段时间,可以看到如下界面

    image-20211017094736568
    #进入容器
    docker exec -it xxxxxxxxxxx /bin/bash
    #查看密钥
    cat /var/jenkins_home/secrets/initialAdminPassword
    xxxxxxxxxxxxxxxxxxxxxxxxxx

    复制上面的xxxxxxxxxxxxxxxxxxxxxxxxxx密钥拿到浏览器的编辑框黏贴,点击继续等待一段时间。

  2. 安装插件

    image-20211017094935167

    选择安装推荐的插件即可

    然后根据步骤配置管理员账号JenkinsURL保存并完成,然后就可以使用了

    image-20211017095157924

    注意:首次进入Jenkins部分菜单会还没有中文,需要重新启动。

实现Jenkins+Docker部署项目

  1. Jenkins安装maven打包插件:Jenkins -> 系统管理 -> 插件管理 -> 可选插件,搜索Maven IntegrationDocker

    image-20211017095941550 image-20211017095959730

    等待安装即可

  2. 进行全局工具配置;Jenkins -> 系统管理 -> 全局工具配置

    image-20211017100121963

    进行JDK配置,在此之前你需要查看JAVA_HOM路径,使用docker inspect xxxxxxx即可,大致如下,有JAVA_HOM即可。

    "Env": [
        "PATH=/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        "LANG=en_US.UTF-8",
        "LANGUAGE=en_US:en",
        "LC_ALL=en_US.UTF-8",
        "JAVA_VERSION=jdk8u262-b10",
        "JAVA_HOME=/opt/java/openjdk",
        "JENKINS_HOME=/var/jenkins_home",
        "JENKINS_SLAVE_AGENT_PORT=50000",
        "REF=/usr/share/jenkins/ref",
        "JENKINS_VERSION=2.249.2",
        "JENKINS_UC=https://updates.jenkins.io",
        "JENKINS_UC_EXPERIMENTAL=https://updates.jenkins.io/experimental",
        "JENKINS_INCREMENTALS_REPO_MIRROR=https://repo.jenkins-ci.org/incrementals",
        "COPY_REFERENCE_FILE_LOG=/var/jenkins_home/copy_reference_file.log"
    ],
    image-20211017100444541

    进行git配置

    image-20211017100512317

    maven配置

    image-20211017100604189

    docker配置

    image-20211017100625289

    最后点击保存即可。

  3. 开始新建任务

    1. 点击新建任务

      image-20211017100737517

    2. 任务填写

      image-20211017100811356

    3. 进行任务配置

      添加git仓库

      image-20211017101155113

      构建触发器

      image-20211017101251020

      build编译

      image-20211017101323986

      编译build的shell命令

      image-20211017101436546

      #将打包好的jar项目,移到/opt/data/build目录
      #/var/jenkins_home/workspace/SpringBoot_AutoTest/target/jenkins-0.0.1-SNAPSHOT.jar构建好的jar路径
      #/opt/data/build进入到容器创建这个目录
      mv /var/jenkins_home/workspace/SpringBoot-AutoTest/target/springboot-AutoTest-0.0.1-SNAPSHOT.jar /opt/data/build
      #切换目录到/opt/data/build
      cd /opt/data/build
      #执行构建Dockerfile命令
      docker build ./ -t my/demo
      #停止之前的容器运行
      docker stop demo
      #删除之前的容器
      docker rm demo 
      #运行刚刚创建的容器
      docker run -d --name demo -p 8080:8080 my/demo
      echo "构建完成"

      点击保存应用。

    4. 编写一份Dockerfile文件,内容如下

      # 基于java镜像创建新镜像
      FROM docker.io/java:8
      
      # 作者
      MAINTAINER xxxx
      
      # 将jar包添加到容器中并更名为springboot-AutoTest-0.0.1-SNAPSHOT.jar
      COPY springboot-AutoTest-0.0.1-SNAPSHOT.jar /springboot-AutoTest-0.0.1-SNAPSHOT.jar
      
      # 暴露8080端口
      EXPOSE 8080
      
      # 运行jar包
      ENTRYPOINT ["java","-jar","springboot-AutoTest-0.0.1-SNAPSHOT.jar","--server.port=8080","&"]

      编写好之后,运行如下命令,将其放置到Docker容器中

      docker cp Dockerfile 容器ID:/opt/data/build

    5. 点击立刻构建

参考

文章1:https://www.cnblogs.com/fuzongle/p/12834080.html

文章2:https://blog.csdn.net/linfen1520/article/details/109045808

文章3:https://blog.csdn.net/linfen1520/article/details/109045063