jira+kubernetes全链路打通

708 阅读2分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

jira+gitlab+kubernetes全链路打通

现有DevOps工具链及流程:

  1. jira提交部署走流程
  2. 执行脚本生产k8s声明yaml文件
  3. 修改gitlab ci/cd文件
  4. 完成部署
  5. 增加A记录
  • 思考现有流程问题
  1. 开发人员提jira,在走完流程后需要手动生成yaml文件(这里有两次确认)
  2. 除了构建及部署,其他为手动,如果在很多项目时很浪费时间属于琐事(这块需要自动化)
  3. 入口很多需要jira提任务,需要gitlab打tag等(这里一个部署任务频繁切换到不同工具才能完成)

根据上面思考做出改进

  1. 只需要在jira中操作,一次确认
  2. 确认后不需要认为介入即可完成
  • 效果就是jira流程审批完成后访问

实现

  • 主要是增加第三方工具完成接收jira数据并完成k8s应用创建
  1. jira中增加自定义字段,提供所需部署数据
  2. 添加webhook 发送post到第三方工具
  3. 第三方工具主要采用client-go库 和gin完成

第三方工具部分代码

  1. 创建deployment
// Create backend deployment
func (d *K8sDeployment) CreateBackendDeployment() error {
	deploymentsClient := d.ClientSet.AppsV1().Deployments(d.NameSpace)
	deployment := &appsv1.Deployment{
		ObjectMeta: metav1.ObjectMeta{
			Name: d.App,
		},
		Spec: appsv1.DeploymentSpec{
			Replicas: int32Ptr(1),
			Selector: &metav1.LabelSelector{
				MatchLabels: map[string]string{
					"app": d.App,
				},
			},
			Template: apiv1.PodTemplateSpec{
				ObjectMeta: metav1.ObjectMeta{
					Labels: map[string]string{
						"app": d.App,
					},
				},
				Spec: apiv1.PodSpec{
					Containers: []apiv1.Container{
						{
							EnvFrom: []apiv1.EnvFromSource{
								{
									ConfigMapRef: &apiv1.ConfigMapEnvSource{
										LocalObjectReference: apiv1.LocalObjectReference{Name: d.ConfigMap},
										Optional:             nil,
									},
								},
							},
							Name:            d.App,
							Image:           d.Image,
							ImagePullPolicy: apiv1.PullIfNotPresent,
							Ports: []apiv1.ContainerPort{
								{
									Name:          "http",
									Protocol:      apiv1.ProtocolTCP,
									ContainerPort: d.ContainerPort,
								},
							},
						},
					},
					ImagePullSecrets: []apiv1.LocalObjectReference{
						{Name: "regcred"},
					},
				},
			},
		},
	}
	fmt.Println("Creating deployment...")
	result, err := deploymentsClient.Create(context.TODO(), deployment, metav1.CreateOptions{})
	if err != nil {
		panic(err)
	}
	fmt.Printf("Created deployment %q.\n", result.GetObjectMeta().GetName())
	return nil
}

未来

  • 目前主要完成首次部署(因为公司总有很多定制化项目所以,首次部署任务挺多的)
  1. 把生产打tag接入到jira,现在是开发提完jira还需要跑到gitlab打tag完成
  2. 需要第三方工具更加完善,灵活