GitLab 是一个强大的开源代码托管平台,它还提供了一套完整的 CI/CD(持续集成/持续交付)工具,称为 GitLab CI/CD。通过 GitLab CI/CD,您可以实现自动化的构建、测试和部署流程,以帮助加快软件交付速度和质量。


GitLab CI/CD 的一般工作流程

  1. 在 GitLab 仓库中创建 .gitlab-ci.yml 文件:在您的项目根目录中创建一个名为 .gitlab-ci.yml 的文件,该文件用于定义 CI/CD 流程的各个阶段、作业和规则。

  2. 定义流程和作业:在 .gitlab-ci.yml 文件中,您可以定义构建、测试和部署等不同阶段的作业。作业定义了要执行的命令、环境变量、依赖关系等。您可以根据项目需求自定义作业。

  3. 触发 CI/CD 流水线:每当您的代码推送到 GitLab 仓库中,GitLab CI/CD 会自动检测到代码变更并触发相应的流水线。流水线根据 .gitlab-ci.yml 文件中的定义,按顺序执行各个阶段的作业。

  4. 执行作业:在每个阶段中,GitLab CI/CD 会执行定义的作业。这些作业可以是构建项目、运行单元测试、进行静态代码分析、部署到服务器等。

  5. 监视流水线:您可以在 GitLab 的用户界面中查看流水线的状态、作业的执行结果和日志。这有助于您了解流水线的进度和任何错误或失败的作业。

  6. 集成部署和持续交付:借助 GitLab CI/CD,您可以将自动化部署和持续交付流程集成到流水线中。这意味着每次代码变更后,您可以自动构建和部署您的应用程序,从而实现快速的交付和发布。

服务器安装Gitlab Runner

1
2
3
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash

yum install gitlab-runner

Gitlab Runner注册

配置gitlab url 和token(Gitlab菜单:Setttings -> CI/CD -> Runners settings (找到Token))

gitlab-runner

注册命令

1
2
3
4
5
6
7
8
gitlab-runner register \
  --non-interactive \
  --url "https://gitlab.xxx.com/" \
  --registration-token "FzrGohrfDsKjYTfEfHRX" \
  --executor "shell" \
  --description "game-version-update" \
  --tag-list "go-ci" \
  --locked="false" \

.gitlab-ci.yml 文件

  1. 代码合并到develop分支,会构建测试包,然后部署到内网测试环境
  2. 部署到生产环境,需要新建tag标签,会自动构建正式包,并部署到正式环境
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
before_script:
  - env |grep CI
  - export VERSION=`echo ${CI_COMMIT_TAG} | awk -F"_" '{print $1}'`
  - export MESSAGE=`echo $(git tag -l --format='%(contents)' $VERSION)`
stages:
  - lint
  - build
  - deploy
  - test
lint:
  stage: lint
  tags:
    - go-ci
  script:
    - echo "开始静态检测..."
    - make lint
  only:
    - develop
    - master
    - tags
# 定义 job
build:
  stage: build
  tags:
    - go-ci
  script:
    - echo "开始构建程序..."
    - make build
  only:
    - master
    - tags
test:
  stage: test
  tags:
    - go-ci
  script:
    - echo "开始打包程序上传..."
    - make build
    - make pack-test
    - make deploy-test
  only:
    - develop
# 定义 job
deploy:
  stage: deploy
  tags:
    - go-ci
  script:
    - echo "开始打包程序上传..."
    - make build
    - make pack
    - make deploy
  only:
    - tags

Go Makefile文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
GOPATH ?= $(shell go env GOPATH)
UPLOAD ?= $(shell which toolPackage)


BIN="./bin"
SRC=$(shell find . -name "*.go")
GO        := GO111MODULE=on go
GOBUILD   := $(GO) build
BINARY_NAME   := web-api
CONF      :=.golangci.yml
BINARY_FILE := ./bin/$(BINARY_NAME)


ifeq (, $(shell which golangci-lint))
$(warning "could not find golangci-lint in $(PATH), run: curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh")
endif

ifeq (, $(shell which richgo))
$(warning "could not find richgo in $(PATH), run: go get github.com/kyoh86/richgo")
endif

.PHONY: fmt lint test install_deps clean build_beta build zip zip_beta pack

default: all

fmt:
	$(info ******************** checking formatting ********************)
	@test -z $(shell gofmt -l $(SRC)) || (gofmt -d $(SRC); exit 1)

lint:
	$(info ******************** running lint tools ********************)
	golangci-lint run -c $(CONF)

test:
	$(info ******************** running tests ********************)
	richgo test -v ./...

install_deps:
	$(info ******************** downloading dependencies ********************)
	go get -v ./...

build:
	@$(GOBUILD)  -o $(BIN)/$(BINARY_NAME) ./cmd/web/

zip: build
	@rm -rf $(BINARY_NAME).zip
	@zip -j $(BINARY_NAME).zip bin/$(BINARY_NAME)

clean:
	rm -rf $(BIN)


pack:
ifneq ($(BINARY_FILE),$(wildcard $(BINARY_FILE)))
	$(error Please running `make build` first)
endif
ifeq ($(VERSION),"")
	$(error Please running `git tag` first)
else
	@tar -czf $(BINARY_NAME)-$(VERSION).tar.gz $(BINARY_FILE)
endif
pack-test:
ifneq ($(BINARY_FILE),$(wildcard $(BINARY_FILE)))
	$(error Please running `make build` first)
endif
	@tar -czf $(BINARY_NAME)-develop.tar.gz $(BINARY_FILE)
deploy:
ifeq "$(UPLOAD)" ""
	$(error Please set the environment variable toolPackage before running `make`)
endif
ifneq ($(BINARY_NAME)-$(VERSION).tar.gz,$(wildcard $(BINARY_NAME)-$(VERSION).tar.gz))
	$(error Please running `make pack` first)
endif
	toolPackage -f ./$(BINARY_NAME)-$(VERSION).tar.gz -p webApi -t app -v $(VERSION) -rmk "$(MESSAGE)"
deploy-test:
	toolPackage -f ./$(BINARY_NAME)-develop.tar.gz -p webApi -t app -v $(shell git describe --tags) -rmk "$(MESSAGE)" -env test
all: lint build pack

Pipelines

gitlab-pipeline