go程序基于阿里云CodePipeline的一次devops实践

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 背景 最近朋友有个项目代码托管用的码云,测试服务器(阿里云ECS)只有一台,三四个人开发,于是想基于阿里云的CodePipeline快速打造一套自动化cicd的流程,使用docker来进行多套环境部署。

背景

最近朋友有个项目代码托管用的码云,测试服务器(阿里云ECS)只有一台,三四个人开发,于是想基于阿里云的CodePipeline快速打造一套自动化cicd的流程,使用docker来进行多套环境部署。

CodePipeline 介绍

阿里云CodePipeline是兼容Jenkins标准的、提供快速可靠的持续集成与持续交付服务。基于容器技术和阿里云基础服务架构,提供稳定和安全的代码/Docker编译构建,测试,扫描和部署的工具服务,并提供Pipeline As Code的编码级配置模式,满足应用程序和基础设施快速可靠的交付和更新。


上面是阿里云的官方介绍,兼容jekins的标准,一次无意的点击出现了下图的图标,感觉就是jenkins的基础上做了一次二次开发。

新建构建项目

构建项目基本配置

基本信息配置


由于项目使用到了一些国外的lib,当然选择国内的节点也是可以的,不过在写Dockerfile的时候记得加上代理。

源码管理配置


选择合适的代码仓库,也可以是私仓,不过需要配上自己的账号和ssh key相关信息。

构建配置

我这里使用的是阿里云的私有的镜像仓库基于Dockerfile来构建镜像,注意配置凭证。
![在这里插入图片描述]

项目目录
gin_demo
├── app
│   └── app.go
├── conf
│   └── app.ini
├── Dockerfile
├── docs
│   └── sql
│       └── mjs.sql
├── go.mod
├── go.sum
├── main.go
├── middleware
│   ├── jwt
│   │   └── jwt.go
│   └── logging
│       └── logger.go
├── mjs.exe
├── models
│   ├── mongo
│   │   └── db.go
│   └── mysql
│       ├── db.go
│       ├── teacher.go
│       └── user.go
├── pkg
│   ├── app
│   │   ├── form.go
│   │   ├── request.go
│   │   └── response.go
│   ├── def
│   │   └── def.go
│   ├── e
│   │   ├── code.go
│   │   ├── def.go
│   │   └── msg.go
│   ├── file
│   │   └── file.go
│   ├── gredis
│   │   └── redis.go
│   ├── logging
│   │   ├── file.go
│   │   └── log.go
│   ├── setting
│   │   └── setting.go
│   ├── upload
│   │   └── image.go
│   └── util
│       ├── jwt.go
│       ├── md5.go
│       ├── pagination.go
│       └── util.go
├── README.en.md
├── README.md
├── routers
│   ├── api
│   │   └── v1
│   └── router.go
├── runtime
│   └── logs
│       ├── log20190528.log
│       └── log20190529.log
└── service
    ├── teacher_service
    │   └── teacher.go
    └── user_service
        └── user.go
Dockerfile
FROM golang:1.12.4 as build

#ENV GOPROXY https://goproxy.io 

WORKDIR /go/cache

ADD go.mod .
ADD go.sum .
RUN go mod download

WORKDIR /go/release

ADD . .

RUN GOOS=linux CGO_ENABLED=0 go build -ldflags="-s -w" -installsuffix cgo -o gin_demo main.go

FROM scratch as prod

COPY --from=build /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY --from=build /go/release/gin_demo /
COPY --from=build /go/release/conf ./conf
CMD ["/gin_demo"]

注:如果选择国内节点构建必须配上代理 ENV GOPROXY https://goproxy.io

配置触发器


这里选择一个构建的代码分支,然后点击生成,将生成后的url可以在对应的代码仓库配上webhook之类的配置。选择合适的触发方式。

配置部署


阿里云构建步骤里面部署到ECS上(不方便)和部署到k8s(收费)都不能满足项目场景需求,不过上面支持shell脚本,于是自己想在朋友的那台阿里云ECS上跑个ci的web server,这里构建完之后就去通知下这个接口,然后去执行一些docker指令的脚本,拉取构建完之后的镜像并且重新启动,启动完之后邮件通知。于是写了这样一个很简单的web server。
main

package main

import (
    "fmt"
    "log"
    "net/http"
    "os/exec"
    "path"
)

/*
* @Author:hanyajun
* @Date:2019/5/28 16:44
* @Name:ci_tools
* @Function: ci 工具
 */

