参考网站:https://docs.gitlab.com/runner/install/linux-repository.html
https://docs.gitlab.com/runner/register/index.html
1、添加官方gitlab官方仓库???这一步操作不明白什么意思,反正安装官网来先。
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
2、安装最新版本的gitlab runner,当然,也可以安装特定版本,参照官方连接
yum install gitlab-runner
3、然后就可以注册信息到gitlab了。
gitlab-runner register
输入后会让你输入gitlab ci 协调者的url,这个是需要在安装的gitlab上面找的,步骤:设置=>Overview=>Runners然后就可以看到了,参考下图
4、然后让你输入token,这里也看的到。
5、再然后让你输入gitlab-ci runner的描述信息,自己看着填吧,以后也可以在gitlab页面上进行修改
6、然后添加一个tag,以后也可以在页面修改,也可以不输入调过去
7、选择executor运行方式,官网使用的docker,其他教程都选择shell,选择docker需要选择一个镜像什么的,我使用shell
这样就算是完成了,然后你可以在gitlab上面看到这个runner,设置=>Overview=>Runners,runner有公有还私有的区别。
然后我写一个.gitlab-ci.yml文件在项目跟目录提交测试下情况。
stages:- deploydeploy: stage: deploy script: - cat /etc/redhat-release only: - master tags: - testtag1
可以在仓库中看CI job执行的情况,进入你项目的仓库,按照左侧菜单展开,即可看到执行的任务,红框圈的按钮点击可以校验你的.gitlab-ci.yml文件的正确性。
选择其中一个pipeline点击进去,可以看到执行的效果,如下图所示。
关键字 | 是否必须 | 描述 |
---|---|---|
script | 必须 | 定义Runner需要执行的脚本或命令 |
image | 非必须 | 需要使用的docker镜像,请查阅 |
services | 非必须 | 定义了所需的docker服务,请查阅 |
stage | 非必须 | 定义了工作的场景阶段,默认是test |
type | 非必须 | stage的别名,不赞成使用 |
variables | 非必须 | 在job级别上定义的变量 |
only | 非必须 | 定义哪些git引用(分支)适用该job |
except | 非必须 | 定义了哪些git引用(分支)不适用该job |
tags | 非必须 | 定义了哪些runner适用该job(runner在创建时会要求用户输入标签名来代表该runner) |
allow_failure | 非必须 | 允许任务失败,但是如果失败,将不会改变提交状态 |
when | 非必须 | 定义job什么时候能被执行,可以是on_success,on_failure,always或者manual |
dependencies | 非必须 | 定义了该job依赖哪一个job,如果设置该项,你可以通过artifacts设置 |
artifacts | 非必须 | 所谓工件。。就是在依赖项之间传递的东西,类似cache,但原理与cache不同 |
cache | 非必须 | 定义需要被缓存的文件、文件夹列表 |
before_script | 非必须 | 覆盖在根元素上定义的before_script |
after_script | 非必须 | 覆盖在根元素上定义的after_script |
environment | 非必须 | 定义让job完成部署的环境名称 |
retry | 非必须 | 定义job失败后的自动重试次数 |
其中有些配置加入我自己的理解:
下面这个artifacts配置项意思就是,将生成的jar包上传到gitlab上面,可以用gitlab ui上面显示,并下载。
artifacts: paths: - target/aa.jar
踩坑:
1、注意编写.gitlab-ci.yml文件“-”符号后面一定得加个空格,不然命令会报错,虽然输出控制台显示正确命令,但是执行是不成功的。
2、代码推送到gitlab上之后,一直是pending状态,要等很久才pick到一个runner来执行,这个现象一般是只在gitlab上删除的runner,但是没有在runner的配置文件中删除对应的配置信息,手动删除即可。/etc/gitlab-runner.config.toml,删除只剩下你需要的即可,然后重新启动下runner:gitlab-ruuner restart
3、我在.gitlab-ci.yml文件中写了一段执行docker打包镜像的脚本,执行的时候总是出问题说是没有权限执行。
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/build?buildargs=%7B%7D&buildbinds=null&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=overduestatic&ulimits=null: dial unix /var/run/docker.sock: connect: permission denied
然后我在前面步骤写了一个脚本,拿到runner的用户是那个命令(whoami),然后赋予该用户权限。
sudo groupadd docker
sudo gpasswd -a gitlab-runner docker sudo service docker restart(或者systemctl start docker)据说这样就可以了,但是我这里还是不行,继续找资料,说给docker软件赋权限那么试一试吧:chmod a+rw /var/run/docker.sock
虽然还报错,但是不再是权限问题了。
container_linux.go:247: starting container process caused "chdir to cwd (\"/dockerdir\") set in config.json failed: not a directory"
这个问题,是我自己写的脚本问题。我自己研究,正常到这里都可以执行了。
最后贴一下我的Dockerfile和.gitlab-ci.yml文件内容,第一个是Dockerfile,第二个是.gitlab-ci.yml
FROM openjdkADD target/overduestatic.jar /dockerdir/overduestatic.jarWORKDIR /dockerdirCMD ["java","-jar","/dockerdir/overduestatic.jar"]
stages:- test- build- dockertest1: stage: test script: - cat /etc/redhat-release - whoami only: - master tags: - testtag1build2: stage: build tags: - testtag1 only: - master script: - mvn package artifacts: paths: - target/overduestatic.jardocker3: stage: docker tags: - testtag1 only: - master script: - docker build -t overduestatic .
.gitlab-ci.yml参考地址:
https://docs.gitlab.com/ce/ci/yaml/README.html
https://segmentfault.com/a/1190000011890710
https://blog.csdn.net/ujm097/article/details/80794740