最小化DevOps自动化流程(Golang)

简介: Why?为什么要做自动化流程?在开发过程中,我们在本地机器上做开发,完成一次功能迭代之后,如何发布到远程产品服务器一直是个很头疼的问题。最通常的做法就是使用(S)FTP把代码(或者代码压缩包)覆盖到服务器上。

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

  • Why?

为什么要做自动化流程?

在开发过程中,我们在本地机器上做开发,完成一次功能迭代之后,如何发布到远程产品服务器一直是个很头疼的问题。最通常的做法就是使用(S)FTP把代码(或者代码压缩包)覆盖到服务器上。这样的做法虽然“直截了当”,但是容易出错,而且全程需要人为干预。(笔者亲历过其他项目部门的负责人过来求助,说发布时拷贝代码到服务器的过程中,服务器突然宕机没有反应。)所以我们需要一种方式帮助我们完成代码发布的整个过程。有非常多的第三方工具帮助我们实现流程自动化的目的。
我们要完成的目标是:1,无人干预;2,缩短发布时间,减少发布时期存在的风险;3,增加项目迭代效率。

  • What?

用什么工具来做自动化流程?

git, github(gitlab)

  • When?

在什么时机下创建自动化流程?

理论上是在第一次发布项目到服务器之前就需要做自动化流程。但是根据迭代开发的思想,我们在创建项目的时候就应该开始着手创建自动化流程。

  • How?

如何创建一个最小化的自动化流程?

我们通过三部实现开发部署流程自动化。

  1. 创建版本仓库

笔者使用Gitlab创建一个名为DevOps的私有仓库.
img_6372424582df82e68816696d7bb1122b.png
new gitlab repo

接着clone 远程仓库到本地开发机器.
如果你还没有创建任何项目代码文件。此时可以使用命令:

git clone git@gitlab.com:EdisonLeung/devops.git
cd devops
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master 

如果您已经开始了本地机器上的编码工作,此时可以在项目目录下使用命令:

git init
git remote add origin git@gitlab.com:EdisonLeung/devops.git
git add .
git commit -m "Initial commit"
git push -u origin master

如果您不光在本地开始了编码工作,同时在本地已经创建了git仓库.此时可以在项目目录下使用命令:

git remote rename origin old-origin
git remote add origin git@gitlab.com:EdisonLeung/devops.git
git push -u origin --all
git push -u origin --tags

最后在服务器clone我们的版本仓库(记得添加服务器SSH Key到Gitlab):

cd ~/www
git clone git@gitlab.com:EdisonLeung/devops.git

clone完成:

root@aliyun:~/www# git clone git@gitlab.com:EdisonLeung/devops.git
Cloning into 'devops'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.

目前我们从项目开发到项目部署有三个动作要手动做:
a) 本地机器git push到远程仓库
b) 远程服务器git pull拉去远程仓库版本
c) 重启webserver服务
第二步我们就要将这三个动作自动化。

  1. 创建自动化部署脚本

创建deploy目录,并创建两个文件,main.go和deploy.sh:


img_5ddd037e5f93a3e36e7b93ce012fe358.png
目录结构

deploy.go

package main

import (
    "io"
    "log"
    "net/http"
    "os/exec"
)

func relaunching() {
    cmd := exec.Command("sh", "./deploy.sh")
    err := cmd.Start()
    if err != nil {
        log.Fatal(err)
    }
    err = cmd.Wait()
}

func restart(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "<h1>deploy server: restarting webserver...</h1>")
    relaunching()
    io.WriteString(w, "<h1>deploy server: webserver restarted!</h1>")
}

func main() {
    http.HandleFunc("/", restart)
    http.ListenAndServe(":5000", nil)
}

当服务器5000端口被访问时,http.HandleFunc会创建路由调用restart函数relaunching函数,调用过程中在浏览器输出启动过程.
最终relaunching函数调用命令行deploy.sh来重启webserver.
deploy.sh脚本内容如下:

#! /bin/sh

kill -9 $(pgrep webserver)
cd ~/www/devops
git pull git@gitlab.com:EdisonLeung/devops.git
./webserver &

再创建一个main.go来启动一个最小web页面:


img_2e932d8bc07b0b462e92112a7efb70ff.png
webserver main.go

代码示例如下:

package main

import (
    "io"
    "net/http"
)

func index(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "<h1>This is Index Page!</h1>")
}

func main() {
    http.HandleFunc("/", index)
    http.ListenAndServe(":8080", nil)
}

注意:这里的http监听端口号要与deploy.go内的端口号区别开,不能是相同端口号,不然会有端口冲突造成服务不能启动!

这时的代码架构就完成了,下面我们来编译发布代码:
因为我们在本地机器环境编译代码,所以对于异构系统来说,go语言为我们提供了相应的参数来针对不同的操作系统和架构进行代码的编译:
因为服务器所采用的是linux amd64的系统,所以编译命令的环境变量如下:
main.go编译生成webserver

