1.开启设置gitlab服务器的CIC功能
2.下载安装最新版本的gitlab-runner
尽量使用最新版本
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
调整权限
sudo chmod +x /usr/local/bin/gitlab-runner
3.配置参数
参考gitlab管理页面的settings中的CICD部分,展开runner的设置说明,并重点查看 Set up a specific Runner manually
- 客户端配置
gitlab-runner register
#选择shell作为runner,其他配置根据需要灵活调整
- 客户端后配置
由于gitlab-runner每次执行CICD的pipeline的时候都会clone以下最新的commit,有时候因为某些文件被docker之类的工具生成了root才可以删除的权限,
因此需要给CICD增加一个在clone之前清理本地cache文件的功能,这在gitlab的服务器端是无法做到的(例如yaml中的before_script:),只能在客户端做。
register之后,还需要手动添加一项git clone的前置工作,在使用命令
gitlab-runner list
之后,会有一个配置文件
ConfigFile=/home/user/.gitlab-runner/config.toml
编辑该文件,并在[[runner]]的部分加入 pre_clone_script = " cd $CI_PROJECT_DIR/; YOUR_CLEAN_SCRIPT.sh"
编辑好之后大概是这个样子
concurrent = 1
check_interval = 0
[[runners]]
name = "test"
url = "https://gitlab.address.work/"
token = "***************"
executor = "shell"
pre_clone_script = " cd $CI_PROJECT_DIR/production; ./clear_docker_cache.sh"
[runners.cache]
4.CICD的yaml配置设计
考虑到集成测试阶段的任务阻塞,单元测试尽量不去卡住state往下运行。 可以给定义明确的stage,并在单元测试的stage中,增加手动运行的功能。并在下一阶段设置不论上一步结果成功失败,这个stage都继续执行,这样可以使得单元测试和模块测试不冲突。并最终在模块测试之后进行deploy等。
放一个例子: 其中when: manual 表示只能手动触发, when: always表示不论前面结果如何都继续执行
# 需要runner在更新之前使用docker清空本地的缓存,否则root的文件git无法删除
#以下配置位于 命令:gitlab-runner list获得的配置文件中
# pre_clone_script = " cd $CI_PROJECT_DIR/production/; ./clear_docker_cache.sh"
stages:
- build
- unittest_server
- unittest_client
- module_test
- deploy
before_script:
- echo 'make some public variables'
build-job:
stage: build
script:
- echo "Hello, $GITLAB_USER_LOGIN!"
dbc__uds_version:
stage: unittest_server
script:
- cd production
- python -m unittest remote_can/dbc_recognization.py
- python -m unittest remote_can/torquemap_uds_version.py
- cd ../
unittest-server:
stage: unittest_server
script:
- echo 'put server unit test here'
- cd production
- ./unittests_all.sh
- cd ../
when: manual
unittest-client:
stage: unittest_client
script:
- echo "pass, server not started"
when: manual
remote_can_server:
stage: module_test
script:
- echo "This job tests remote can server "
- cd production
- ./run_all.sh
- cd ../
when: always
remote_can_client:
stage: module_test
script:
- echo "This job tests something, but takes more time than test-job1."
- cd remote_can_client/
- python -m unittest
- cd ../
when: always
deploy-prod:
stage: deploy
script:
- echo "This job deploys something from the $CI_COMMIT_BRANCH branch."
when: manual