• DevOps CI/CD之一: Jenkins和Github


    最近周末没事,把开发过程中用到的东西重新整理一下,今天先从Jenkins开始,记录和github结合如何使用。

    一、采用Docker安装Jenkins

    1. 首先需要安装docker,安装完docker后运行:
    docker pull jenkins/jenkins
    #如果要指定特定image,例如weekly
    docker pull jenkins/jenkins:weekly
    
    • 1
    • 2
    • 3
    1. 创建网络桥接
    docker network create jenkins
    
    • 1
    1. 为了在Jenkins节点上可以执行Docker命令,我们下载Docker:dind
    docker run --name jenkins-docker --rm --detach \
      --privileged --network jenkins --network-alias docker \
      --env DOCKER_TLS_CERTDIR=/certs \
      --volume jenkins-docker-certs:/certs/client \
      --volume jenkins-data:/var/jenkins_home \
      --publish 2376:2376 \
      docker:dind --storage-driver overlay2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    –name: 指定docker的名称
    –rm: 当docker不运行是自动移除image
    –detach: 让docker在后台运行, 后续我们可以通过docker stop jenkins-docker来停止这个docker
    –network: 使用上一步创建的网络
    – network-alias:网络别名
    –env:指定docker TLS证书的根目录
    –volume: 连续两个都是相当于建立映射,把/certs/client映射叫做jenkins-docker-certs
    –pushlish: 暴露docker的端口,用于在本地机器发送命令之间的通讯
    docker:dind: image本身
    –storage-driver overlay2:docker存储驱动

    1. 建立一个Dockerfile定制docker images
    FROM jenkins/jenkins:2.346.3-jdk11
    USER root
    RUN apt-get update && apt-get install -y lsb-release
    RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
      https://download.docker.com/linux/debian/gpg
    RUN echo "deb [arch=$(dpkg --print-architecture) \
      signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
      https://download.docker.com/linux/debian \
      $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
    RUN apt-get update && apt-get install -y docker-ce-cli
    USER jenkins
    RUN jenkins-plugin-cli --plugins "blueocean:1.25.6 docker-workflow:1.29"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 基于上面这个dockerfile创建docker image
    docker built -t jenkins:2.346.3-jdk11 .
    
    • 1
    1. 运行上面创建的docker image
    docker run --name jenkins-blueocean --restart=on-failure --detach \
      --network jenkins --env DOCKER_HOST=tcp://docker:2376 \
      --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 \
      --publish 8080:8080 --publish 50000:50000 \
      --volume jenkins-data:/var/jenkins_home \
      --volume jenkins-docker-certs:/certs/client:ro \
      jenkins:2.346.3-jdk11
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这里面最要注意的是 --publish,这两个当于建立本地和docker的端口映射,前面后面,前面一个是本地端口,后面一个是docker的端口。
    最后一个是第5步建立image的名称

    至此, 我们可以通过已经在docker中运行起来了jenkins, 如何查看当前有哪些docker呢?在terminal中执行:

    docker ps -a
    
    • 1

    在这里插入图片描述

    二、登录使用Jenkins

    登录:

    1. 前面已经在docker中把Jenkins运行起来了
      接下来可以登录Jenkins并使用其功能
      在浏览器中输入: http://localhost:8080,会需要输入密码:
      在这里插入图片描述
      我们可以通过以下命令获取:
    #jenkins-blueocean 是docker的名字
    docker logs jenkins-blueocean
    cat /var/jenkins_home/secrets/initialAdminPassword
    
    • 1
    • 2
    • 3

    复制下来就可以登录了

    创建用户

    Name: Ekin
    Password: *******
    Full name: Ekin
    Email: 53610289@qq.com
    
    • 1
    • 2
    • 3
    • 4
    1. 安装好很多的插件后,就可以看到这样的(我这里是已经加了一个job):
      在这里插入图片描述

    创建一个新的job, 点击“new Item”, 选择Multibranch Pipeline.

    在这里插入图片描述
    6. 在Branch Source中选择github, 同事也需要创建credential用来登录github和执行job,以及填入项目git的URL.
    而Credentials对于System和Global两种的区别是:

    Global - if the credential/s to be added is/are for a Pipeline project/item. Choosing this option applies the scope of the credential/s to the Pipeline project/item “object” and all its descendent objects. (Pipeline等通用的选择这个)

    System - if the credential/s to be added is/are for the Jenkins instance itself to interact with system administration functions, such as email authentication, agent connection, etc. Choosing this option applies the scope of the credential/s to a single object only. (对Jenkins系统本身的设置相关的选择System)

    还有一个是只作用Job本身的Credentials, 等创建完job后可以看到
    在这里插入图片描述
    Build设置通过Jenkinsfile:
    在这里插入图片描述
    这样就添加好了一个Job

    添加Jenkinsfile

    1. 但是我们希望的是Jenkins能够去执行job,这里就需要再github的项目中添加一个文件:Jenkinsfile,内容大致像这样,然后提交代码。具体如何编写一个Jenkinsfile可以参考这里
    pipeline {
    //     agent any
        agent {
            docker {
                image 'node:16-alpine3.15'
                args '-p 3000:3000'
            }
        }
    
        stages {
            stage('Build') {
                steps {
                    echo 'Building..'
                    sh 'PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true yarn install'
                    echo 'Finished Built..'
                }
            }
            stage('Test') {
                steps {
                    echo 'Testing..'
    //                 sh 'yarn dev'
                    
                }
            }
            stage('Deploy') {
                steps {
                    echo 'Deploying....'
                }
            }
        }
    }
    
    • 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
    1. 点击项目中 Scan Repository Now,就会生成一个执行任务
      在这里插入图片描述 9. 点击Build/ Test /Deploy这几个步骤就可以查看里面的具体的log,支持基本完成CI设置。

    自动触发Job

    10 : 但我希望的提交代码后能够自动执行job,那这个需要再哪里设置呢?
    有两种方式可以选择:
    a. github webhook push的方式: 在github上设置回调url(这个url是jenkins上的),当有新的代码提交后,它会触发回调,执行相应的job。
    Jenkins系统配置 --> github进行设置,获取到webhook url,然后在github项目settings-> webhook设置jenkins的回调url,由于是本地建立的localhost,没法成功回调,要求是通过域名回调。
    b. 在Jenkins定时执行job,从github上pull code执行job。我们可以选择这种方式
    在这里插入图片描述

    总结

    本篇介绍了如何在Docker中建立Jenkins,以及在Jenkins建立一个job,使其在代码提交时可以自动触发任务,这个任务的定义步骤在Jenkinsfile中定义,Jenkinsfile中可做较多的事情:比如几个步骤stage,像我们常做的事情,跑单测, build项目,测试环境自动化,uat环境测试,以及跑完自动化用例后,通过脚本更新结果,部署代码到生产环境等。

    后续:

    2. gitlab搭建

    3. docker

    4. k8s

    5. sonar 代码扫描

    6. jacoco 代码覆盖率

  • 相关阅读:
    Scala的字符串插值
    基于若依ruoyi-nbcio支持flowable流程角色,同时修改流转用户为username,流程启动做大调整(二)
    vue中插槽slot
    设计模式- 模板方法模式(Template Method Pattern) 结构|原理|优缺点|场景|示例
    脉宽调制(PWM)开关驱动
    spring framework 5.2 文档 - 概述
    RocketMQ consumer 和 queue 对应关系
    MyBatis整合Spring的原理分析
    单片机第三季-第三课:STM32开发板原理图、配置、浮点运算单元
    《牛客题霸-算法篇》刷题之NC339 翻转单词
  • 原文地址:https://blog.csdn.net/kielin/article/details/126452542