SRE新人大挑戰 Golang專案建置CI/CD – Micro Coder Blogathon #1

小弟SRE菜鳥,最近跌跌撞撞地在摸索CI/CD,趁著這次微開發者寫作松的機會,把自己的理解寫成文章,如果有錯務必請教!

這次的目標為實踐此位作者的文章。包含專案部署到GitLab並實際在AWS ESC上運行。

預計學習的觀點有

  1. 專案Docker化
  2. 部署到GitLab
  3. 專案更新到ECR
  4. ECS實際運行

網誌連結:https://ericlin716.medium.com/gitlab-專案docker化與ci-cd使用ecs與ecr-b74a66c99c1c

第一天,就讓我們先建立一個可以運行的Go專案暖暖身

建立簡單Web服務

建立一個main.go的檔案後,執行go mod init cicd 新增go.mod

-cicd // project dir name
    -main.go
    -go.mod
// main.go

package main

import (
    "fmt"
    "net/http"
    "strings"
    "log"
)

func sayhelloName(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()  //解析參數,預設是不會解析的
    fmt.Println(r.Form)  //這些資訊是輸出到伺服器端的列印資訊
    fmt.Println("path", r.URL.Path)
    fmt.Println("scheme", r.URL.Scheme)
    fmt.Println(r.Form["url_long"])
    for k, v := range r.Form {
        fmt.Println("key:", k)
        fmt.Println("val:", strings.Join(v, ""))
    }
    fmt.Fprintf(w, "Hello astaxie!") //這個寫入到 w 的是輸出到客戶端的
}

func main() {
    http.HandleFunc("/", sayhelloName) //設定存取的路由
    err := http.ListenAndServe(":9090", nil) //設定監聽的埠
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

資料來源:https://willh.gitbook.io/build-web-application-with-golang-zhtw/03.0/03.2

將此專案打包成Docker image

新增Dockerfile

-cicd // project dir name
    -main.go
    -go.mod
    -Dockerfile
// Dockerfile

FROM        golang
RUN         mkdir -p /app
WORKDIR     /app
COPY        . .
RUN         go mod download
RUN         go build -o app
ENTRYPOINT  ["./app"]
// Build image

docker build -t 'cicd' .
// Run golang project

docker run -p 9090:9090 cicd

參考資料來源:https://ithelp.ithome.com.tw/articles/10240352

使用GitLab建立CI/CD流程

在官網看到這張GitLab流程圖很清楚地告知CI/CD使用GitLab的流程,我們將在後續的文章陸陸續續實踐其中的步驟。

https://docs.gitlab.com/ee/ci/introduction/

部署到GitLab

git config --global user.name "Lin Alvin"
git config --global user.email "[email protected]"

// Push an existing folder
cd cicd // existing_folder_name
git init --initial-branch=main
git remote add origin [email protected]:tutor.ooii8929/cicd.git
git add .
git commit -m "Initial commit"
git push -u origin main

什麼是GitLab Runner

剛開始的GitLab只是repo管理工具,還沒有CI/CD的功能。後來人們經常將GitLab+jenkins實作CI/CD。既然知道這件事有市場,當然就要出一份自己的,所以GitLab在8.0版本後開始有了集成GitLab-CI,而GitLab-Runner就是搭配GitLab-CI使用的工具。

GitLab CI 的工作是在 .gitlab-ci.yml 檔案內所定義,而具體執行這些工作的機台稱為 runner。GitLab-Runner就像是工人,而GitLab-CI是工人管理公司,如果工人要工作,就要先向GitLab-CI註冊。

GitLab-Runner 可以自己搭建,也可以用 GitLab.com 提供的 shared runner

資料來源:https://kknews.cc/zh-tw/code/mrmrrpz.html

https://editor.leonh.space/2021/gitlab-ci/

建立自己的runner並向GitLab註冊

官方教學:https://docs.gitlab.com/runner/install/

這邊我示範的是使用Docker建立Runner

// https://hub.docker.com/r/gitlab/gitlab-runner

docker pull gitlab/gitlab-runner

docker run --rm -t -i gitlab/gitlab-runner --help // check install success
// cicd folder
// 我選擇使用Docker volumes來啟動container

> docker volume create gitlab-runner-config

> docker run -d --name gitlab-runner --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v gitlab-runner-config:/etc/gitlab-runner \
    gitlab/gitlab-runner:latest

參考資料來源:https://ithelp.ithome.com.tw/articles/10225568

https://docs.gitlab.com/runner/install/docker.html
docker run --rm -it -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:latest register
  1. 輸入GitLab instance URLSettings > CI/CD > Runners
```json
Register the runner with this URL:
https://gitlab.com/ 
```
  1. 同樣的地方你會看到
And this registration token:
GR1348941D*******zNSvV
  1. 輸入此runner的描述 Enter a description for the runner.
  2. 輸入與此runner連結的tags。
  3. 輸入維護的註記
  4. 輸入runner執行者。我這邊是docker
  5. 如果上一題輸入docker,你會被要求預設不在.gitlab-ci.ymlimage

註冊官方教學:https://docs.gitlab.com/runner/register/index.html#docker

新增.gitlab-ci.yml

  1. 新增.gitlab-ci.yml
-cicd
    -main.go
    -go.mod
    -Dockerfile
    -.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

第一次使用runner部署

我們可以到GitLab,來看Pipeline

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。