这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战
jira+gitlab+kubernetes全链路打通
现有DevOps工具链及流程:
- jira提交部署走流程
- 执行脚本生产k8s声明yaml文件
- 修改gitlab ci/cd文件
- 完成部署
- 增加A记录
- 思考现有流程问题
- 开发人员提jira,在走完流程后需要手动生成yaml文件(这里有两次确认)
- 除了构建及部署,其他为手动,如果在很多项目时很浪费时间属于琐事(这块需要自动化)
- 入口很多需要jira提任务,需要gitlab打tag等(这里一个部署任务频繁切换到不同工具才能完成)
根据上面思考做出改进
- 只需要在jira中操作,一次确认
- 确认后不需要认为介入即可完成
- 效果就是jira流程审批完成后访问
实现
- 主要是增加第三方工具完成接收jira数据并完成k8s应用创建
- jira中增加自定义字段,提供所需部署数据
- 添加webhook 发送post到第三方工具
- 第三方工具主要采用client-go库 和gin完成
第三方工具部分代码
- 创建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
}
未来
- 目前主要完成首次部署(因为公司总有很多定制化项目所以,首次部署任务挺多的)
- 把生产打tag接入到jira,现在是开发提完jira还需要跑到gitlab打tag完成
- 需要第三方工具更加完善,灵活