//
func HandleCi(w http.ResponseWriter, req *http.Request) {
    user := path.Base(req.URL.Path)
    //针对不同开发人员的push拉取不同的镜像和映射不同的端口
    var port string
    switch user {
    case "zhangsan":
        port = "8088"
    case "lisi":
        port = "8087"
    case "wangmazi":
        port = "8086"
    case "dev":
        port = "8085"
    case "master":
        port = "8084"

    }
    println(user)
    result := Run(user,port)
    client:=NewMailClient("smtp.qq.com",465,"******@qq.com","*********")//注意使用465 ssl发送,25端口阿里云ecs禁止了。
    s:=&SendObject{
        ToMails:[]string{"******@qq.com","******@qq.com","******@qq.com"},
        CcMails:[]string{"******@qq.com"},
        Object:"cicd流程结果通知",
        ContentType:"text/html",
        Content:user+" has push something to the branch: "+user+"\n"+"result: "+string(result),
    }
    err:=client.SendMail(s)
    if err!=nil{
        println("send mail fail",err)
    }
    _, _ = w.Write(result)
}
func main() {
    http.HandleFunc("/ci/", HandleCi)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

func Run(user string,port string) []byte {

    shellPath := "/root/ci/ci.sh"
    command := exec.Command(shellPath, user,port) 
    err := command.Start()                   
    if nil != err {
        fmt.Println(err)
        return []byte(err.Error())
    }
    fmt.Println("Process PID:", command.Process.Pid)
    err = command.Wait() //等待执行完成
    if nil != err {
        fmt.Println(err)
        return []byte(err.Error())
    }
    fmt.Println("ProcessState PID:", command.ProcessState.Pid())
    return []byte("success")
}

mail.go

package main

import (
    "fmt"
    "gopkg.in/gomail.v2"
)

/*
* @Author:15815
* @Date:2019/5/8 17:47
* @Name:mail
* @Function:邮件发送
 */

type Client struct {
    Host     string
    Port     int
    Mail     string
    Password string
}

type SendObject struct {
    ToMails     []string
    CcMails     []string
    Object      string
    ContentType string
    Content     string
}

func NewMailClient(host string, port int, sendMail, password string) *Client {
    return &Client{
        Host:     host,
        Port:     port,
        Mail:     sendMail,
        Password: password,
    }
}
func (m *Client) SendMail(s *SendObject) error {
    mgs := gomail.NewMessage()
    mgs.SetHeader("From", m.Mail)
    mgs.SetHeader("To", s.ToMails...)
    mgs.SetHeader("Cc", s.CcMails...)
    mgs.SetHeader("Subject", s.Object)
    mgs.SetBody(s.ContentType, s.Content)
    d := gomail.NewDialer(m.Host, m.Port, m.Mail, m.Password)
    if err := d.DialAndSend(mgs); err != nil {
        fmt.Printf("send mail err:%v", err)
        return err
    }
    return nil
}

ci.sh

#!/bin/bash
funCiTools()
{
    docker pull registry.cn-shanghai.aliyuncs.com/***/***:$1
    docker rm -f $1
    docker run -d -p $2:8000 --name $1 registry.cn-shanghai.aliyuncs.com/***/***:$1
}
funCiTools $1 $2

第一个参数是对应开发人员启动容器的名字以及构建镜像的tag和上面构建的配置一致,第二个参数是映射的端口。
构建ci_web_server

自己的电脑是windows的,朋友的阿里云ecs上又没有go环境,想构建基于linux的二进制程序,于是直接利用docker image 来构建了镜像,一个指令解决问题。
build.sh

docker run --rm -i -v `pwd`:/go/src/ci -w /go/src/ci  golang:1.11.5   go build -o ci  ci

使用nohup直接将ci server放置后台运行。

nohup ./ci  >output 2>&1 &

效果测试

直接修改点东西提交代码后就等邮件通知了,是不是感觉很爽。

提交完代码后就开始触发构建了。

最后构建完完成后触发ci server 进行deploy,完成邮件通知。

登录到阿里云Ecs上我们发现我们的容器已经启动成功了。

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
关系型数据库 MySQL Java
通过使用阿里云服务器,搭建Java程序的运行环境
通过使用阿里云服务器,搭建Java程序的运行环境
|
4天前
|
存储 监控 Apache
查询提速11倍、资源节省70%,阿里云数据库内核版 Apache Doris 在网易日志和时序场景的实践
网易的灵犀办公和云信利用 Apache Doris 改进了大规模日志和时序数据处理,取代了 Elasticsearch 和 InfluxDB。Doris 实现了更低的服务器资源消耗和更高的查询性能,相比 Elasticsearch,查询速度提升至少 11 倍,存储资源节省达 70%。Doris 的列式存储、高压缩比和倒排索引等功能,优化了日志和时序数据的存储与分析,降低了存储成本并提高了查询效率。在灵犀办公和云信的实际应用中,Doris 显示出显著的性能优势,成功应对了数据增长带来的挑战。
查询提速11倍、资源节省70%,阿里云数据库内核版 Apache Doris 在网易日志和时序场景的实践
|
4天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器化技术融合实践
【5月更文挑战第6天】随着企业IT架构的复杂化以及快速迭代的市场需求,传统的运维模式已难以满足高效率和高质量的交付标准。本文将探讨如何通过结合DevOps理念和容器化技术来构建一个高效的自动化运维体系,旨在实现持续集成、持续部署和自动化管理,提升系统的可靠性、可维护性和敏捷性。
|
6天前
|
消息中间件 Go API
Golang深入浅出之-Go语言中的微服务架构设计与实践
【5月更文挑战第4天】本文探讨了Go语言在微服务架构中的应用,强调了单一职责、标准化API、服务自治和容错设计等原则。同时,指出了过度拆分、服务通信复杂性、数据一致性和部署复杂性等常见问题,并提出了DDD拆分、使用成熟框架、事件驱动和配置管理与CI/CD的解决方案。文中还提供了使用Gin构建HTTP服务和gRPC进行服务间通信的示例。
22 0
|
9天前
|
运维 Kubernetes Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第1天】 随着云计算的普及和企业数字化转型的加速,传统的IT运维模式已无法满足快速迭代和高可用性的要求。本文探讨了如何通过DevOps文化和容器化技术的融合来构建一个高效、稳定且可扩展的云基础设施。文章首先回顾了DevOps的核心理念及其对运维工作的影响,随后详细介绍了容器化技术的基本概念、优势以及在现代云环境中的关键作用。接着,文中以一系列真实案例为基础,分析了将DevOps与容器化相结合时所面临的挑战和解决方案,并提出了一套实施框架。最后,文章总结了这种融合实践对提高运维效率、加快产品上市速度和保障系统稳定性的积极影响,同时对未来的技术趋势进行了展望。
|
10天前
|
Kubernetes Devops Docker
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【4月更文挑战第30天】 在当今快速迭代和持续交付的软件发展环境中,传统的IT运维模式已不足以满足企业对效率和稳定性的双重需求。本文将深入探讨如何通过整合DevOps理念和容器化技术来构建一个既高效又稳定的云基础设施。文中不仅阐述了DevOps的核心原则、流程自动化的重要性以及容器化技术的基础知识,还提供了一个详细的实施案例,帮助读者理解这两种技术如何协同工作,以支持复杂的应用程序部署和管理。
|
10天前
|
测试技术 块存储 开发者
阿里云块存储团队软件工程实践
本文介绍了阿里云团队软件工程实际开发流程,并简述了开发过程中遇到的一些问题。且附带案例,以及遇到案例中出现的情况应当如何应对。
|
10天前
|
存储 缓存 监控
【Go语言专栏】Go语言应用的性能调优实践
【4月更文挑战第30天】本文介绍了Go语言应用的性能调优技巧,包括使用`pprof`进行性能分析、选择正确算法与数据结构、减少内存分配、优化并发及避免阻塞操作、选用合适锁机制。此外,文章还提到了编译选项如`-trimpath`和`-ldflags`,以及系统资源和环境调优。通过实例展示了代码优化、并发处理和锁的使用。最后,推荐了进一步学习资源,鼓励读者深入探索Go语言的性能优化。
|
10天前
|
运维 Devops 持续交付
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【4月更文挑战第30天】 随着云计算的普及和企业数字化转型的深入,传统的IT运维模式已无法满足快速迭代和高可用性的要求。本文将探讨如何通过融合DevOps理念和容器化技术,构建一套高效、稳定且易于管理的云基础设施。文章首先概述了DevOps的基本概念及其在现代IT管理中的重要性,接着介绍了容器化技术的核心组件和优势,最后详细阐述了如何整合这两种技术以提高系统的稳定性和自动化程度,实现持续集成和持续部署(CI/CD),并通过真实案例分析展示了该融合策略的有效性。
|
10天前
|
运维 Devops 持续交付
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【4月更文挑战第30天】 在当今数字化转型的浪潮中,企业对IT基础设施的要求越来越高。本文将探讨如何通过整合DevOps理念和容器化技术,构建一个既能快速响应市场变化,又能保证系统高效稳定运行的云基础设施。我们将分析DevOps文化的重要性,容器化技术的选型,以及二者结合带来的优势,同时提供具体的实施策略和案例分析,以帮助企业实现持续集成、持续部署(CI/CD)和微服务架构的落地。

热门文章

最新文章