這可能是你的第一個 DevOps 解決方案!

otokaze-github發表於2020-04-25

前言

本文轉載自個人部落格: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

不來一發嗎?

更多原創文章乾貨分享,請關注公眾號
  • 這可能是你的第一個 DevOps 解決方案!
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章