env GOOS=linux GOARCH=amd64 go build -o webserver

进入deploy目录编译生成deploy

env GOOS=linux GOARCH=amd64 go build

输出的文件如图:


img_c76dcd712c7a7dca7edfb7863b6992d1.png
编辑结果

下面我们提交项目:
进入DevOps根目录

git add .
git commit -m "basic automatic publishing feature."
git push origin master

提交结果:

Counting objects: 8, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (8/8), 5.03 MiB | 1.21 MiB/s, done.
Total 8 (delta 1), reused 0 (delta 0)
To gitlab.com:EdisonLeung/devops.git
   91e5396..c9c087f  master -> master

接下来就要进入服务器拉去最新版本代码并发布。
登录远程服务器拉取代码:

root@aliyun:~/www/devops# git pull
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 8 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (8/8), done.
From gitlab.com:EdisonLeung/devops
   91e5396..c9c087f  master     -> origin/master
Updating 91e5396..c9c087f
Fast-forward
 deploy/deploy    | Bin 0 -> 6594124 bytes
 deploy/deploy.go |  28 ++++++++++++++++++++++++++++
 deploy/deploy.sh |   6 ++++++
 main.go          |  15 +++++++++++++++
 webserver        | Bin 0 -> 6498848 bytes
 5 files changed, 49 insertions(+)
 create mode 100755 deploy/deploy
 create mode 100644 deploy/deploy.go
 create mode 100644 deploy/deploy.sh
 create mode 100644 main.go
 create mode 100755 webserver

