往往需求派下來了,
我們把程式寫完了, 或者Dockerfile(or docker-compose)寫好了.
總要推上版控的, 應該大部分都是Git吧!!
去年開始接觸Gitlab的我, 也開始接觸CI這部份的操作.
以前沒有CI的時候, 大家寫完程式, 到開始作整合編譯.
可能都是一兩週後的事情了, 甚至一個月.
因為以前大家只關心自己的部份是否能正常, 並不在意整合在一起是否能正常編譯.
直到很後面才會來煩惱修正.
所以Agile文化裡提出CI這概念, 希望程式有變動, 就趕緊作整合, 確保整個系統依然能正常運作, 也就是新增的部份, 並不會影響到原有的部份, 能持續且自動地進行驗證.
這驗證包含了
和艦長一起 30 天玩轉 GitLab , 今年剛好有社團大神寫Gitlab介紹的文
Gitlab有提供CI/CD的功能
寫個簡單的Gin程式, 然後推上gitlab repo.main.go
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run()
}
Push成功之後, 先去該專案左側的Settings -> Runners 做設定,
這步是讓自己的某台電腦成為Gitlab CI用的build server.
https://docs.gitlab.com/runner/install/
然後, 在專案根目錄下新增.gitlab-ci.yml
image: golang:latest
variables:
ARTIFACTS_DIR: artifacts
GO_PROJECT: gitlab.com/username/projectname
before_script:
- go version
- export GO111MODULE=on
- mkdir -p ${CI_PROJECT_DIR}/${ARTIFACTS_DIR}
stages:
- build
- test
gotest:
stage: test
script:
- go test ./...
gobuild:
stage: build
script:
- go build -o ${CI_PROJECT_DIR}/${ARTIFACTS_DIR}/main
artifacts:
paths:
- ${ARTIFACTS_DIR}
expire_in: 1h
Push 上遠端後, 會看到CI/CD -> Pipelines 跟 Jobs有東西出現了.
途中的a216460a
就是我們剛剛commit的log.
Pipeline就是yml中的stages, 裡面寫的都是各個Job.
接著定義Job的內容
gobuild這job是屬於build stage的job
gotest這job是屬於test stage的job.
一個stage可以定義多個job.
接著來說明這.gitlab-ci.yml
的內容
gitlab-ci就是借助docker的方式來進行編譯.
所以一開始要告訴它編譯的基底image.
然後有些各job要共用的資料我就設定成[variable]
before_script 是用來定義所有job執行前要執行的命令.
script, 就是執行該job的腳本或是命令.
artifacts, 執行成功後, 編譯出來的產出物.
expire_in, 就是設置該artifact被上傳到Gitlab開始的儲存時間.
內容其實就都是我們平常輸入的指令而已
把他們放在對應的階段, 如果是同階段, 不同順序.
yaml內的-
表示的是陣列, 就以-
開頭空一格後, 把指令放後面.
跑完後, 應該會有artifact能下載了, 解壓縮開來會是我們指定平台的Go二進制檔,
這時候就能人工拿去佈署了XD
昨天不是寫好了Dockerfile(或寫的是docker-compose)?
Gitlab一樣能對docker做CI.
先來這裡註冊並且開個repository.
記著自己的username跟repository name .
先來Gitlab 的Settings -> CI/CD -> Variables這裡
設定docker hub帳號
這裡的變數會被帶到.gitlab-ci.yml
內.
然後要改一下gitlab-runner的設定, 加入privileged = true
[runners.docker]
privileged = true
來改寫.gitlab-ci.yml
這裡我使用docker-in-docker (dind)的方式
image: docker:latest
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
# See https://github.com/docker-library/docker/pull/166
DOCKER_TLS_CERTDIR: ""
IMAGE_TAG: tedmax100/gitlabtest:latest
services:
- name: docker:dind
entrypoint: ["env", "-u", "DOCKER_HOST"]
command: ["dockerd-entrypoint.sh"]
before_script:
- echo "${DOCKERHUB_PWD}" | docker login -u "${DOCKERHUB_USER}" --password-stdin
stages:
- deploy
dockerdeploy:
stage: deploy
script:
- docker build -t $IMAGE_TAG .
- docker push $IMAGE_TAG
Docker image被成功的推上去了 !!
接著之後都是Deploy server的事情了XD
未來再提到佈署的部份.
從Node轉到來Go花了點時間摸熟依賴包的關係.
還有goroutine跟channel.
畢竟Node主要思維是單執行緒的思考邏輯, 就也沒鎖(Lock)這類的需要作考量.
兩者都很簡單入門, 但為了分散式架構還是讓自己來學Go.
畢竟我在職場上是純後端XD
今年第一次參加鐵人賽, 能完賽真的很有成就感.
短跑比賽結束了, 但長跑比賽還在繼續.
明年打算繼續, 應該會帶著前端專案與Gin有更多串接.
感謝各位的閱讀與支持, 之後有更多文章會分享在小弟個人網誌上.
想學的技術太多, 應該會先鎖定在Pixi跟ES上吧.
寫的蠻好的, 會繼續寫下篇的 CD 嗎?
XD 感謝閱讀,
我盡量下個月底前補簡單的一篇 (因為要租GCP機器)