git第三篇:CI/CD
我们可以利用gitlab自带的CI/CD来让代码在提交后自动编译部署。
按以下步骤实施即可:
1、在项目根目录中新建.gitlab-ci.yml文件,内容示例如下:
stages:
- build
- package
- deploy
go-build:
image: golang:1.23.1-bullseye
stage: build
before_script:
- cat /etc/os-release
script:
- 'go env -w GOPROXY=https://goproxy.cn,direct'
- 'git config --global --add url."git@github.com:".insteadOf "https://github.com/"'
- 'git config --global --add url."git@gitlab.com:".insteadOf "https://gitlab.com/"'
- 'go mod tidy'
- 'go build -o $CI_PROJECT_NAME ./main.go'
after_script:
- ls -l
artifacts:
paths:
- ./$CI_PROJECT_NAME
docker-package:
image: docker:27.3.1-cli
stage: package
variables:
DOCKER_IMAGE_NAME: $DOCKER_REGISTRY/koushr/$CI_PROJECT_NAME
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
CI_DEBUG_SERVICES: "true"
services:
- name: docker:27.3.1-dind
before_script:
- cat /etc/os-release
- export TAG=${CI_COMMIT_TAG:-$CI_COMMIT_SHORT_SHA}
script:
- docker build -t "$DOCKER_IMAGE_NAME:$TAG" .
- echo "$DOCKER_PWD" | docker login $DOCKER_REGISTRY -u $DOCKER_USER --password-stdin
- docker push "$DOCKER_IMAGE_NAME:$TAG"
- docker rmi "$DOCKER_IMAGE_NAME:$TAG"
after_script:
- docker logout
linux-deploy:
image: debian:bullseye
stage: deploy
before_script:
- cat /etc/os-release
- sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
- apt-get update && apt-get install -y openssh-client sshpass
- mkdir -pv ~/.ssh
- ssh-keyscan $LINUX_DEPLOY_HOST >> ~/.ssh/known_hosts
- cat ~/.ssh/known_hosts
- sshpass -e scp ./sh/*.sh root@$LINUX_DEPLOY_HOST:/root/$CI_PROJECT_NAME
- sshpass -e ssh root@$LINUX_DEPLOY_HOST "cd /root/$CI_PROJECT_NAME && chmod 777 *.sh"
- export TAG=${CI_COMMIT_TAG:-$CI_COMMIT_SHORT_SHA}
script:
- sshpass -e ssh root@$LINUX_DEPLOY_HOST "export DOCKER_PWD=$DOCKER_PWD && export DOCKER_REGISTRY=$DOCKER_REGISTRY && export DOCKER_USER=$DOCKER_USER && export CI_PROJECT_NAME=$CI_PROJECT_NAME && export TAG=$TAG && cd /root/$CI_PROJECT_NAME && sh start.sh"
after_script:
- cat /etc/os-release
上面的git.private.com代表私有代码仓库地址,192.168.1.108代表私有代码仓库的内网ip地址,hub.private.com代表私有镜像仓库地址。
项目有了.gitlab-ci.yml文件,每次提交后,gitlab就会找可用的runner去执行流水线了。
如果是把代码上传到了公有的gitlab,那么这个时候在项目主页->Build->Pipelines可以看到有流水线在执行了。如https://gitlab.com/koushr/registration/-/pipelines
如果是私有化的gitlab,我们在项目主页->CI/CD->Pipelines可以看到流水线处于Pending状态,点第一个job进去,会看到This job is stuck, because the project doesn't have any runners online assigned to it。这是说gitlab还没有关联runner,接下来需要我们安装runner。
gitlab-ci.yml详解:
每个stage都可以指定一个image,代表这个stage的job会在这个image创建的容器中执行。
高版本的docker-dind默认启用tls,如果我们在gitlab-runner register(见下文)时不指定证书的位置,在gitlab-ci.yml中不设置DOCKER_TLS_CERTDIR为空字符串的话,job会报Cannot connect to the Docker daemon at tcp://xxx:xxx. Is the docker daemon running?
2、安装runner
runner可以安装在任何地方,只要gitlab服务器、runner服务器能够相互访问就行。
我们可以直接在服务器上安装,也可以以docker方式安装,二选一即可。注意安装的runner的版本要尽量和gitlab的版本对应。在浏览器中访问私有仓库地址,在链接后面加/help,可以看到gitlab的版本。
a、在服务器上安装runner:
跟着https://docs.gitlab.com/runner/install/linux-repository.html走就行。
查看runner的日志:journalctl -u gitlab-runner -f。在runner工作不正常时也可以查看此日志来定位问题,比如runner离线。
b、在服务器上以docker方式安装runner
跟着https://docs.gitlab.com/runner/install/docker.html走就行。
如
concurrent = 100 check_interval = 3 log_level = "warning"
concurrent值为100,表示最多可以同时运行100个job,这样pipeline就可以并行执行了。
3、注册runner
跟着https://docs.gitlab.com/runner/register/走就行。
执行gitlab-runner register命令。如果runner是直接安装在服务器上,则在服务器上执行。如果runner是以docker方式安装,则要在容器中执行。命令示例如下:
至此,runner就可以用了。接下来我们就可以享受流水线带来的便利了。
错误提示1:
ERROR: Preparation failed: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
需要查看runner所在服务器能否pull镜像。如果不能pull,即使开启了docker服务,也会报上面这个错。
浙公网安备 33010602011771号