将deploy目录拷贝至用户根目录:
cp -r ~/www/devops/deploy/* ~/
启动webserver和deploy service:

cd ~
./www/devops/webserver &
./deploy &

打开浏览器查看结果显示:


img_a010c17cf92250fc6ee0231985a1c491.png
webserver result
img_d9edf0631822b50b14d54cf3e16231d4.png
deploy service result

两个服务均启动成功了!
注意1.两个服务启动前,先用以下命令查看是否有相同服务正在运行,如果有,先将其kill掉:
$ps aux | grep webserver
$kill [pid]
注意2.使用chmod命令给服务程序和脚本提权:
chmod a+x webserver

  1. 自动获取版本推送事件webhook

我们将部署触发的地址添加到远程版本仓库的webhook中,如图:

img_fab1f5caf716fb628f0b341c448431f2.png
webhook

webhook添加完成:
img_af256b1d0f60e8efdcf621a47aadae29.png
webhook

下面我们验证一下这个简单的自动化流程的效果。
我们把显示的文本改为"This is the Index Page2".
img_015e33cbdb2c32b43d03e2c4e12f8092.png
change code

然后编译提交
img_d782c236f0ddb47270fb2a732b32066b.png
编译提交

查看结果:
img_0217f952d1aa054c4002d1311ebaa410.png
发布迭代成功

文章中提到的做法仅仅是抛砖引玉,实现使用Golang是因为语言结构上简短精悍,更容易理解流程,如果您使用其他语言,例如python,php等都可以用相同的方式实现。同时流程上仅关注自动化的过程,开发编译的整个过程都在本地进行,服务端没有提到任何反向代理的服务及运行环境、虚拟环境的配置,因为在虚拟化环境下这些做法会有很多变化,很多情况下完全没有必要做,或者很少去做。更没有必要像目前这样自己去实现自动化流程。如果没有虚拟化实现自动化流程的经验,直接上手虚拟化,还没有很深入理解的情况下,在虚拟化环境下做DevOps及微服务架构,会给自己带来很大的困惑。具体这些将会在后续的文章中提到。

相关文章
|
4天前
|
运维 资源调度 监控
构建高效自动化运维流程的策略与实践
【5月更文挑战第15天】 在现代IT基础设施管理中,自动化运维已成为提高效率、确保稳定性和快速响应变化的关键。本文将探讨构建高效自动化运维流程的策略与实践,重点在于如何通过一系列切实可行的步骤实现从人工密集型到自动化驱动的转变。我们将讨论工具选择、流程设计、最佳实践以及持续改进的重要性,旨在帮助读者构建一个既灵活又可靠的自动化运维环境。
28 3
|
5天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器化技术融合实践
【5月更文挑战第6天】随着企业IT架构的复杂化以及快速迭代的市场需求,传统的运维模式已难以满足高效率和高质量的交付标准。本文将探讨如何通过结合DevOps理念和容器化技术来构建一个高效的自动化运维体系,旨在实现持续集成、持续部署和自动化管理,提升系统的可靠性、可维护性和敏捷性。
|
5天前
|
人工智能 运维 自然语言处理
构建高效自动化运维体系:DevOps与AI的融合之路
【4月更文挑战第30天】在数字化转型的大潮中,企业IT基础设施的复杂性日益增加,传统的运维模式已难以满足快速变化的业务需求。本文深入探讨了如何通过融合DevOps和人工智能(AI)技术构建一个高效、自动化的运维体系。文章首先概述了现代运维面临的挑战,接着分析了DevOps的核心理念以及AI如何在故障预测、智能决策支持等方面提升运维效率。最后,本文提出了一个具体的实施框架,并讨论了在推进过程中可能遇到的挑战及应对策略。
|
5天前
|
人工智能 运维 监控
构建高效自动化运维体系:DevOps与AI的融合实践
【4月更文挑战第30天】 在当今快速迭代的软件开发环境中,高效的自动化运维体系成为确保交付速度和服务质量的关键。本文探讨了如何通过整合DevOps理念和人工智能(AI)技术来构建一个更加智能、高效的运维体系。文章将详细阐述自动化运维的核心组件,以及如何利用AI技术优化这些组件的性能和决策过程。通过实际案例分析,本文展示了这种融合实践在提高运维效率、降低错误率以及提升系统稳定性方面的显著成效。
|
5天前
|
监控 前端开发 jenkins
Jenkins在前端项目持续部署中的应用,介绍了Jenkins作为自动化部署工具的基本概念和流程
【4月更文挑战第29天】本文探讨了Jenkins在前端项目持续部署中的应用,介绍了Jenkins作为自动化部署工具的基本概念和流程。前端持续部署涉及代码提交、构建、测试和部署四个步骤。实现过程中需配置代码仓库、构建、测试和部署任务,安装相关插件并确保环境一致性。注意事项包括代码质量控制、环境一致性、监控预警和安全管理。通过Jenkins,可提升前端开发效率和质量,但需不断学习以应对技术发展。
|
5天前
|
机器学习/深度学习 人工智能 供应链
【专栏】阿里云RPA的Rap程序是自动化流程脚本,基于AI和机器学习,实现业务流程自动化
【4月更文挑战第29天】阿里云RPA的Rap程序是自动化流程脚本,基于AI和机器学习,实现业务流程自动化。具有灵活性、易用性、高效稳定和智能学习等特点。广泛应用于财务、人力资源、客服和供应链等领域,未来将与AI深度融合,跨平台应用,行业定制化,并构建完善生态,助力企业效率提升和创新。
|
5天前
|
存储 运维 监控
提升数据中心效率的关键策略:自动化运维流程
【4月更文挑战第20天】随着企业对数据处理和存储需求的不断增长,数据中心的效率成为了优化的焦点。在本文中,我们将探讨自动化在数据中心运维中的应用,并分析其如何显著提升操作效率、降低成本以及提高服务水平。通过案例研究和最佳实践的分享,读者将获得实施自动化运维流程的实用指南,以支持其在不断变化的技术环境中保持竞争力。
|
5天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器技术融合实践
【4月更文挑战第15天】 在当今快速发展的信息技术时代,传统的IT运维模式已难以满足业务敏捷性的需求。本文旨在探讨如何通过整合DevOps理念和容器技术来构建一个高效的自动化运维体系。文章将详细阐述DevOps的核心原则、容器技术的基础知识,以及两者结合的优势。此外,文中还将分享一系列实践经验,包括持续集成/持续部署(CI/CD)流程的搭建、微服务架构的应用,以及监控和日志管理策略的优化,以期帮助企业实现快速、可靠且安全的软件交付过程。
|
5天前
|
运维 Prometheus 监控
构建高效自动化运维流程的策略与实践
【4月更文挑战第13天】 在现代IT基础设施管理中,自动化运维已成为提升效率、确保稳定性和快速响应变化的关键因素。本文将详细探讨构建一个高效自动化运维流程的战略规划、关键技术选型以及实际执行过程中的最佳实践。我们将通过具体案例分析,展示如何整合配置管理工具、持续集成/持续部署(CI/CD)管道、监控告警系统以及日志分析平台,来形成一个协同工作的整体解决方案。文章的目标是帮助运维团队构建出能够适应不断变化需求的自动化框架,实现运维工作的标准化、系统化和智能化。
|
5天前
|
监控 Shell 持续交付
通过Shell脚本实现局域网管理软件的自动化部署流程
本文介绍了如何使用Shell脚本自动化局域网软件部署流程,以简化管理和提高效率。脚本包括定义安装目录、服务器列表和软件包,然后遍历服务器进行传输和解压。此外,还展示了通过Shell脚本监控网络设备和软件状态,并自动将监控数据提交到网站的功能,有助于及时发现和解决问题,提升系统稳定性。通过这种方式,可有效减轻管理员的工作负担,降低成本。
96 0
http://www.vxiaotou.com