jenkins总结

介绍

jenkins是非常出名的持续集成工具,在很多公司都有使用。

file

  1. 基于SCM(source code managment)比如git的webhook,有代码提交,jenkins就把代码checkout出来。
  2. 进行单元测试。
  3. 根据单测的覆盖率来进行质量控制。
  4. 部署到测试环境。
  5. 集成测试。
  6. 打包成release。
  7. 部署到预发环境。
  8. 验收测试。
  9. 部署到生产环境。

k8s完整CI/CD流程

  1. 开发写好代码提交PR。
  2. 代码构建,单元测试,E2E(端到端)测试,代码review。
  3. 代码merge合并到主分支或者release分支。
  4. release分支就绪后,发布官方编译的版本Official Build。
  5. 根据release进行E2E,集成测试,把所有能力进行一次回归。
  6. k8s本身是可能升级的,有些场景可能需要测试升级动作。
  7. 测试环境–预发环境–生产环境进行持续部署。

file

持续集成容器化

  1. 最主要解决的问题是保证CI构建环境和开发构建环境的统一。
  2. 使用容器作为标准的构建环境,将代码库作为 Volume 挂载进构建容器。
  3. 由于构建结果是由jenkins slave pod输出的Docker镜像,所以要在构建容器中执行 "docker build” 命令,这就需要注意DIND的问题。

docker in docker

  1. dind镜像
    https://hub.docker.com/search?q=docker%3Adind
    docker run –privileged -d docker:dind

    可能引入的问题

    • 容器内外存储不能相同。
    • 内部容器使用了安全配置后可能导致外部容器故障。
  2. mount host docker.socket
    docker run -v /var/run/docker.sock:/var/run/docker.sock….

    什么是/var/run/docker.sock?

    • /var/run/docker.sock是默认的Unix套接字。套接字用于在同一主机上的进程之间进行通信。Docker守护程序默认情况下侦听docker.sock。在运行Docker daemon的主机上,则可以使用/var/run/docker.sock管理容器。
    • 从容器中执行docker命令来构建镜像并将其推送到镜像仓库。在这里,实际的docker操作发生在运行docker容器的VM主机上,而不是在容器内部进行。意思是,即使您正在容器中执行docker命令,也只是Docker客户端通过docker.sock方式连接到VM主机docker-engine。

    可能引入的问题

    • 安全性的问题,挂载同样的docker.sock,相当于主机上所有的容器都在运行CI job,如果有恶意的用户,就可以破坏掉其他容器的镜像。
    • 可以通过权限控制来避免。让用户看不到slave pod。
  3. 一个栗子
    ci容器通过挂载dind容器作为sidecar,再通过emptyDir让ci容器可以通过unix socket访问到dind容器

    apiVersion: v1
    kind: Pod
    metadata:
    name: ci
    spec:
    containers:
    - name: dind
    image: 'docker:stable-dind'
    command:
    - dockerd
    - --host=unix:///var/run/docker.sock
    - --host=tcp://0.0.0.0:8000
    securityContext:
      privileged: true
    volumeMounts:
    - mountPath: /var/run
      name: dind
    - name: ci
    ...
    volumeMounts:
    - mountPath: /var/run
      name: dind
    volumes:
    - name: dind
    emptyDir: {}

kaniko

https://github.com/GoogleContainerTools/kaniko
kaniko 是一个在容器或 Kubernetes 集群内从 Dockerfile 构建容器镜像的工具。kaniko 不依赖于 Docker 守护进程,并且完全在用户空间中执行 Dockerfile 中的每个命令。

docker run \
    -v "$HOME"/.config/gcloud:/root/.config/gcloud \
    -v /path/to/context:/workspace \
    gcr.io/kaniko-project/executor:latest \
    --dockerfile /workspace/Dockerfile \
    --destination "gcr.io/$PROJECT_ID/$IMAGE_NAME:$TAG" \
    --context dir:///workspace/

