原创分享 这可能是你的第一个 DevOps 解决方案!

otokaze-github · 2020年04月25日 · 最后由 roberChen 回复于 2020年05月10日 · 1856 次阅读
本帖已被设为精华帖!

前言

本文转载自个人博客:https://www.otokaze.cn/2020/your-first-devops-solution.html

2020 年了,不知道还有哪些程序员还是每次发版上线都还人肉的做着打包、测试、上传、部署等一系列机械性的事情。为了打通这些场景使其能够自动化,避免重复性的劳动,DevOps 的概念也随之孕育而生。

至于要怎么更好的实现 DevOps 的概念,按照公司的规模和项目的大小在市场上都已经有很成熟的解决方案了。不过本着生命不息,折腾不止的原则,也作为研究爱好为目的,这里分享一下我是如何不依赖任何第三方平台,通过最低的成本全自建的构造属于自己的 DevOps 系统的!

我把本次文章所需要用到的资源文件以及一键部署脚本都在 Github 上进行了开源,fork 一下这些都是你的~

github:https://github.com/otokaze/DevOps

快速开始

先让我简要说明一下 Devops 系统本身所应该具备的基本行为:

Coding >> Commit >> Hooks >> Building >> Unit Testing >> Image Pushing >> Deploying

显然,Devops 是多个系统的组成。各个组件进行了分工与合作,流水线式的作业,最终取得了我们想要的结果。因此,我在开源界挑选了几个极低资源占用简单轻便的开源项目来构成我们的系统组成部分。

Gitea

作为一个私有 GIT 仓库,Gitea 足够的轻便,它只有一个二进制文件,60MB 不到的大小承载了所有的功能。同样也归功于 GO 的高性能编译器让它在运行时与生俱来所具备超低内存和 CPU 等资源占用的能力,这也成为我选择它的最佳理由。

部署
docker-compose -f ./Gitea/docker-compose.yaml up -d

Registry

Registry 作为私有 Docker 注册中心是目前唯一的选择,这也是 Docker 的官方开源的私有注册中心解决方案。此外,您也别无选择。 :(

部署
docker-compose -f ./Registry/docker-compose.yaml up -d

Drone

现在,我们还需要一个 CI/CD 平台能把任务调动起来!

同样也归功于 Go 语言的实现,Drone 不仅非常易于部署,而且更重要的是:它的稳定运行仅占用服务器上不到 20MB 的内存。爱了爱了~

部署
docker-compose -f ./Drone/docker-compose.yaml up -d
Example

此外,为了能让 Drone 能跟和我们本身的 Gitea 协调工作,告诉它代码完成提交后需要做什么,所以我们还需要一个 YAML 描述它的 “工作事项”。

这里以我另一个开源的测试查看 Docker 容器内负载均衡以及 ip&hostname 信息的小工具来作为 Demo。

github:https://github.com/otokaze/yourip

---
kind: pipeline
type: docker
name: default

platform:
  os: linux
  arch: amd64

steps:
- name: linter
  image: alpine/git
  commands:
  - change=$(git diff origin/master $DRONE_COMMIT ./CHANGELOG.md 2> /dev/null) && code=0 || code=$?
  - if [ ! $code -eq 0 ]; then echo 'CHANGELOG.md not fount.'; exit $code; fi
  - if [ -z "$change" ]; then echo 'CHANGELOG.md no change.'; exit 1; fi

- name: builder
  image: golang:1.13.8
  environment:
    GOOS: linux
    GOARCH: amd64
    CGO_ENABLED: 0
  commands:
  - go build -o yourip
  - go test

- name: tagger
  image: alpine
  commands:
  - tags=$(grep -E -o  v[0-9]+\.[0-9]+\.[0-9]+ CHANGELOG.md | head -1 | sed s/v/latest,/g)
  - if [ -z $tags ]; then echo 'No version found in CHANGELOG.md'; exit 1; else echo $tags > .tags; fi
  when:
    event:
    - push

- name: pushing
  image: plugins/docker
  settings:
    username:
      from_secret: DOCKER_REGISTRY_USERNAME
    password:
      from_secret: DOCKER_REGISTRY_PASSWORD
    repo: registry.otokaze.cn/yourip
    registry: registry.otokaze.cn
  when:
    event:
    - push

- name: deploying
  image: curlimages/curl
  environment:
    DEPLOY_API: https://swarm.otokaze.cn/api/services/yourip/redeploy
    TOKEN:
      from_secret: DOCKER_SWARMPIT_TOKEN
  commands:
  - code=$(curl -XPOST -s -w %{http_code} "$DEPLOY_API?tag=latest" -H 'Content-Type:application/json' -H "authorization:$TOKEN")
  - if [[ $code == "" || $code -lt 200 ]]; then echo "redeploy failed. HTTP_CODE=${code}"; exit 1; fi
  when:
    event:
    - push

trigger:
  branch:
  - master
  event:
  - pull_request
  - push

...

Swarmpit

最后的最后,我还需要一个容器编排引擎来管理我的服务,实现服务的平滑升级,横向扩容,回滚发布等功能。

关于容器编排引擎,swarm 其实并不是一个主流的选择,但只作为我一个小范围内使用的人来说,我不需要 k8s 那么多复杂的功能和特性,所以 Docker 自家的 swarm 成了我的最佳选择,因为它足够简单,还非常好用。

部署
docker stack deploy -c ./Swarmpit/docker-compose.yml swarmpit

不来一发吗?

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
kevin 将本帖设为了精华贴 04月25日 22:38

hi devops 和 需要部署的地址不在同一个服务器需要怎么做呢

cuteLittleDevil GoCN 每日新闻 (2020-04-27) 中提及了此贴 04月27日 19:12
gaotang 回复

不影响啊,只要容器编排引擎有对外 API 就可以通过远程调用进行部署。

lunny 回复

What do I need to do?

学生党,目前自己服务器上已是 gitea+drone. 个人觉得这基本够必要的 devops.不过还是学习到了.

另,我跟进 gitea 的 kanban PR 好久了,一直没合并到 master,我好难受...

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册