Jenkins安装与实践

Jenkins是一款由Java编写的开源的持续集成工具。在与Oracle发生争执后,项目从Hudson项目复刻。

Jenkins提供了软件开发的持续集成服务。它运行在Servlet容器中(例如Apache Tomcat)。它支持软件配置管理(SCM)工具(包括AccuRev SCM、CVS、Subversion、Git、Perforce、Clearcase和RTC),可以执行基于Apache Ant和Apache Maven的项目,以及任意的Shell脚本和Windows批处理命令。Jenkins的主要开发者是川口耕介。Jenkins是在MIT许可证下发布的自由软件。

可以通过各种手段触发构建。例如提交给版本控制系统时被触发,也可以通过类似Cron的机制调度,也可以在其他的构建已经完成时,还可以通过一个特定的URL进行请求。

安装Jenkins

安装Jenkins的同时我们部署一个“节点”(slave),后期我们将这个“节点”信息配置在Jenkins中,让Jenkins在进行CI时就在这个“节点”中进行。

  • 场景1:单机docker-compose部署

    • docker-compose.yml文件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      version: '3'
      services:
      jenkins:
      restart: always
      image: jenkinsci/jenkins:2.147-alpine
      ports:
      - "8080:8080"
      volumes:
      - ./data/jenkins_home:/var/jenkins_home
      jenkins-slave:
      restart: always
      image: setzero/jenkins-slave:0.1.0
      depends_on:
      - jenkins
      volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    • 启动命令

      1
      docker-compose up -d
  • 场景2:Kubernetes集群部署

    • deploy.yml文件

      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
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      apiVersion: extensions/v1beta1
      kind: Deployment
      metadata:
      labels:
      app: jenkins
      name: jenkins
      spec:
      replicas: 1
      selector:
      matchLabels:
      app: jenkins
      template:
      metadata:
      labels:
      app: jenkins
      spec:
      containers:
      - image: jenkinsci/jenkins:2.147-alpine
      imagePullPolicy: IfNotPresent
      name: jenkins
      ports:
      - containerPort: 8080
      protocol: TCP
      resources:
      limits:
      memory: 3Gi
      requests:
      memory: 2Gi
      volumeMounts:
      - mountPath: /var/jenkins_home
      name: jenkins
      volumes:
      - emptyDir: {}
      name: jenkins
      ---
      apiVersion: v1
      kind: Service
      metadata:
      labels:
      app: jenkins
      name: jenkins
      spec:
      ports:
      - name: http
      port: 8080
      protocol: TCP
      targetPort: 8080
      selector:
      app: jenkins
      type: ClusterIP
      ---
      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
      labels:
      app: jenkins
      name: jenkins
      spec:
      rules:
      - host: 1.2.3.4.nip.io
      http:
      paths:
      - backend:
      serviceName: jenkins
      servicePort: 8080
      path: /
      ---
      apiVersion: extensions/v1beta1
      kind: Deployment
      metadata:
      labels:
      app: jenkins-slave
      name: jenkins-slave
      spec:
      replicas: 1
      selector:
      matchLabels:
      app: jenkins-slave
      template:
      metadata:
      labels:
      app: jenkins-slave
      spec:
      containers:
      - image: setzero/jenkins-slave:0.1.0
      imagePullPolicy: IfNotPresent
      name: jenkins-slave
      ports:
      - containerPort: 22
      protocol: TCP
      resources:
      limits:
      memory: 2Gi
      requests:
      memory: 1Gi
      volumeMounts:
      - mountPath: /var/run/docker.sock
      name: docker-sock
      volumes:
      - hostPath:
      path: /var/run/docker.sock
      name: docker-sock
      ---
      apiVersion: v1
      kind: Service
      metadata:
      labels:
      app: jenkins-slave
      name: jenkins-slave
      spec:
      ports:
      - name: http
      port: 22
      protocol: TCP
      targetPort: 22
      selector:
      app: jenkins-slave
      type: ClusterIP
    • 部署命令

      1
      kubectl apply -f deploy.yml -n jenkins

配置Jenkins

Jenkins启动后需要到容器中cat一下/var/jenkins_home/secrets/initialAdminPassword文件,查看初始密码。

  • 安装插件,选择默认的就好了

  • 配置“节点”,在安装Jenkins时我们同时部署了一个slave容器,我们将后面CI时会使用到的工具全部打包到此镜像中,这样做的目的就在于后期进行迁移或者重新搭建一套时环境是一致的。通过菜单系统管理–>节点管理–>New Node

这里slave容器的root用户默认密码为root,也可使用ROOT_PASSWORD环境变量在启动slave容器时进行设置,关于Jenkins-slave镜像的更多信息请查看:https://github.com/TimeBye/jenkins-slave

  • 查看连接状态

  • 安装插件

实战

  • 新建任务,选择流水线

  • 填写Gitlab仓库地址

  • 生成Secret Token,等会儿Gitlab WebHook配置时会用到它

  • 编写CI要执行的语句

  • 在Gitlab中配置 WebHook

  • 创建成功进行测试

    • Gitlab页面顶部出现测试结果

    • 返回Jenkins就可以看到自动执行CI的记录了

setzero wechat