GitLab 是一个强大的开源代码托管平台,它还提供了一套完整的 CI/CD(持续集成/持续交付)工具,称为 GitLab CI/CD。通过 GitLab CI/CD,您可以实现自动化的构建、测试和部署流程,以帮助加快软件交付速度和质量。
GitLab CI/CD 的一般工作流程#
-
在 GitLab 仓库中创建 .gitlab-ci.yml 文件:在您的项目根目录中创建一个名为 .gitlab-ci.yml 的文件,该文件用于定义 CI/CD 流程的各个阶段、作业和规则。
-
定义流程和作业:在 .gitlab-ci.yml 文件中,您可以定义构建、测试和部署等不同阶段的作业。作业定义了要执行的命令、环境变量、依赖关系等。您可以根据项目需求自定义作业。
-
触发 CI/CD 流水线:每当您的代码推送到 GitLab 仓库中,GitLab CI/CD 会自动检测到代码变更并触发相应的流水线。流水线根据 .gitlab-ci.yml 文件中的定义,按顺序执行各个阶段的作业。
-
执行作业:在每个阶段中,GitLab CI/CD 会执行定义的作业。这些作业可以是构建项目、运行单元测试、进行静态代码分析、部署到服务器等。
-
监视流水线:您可以在 GitLab 的用户界面中查看流水线的状态、作业的执行结果和日志。这有助于您了解流水线的进度和任何错误或失败的作业。
-
集成部署和持续交付:借助 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))
注册命令
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 文件#
- 代码合并到develop分支,会构建测试包,然后部署到内网测试环境
- 部署到生产环境,需要新建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#