基于k8s的持续集成

  1. jenkins根据webhook检测到pr的提交,启动job来进行构建。
  2. jenkins master是不干活的,只提供一个前端和后端服务,前端给用户使用。job运行完成后,master向k8s要一个pod。jenkins读取pod模版,发送给k8s,然后k8s启动jenkins slave pod。
  3. slave pod连接到jenkins master,下载jnlp配置文件来运行job。

file

Jenkins部署

安装jenkins chart

helm search repo jenkins

file

helm pull stable/jenkins
tar xvf jenkins-2.5.2.tgz
# 设置存储卷
vim value.yaml
storageClass: nfs-client
helm install jenkins ./ -n jenkins

file

查看部署情况

k get pvc,pv -n jenkins | grep jenkins

file

k get all -n jenkins

file

生成ingress证书

openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/C=CN/ST=ZheJiang/L=zhejiang/O=wghdr/OU=Personal/CN=jenkins.wghdr.top" -days 5000 -out ca.crt
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/C=CN/ST=ZheJiang/L=zhejiang/O=wghdr/OU=Personal/CN=jenkins.wghdr.top" -out server.csr
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
# 创建secret
kubectl create secret tls jenkins.wghdr.top --key server.key --cert server.crt -n jenkins
k get secret -n jenkins

file

创建ingress

cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: jenkins-ingress
  namespace: jenkins
spec:
  ingressClassName: nginx
  rules:
  - host: jenkins.wghdr.top
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: jenkins
            port:
              number: 8080
  tls:
   - hosts:
     - jenkins.wghdr.top
     secretName: jenkins.wghdr.top

k apply -f ingress.yaml
k get ingress -n jenkins

file

获取admin密码

Get your 'admin' user password by running:
  printf $(kubectl get secret --namespace jenkins jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo

获取jenkins链接

如果没有用ingress可以使用下面的方法,也可以修改jenkins的svc为nodePort,通过ip:nodePort来访问。

Get the Jenkins URL to visit by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace jenkins -l "app.kubernetes.io/component=jenkins-master" -l "app.kubernetes.io/instance=jenkins" -o jsonpath="{.items[0].metadata.name}")
  echo http://127.0.0.1:8080
  kubectl --namespace jenkins port-forward $POD_NAME 8080:8080

设置中文

  1. 插件管理->安装Locale plugin->Localization Support Plugin->Localization: Chinese (Simplified)。
    file
  2. 系统管理->系统配置->Locale->输入zh_cn,勾选下面的选项。
    file

修改密码

  1. Configure Global Security->Jenkins’ own user database。
    file
  2. 用户列表->admin->设置->修改密码。
    file

连接到k8s

  1. 先安装kubernets插件。
    file

  2. Manage Nodes and clouds,Configure Clouds。
    Kubernetes URL: https://kubernetes.default
    Kubernetes Namespace: jenkins(jenkins安装的ns)
    Credentials: Add->Jenkins->Kind: Kubernetes Service Account
    file

  3. Jenkins 地址
    http://jenkins:8080
    Jenkins 通道
    jenkins-agent:50000
    file

  4. slave pod 模版
    label:jenkins/jenkins-jenkins-slave
    file

  5. 容器模版
    Name: jnlp
    Image: jenkins/inbound-agent:4.3-4
    Command: $fcomputer jnlpmac} $fcomputer.namej
    file

  6. 保存

创建测试job

  1. Dashboard->新建item->Freestyle project
    file
  2. 限制项目的运行节点->标签表达式->jenkins-jenkins-slave
    file
  3. 构建->执行命令-> echo this is a test-item.->保存
    file
  4. build now
    相当于给jenkins一个指令,去启动jenkins slave pod来运行test-item的job。
    file
  5. 查看pod
    file
  6. 构建成功
    file
  7. 查看构建日志(控制台输出)
    file
  8. 查看slave pod已自动删除
    file
0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部
0
希望看到您的想法,请您发表评论x