gitlab官网地址
官网文档地址 https://docs.gitlab.com/runner/install/docker.html
一。gitlab
1。gitlab安装
方式一:rpm包安装(centos)1,下载rpm包清华源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/linux命令wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ee/yum/el7/gitlab-ee-12.9.0-ee.0.el7.x86_64.rpm --no-check-certificate或者windows电脑访问软件直接下载rpm包然后上传linux2.运行rmp包rpm -ivh gitlab-ce-12.9.0-ce.0.e17.x86_64.rpm3.修改项目仓库存储地址vim /etc/gitlab/gitlab.rb,搜索git_data_dirs,修改项目存储路径gitlab-ctl reconfigure,使生效4。启动gitlab-ctl start //启动gitlab-ctl status //查看状态gitlab-ctl stop //停止方式二:docker安装1.gitlab文件夹下创建三个文件夹作为映射文件夹(容器卷) :config logs data2,拉取镜像:docker pull gitlab/gitlab-ce3.运行镜像docker run -d --hostname 192.168.61.146 //有hostname,不然后面创建项目的克隆地址是随机的-p 443:443 -p 80:80 -p 222:22 --name gitlab-ce--restart always -v /home/piaoransheng/gitlab/config:/etc/gitlab-v /home/piaoransheng/gitlab/logs:/var/log/gitlab-v /home/piaoransheng/gitlab/data:/var/opt/gitlabgitlab/gitlab-ce4.修改项目仓库存储地址vim /etc/gitlab/gitlab.rb,搜索git_data_dirs,修改项目存储路径gitlab-ctl reconfigure,使生效5.启动docker start gitlab-ce //启动docker stop gitlab-ce //停止下·docker rm gitlab-ce //删除6.测试访问:http://192.168.61.146/users/sign_in方式三:docker-compose安装
version: '3'
services: gitlab:image: 10.10.4.129:5000/gitlab/gitlab-ce:latestcontainer_name: gitlabhostname: 10.10.4.129 //如果有修改more端口80为2880,这边要加上端口2880restart: alwaysprivileged: true #避免挂载目录提示没有权限volumes:- ./volumes/config:/etc/gitlab- ./volumes/logs:/var/log/gitlab- ./volumes/data:/var/opt/gitlabports: - 80:80- 443:443- 222:22测试:http://10.10.4.129/
2。gitlab登录与创建项目
[登录网址](http://192.168.61.146/)
初始账号:root
密码在:config/initial_root_password里创建组/项目/用户 menu-admin——
查看项目 menu——project-your project设置中文:右上下三角号——>preferences——>Localization——>Language设置root账号的密码:菜单——管理员——用户——点击管理员账号——编辑——更改密码root123456项目代码存储在每个runner的/builds/root/mygitlab-project-1文件夹里面,注意不是gitlab,也不是gitlab-runner,而是gitlab-runner里面的runner
所以在注册runner时可以做个映射,具体见下面runner 注册gitlab-runner register --docker-volumes /home/piaoransheng/gitlab-runner/projects:/builds/root //把runner运行的路径映射到本地,/builds/root是通过
二。gitlab runner
1.gitlab runner安装
1,简介: gitlab-runner是用来运行流水线,流水线是由一个一个的job(作业)拼接而成(项目根目录下的.gitlab-ci.yml)gitlab runner是一个开源项目,用于运行作业并将结果发送回Gitlabgitlab runner类似于Jenkins的agent,执行CI持续继承、构建的脚本任务2.gitlab runner类型与状态类型:shared 共享类型,运行整个平台项目的作业group 项目组类型,运行特定group下项目的作业specific 项目类型,运行指定项目的作业状态:locked 锁定状态paused 暂停状态3.gtilab runner安装 (两个必备映射:本机docker、gitlab-runner配置文件)docker run -d --name gitlab-runner --restart always -v /var/run/docker.sock:/var/run/docker.sock //要有这个,不然执行器类型为docker的runner无法运行 报错误 后台是否启动Docker Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running-v /home/piaoransheng/gitlab-runner/config:/etc/gitlab-runner //配置文件的映射,用来修改runner拉取镜像策略,不然每次都要拉取作业所需镜像,比如maven,浪费时间并且docker images也会有多个maven的镜像gitlab/gitlab-runner:latest测试:docker ps 看到gitlab-runner服务已经启动或者docker-compose方式安装version: '3'services: gitlab-runner:image: 10.10.4.129:5000/gitlab/gitlab-runner:latestcontainer_name: gitlab-runnerhostname: 10.10.4.129restart: alwaysprivileged: true #避免挂载目录提示没有权限volumes:- /var/run/docker.sock:/var/run/docker.sock- ./volumes/config:/etc/gitlab-runner
2.注册runner
1.runner注册1.获取注册token shared类型token:menu——admin——overview——runnersgroup类型token: men——groups——your groups——点击gruop——setting——CI/CD——runnersproject类型token: menu——Projects——your projects——点击项目——setting——CI/CD——runners2.注册, (注册后就会在容器里/etc/gitlab-runner/config或者本机映射)的config.toml出现记录a.交互方式注册执行器类型为shell的runnera.敲命令:gitlab-runner register,回车b.根据提示粘贴注册地址,回车 (见上面获取注册token)c.根据提示输入注册token,回车(见上面获取注册token)d.根据提示输入runner描述:build,回车e.根据提示输入runner包名:build,回车f.根据提示输入runner执行器:shell(shell/docker/kubernetes),回车g.测试 在menu——admin——overview——runners页面最下面出现刚才注册的那一条runnerb.docker方式注册执行器类型为shell的runner1.进入gitlab-runner容器里面: docker exec -it c82ccb670c86 /bin/bash2.敲命令gitlab-runner register --non-interactive //非交互模式--executor "shell" //执行器类型,有shell docker k8s--url "http://192.168.61.146" //从gitlab页面获取 见上面获取注册token--registration-token "UNywwHz-3eofcXjtyfvS" //见上面获取注册token--description "deploy"--tag-list "build,deploy" //runner 包名,后面脚本文件的tags要和这边对应,才会使用到这个runner--run-untagged="true" //是否运行没有指定runner的作业--locked="false" //是否所帝国--access-level="not_protected"'3.测试 在menu——admin——overview——runners页面最下面出现刚才注册的那一条runner或者/etc/gitlab-runner/config config.tomlc.docker方式注册执行器类型为docker的runner(四个必备映射:本机docker、项目路径、maven配置文件、maven仓库)gitlab-runner register --non-interactive //非交互模式--executor "docker" //执行器类型,有shell docker k8s--docker-image alpine:latest //docker运行默认镜像,执行器类型为docker的才需要--url "http://192.168.61.146" //从gitlab页面获取 见上面获取注册token--registration-token "UNywwHz-3eofcXjtyfvS" //见上面获取注册token--description "deploy"--tag-list "build,deploy" //runner 包名--run-untagged="true" //是否运行没有指定runner的作业--locked="false" //是否锁定--access-level="not_protected"--docker-volumes /var/run/docker.sock:/var/run/docker.sock //也和本地docker映射--docker-volumes /home/project/docker/conventional-station:/builds/yongfu/conventional-station:Z //项目路径 这个需要注册完然后跑一个作业 echo "当前目录:$(pwd)看项目具体在容器哪里,然后再进去gitlab-runner的config.toml文件进行修改--docker-volumes /home/piaoransheng/maven/apache-maven-3.8.1/conf/settings.xml:/usr/local/maven/config/setting.xml //maven配置文件--docker-volumes /home/piaoransheng/maven/apache-maven-3.8.1/cangku:/home/piaoransheng/maven/apache-maven-3.8.1/cangku //maven仓库注意:执行器为docker类型的runner注册完去gitlab-runner容器/etc/gitlab-runner/config.toml对应的映射是/home/piaoransheng/gitlab-runner/config/config.toml在[[runners.docker] image下面加上pull_policy = "if-not-present" //拉取策略,就不用每次执行都要拉取镜像,执行器类型为docker的才需要 测试:在menu——admin——overview——runners页面最下面出现刚才注册的那一条runner或者/etc/gitlab-runner/config config.toml2.gitlab-runner一些命令(需要进入gitlab-runner容器里面才能运行)卸载 gitlab-runner uninstall启动 gitlab-runner start重启 gitlab-runner restart停止 gitlab-runner stop状态 gitlab-runner status注册执行器: gitlab-runner register 已注册的执行器列表 gitlab-runner list检查执行器是否可以连接,但不验证gitlab是否正在使用它 gitlab-runner verify删除 gitlab-runner delete注销 gitlab-runner unregister 使用令牌注销执行器 gitlab-runner unregister --url http://192.168.61.146 --token UNywwHz-3eofcXjtyfvS使用名称注销执行器 gitlab-runner unregister --name gitlab-runner-name注销所有执行器 gitlab-runner unregister --all-runners3.运行流水线任务(流水线任务定义在项目根目录下的.gitlab-ci.yml)1,项目创建gitlab-ci.yml文件 在gitlab页面,menu——project——your project——点击项目——set up ci/cd项目跟目录就出现了文件.gitlab-ci.yml2.编辑.gitlab-ci.yml定义流水线任务3。提交代码,流水线任务就执行了
3.流水线任务脚本编写
a 创建脚本文件
menu——project——your project——点击项目——点击set up for CI/CD——选择分支点击create new CI/CD pileline
b 验证脚本 .gitlab-ci.yml
校验:menu——projects——your projects——点击项目——CICD——有个CI LINT(在run pipeline的左边)把文件内容复制进去,然后validata
c 脚本语法 .gitlab-ci.yml
1.简览
stages 全部阶段
cache: 缓存,有全局缓存和作业缓存
environment
inherit
services 执行器类型为docker的runner用到
images 执行器类型为docker的runner用到,有全局镜像和作业镜像默认images: 注册runner时声明:alpine:latest 全局images : 流水线yml文件声明每个作业作业images, 流水线yml文件声明作业有用作业的image,作业没有用全局的image,全局没有用默认的image
job scripts 作业任务before_script: 作业有用作业的,作业没有用全局的,全局没有就不执行after_script: 作业有用作业的,作业没有用全局的,全局没有就不执行tags 指定哪个执行器allow_failure 是否允许失败(默认false),如果为true,前面的Job失败,不会影响流水线后面的job的继续运行retry 作业失败时重试,直到达到retry指定的次数timeout 超时(作业的超时时间可以超过项目级别超时时间,但是不能超过runner特定的超时时间)parallelonly 定义哪些分支被执行except 定义哪些分支不会被执行 rulesworkflowartifacts 生成制品depency 获取制品 when 控制作业运行(on_success on_failure always manual delayed never)前面阶段作业 成功 失败 总是 收到 延迟 从不
2.语法具体示例
only:-dev(dev分支) - branches(所有分支)
except:-devcache: 缓存,有全局缓存和作业缓存paths: - target/ *.jarartifacts: #生成制品name: mygitlab-1.0-SHAPSHOT.jar #制品名称when: on_success #job运行成功时做制品库paths: #源文件路径- target/xx.jardependencies: #使用制品- build #job名称
- 三阶段试验成功示例
variables:IMAGE_NAME: "conventional-station"IMAGE_TAG: "v1.0.0-snapshot.1.0"CONTAINER_NAME: "conventional-station"DOCKER_FILE_PATH: "./Dockerfile"stages: #定义这个流水线的所有阶段- Build- Image- Deploybuild: #自定义的作业名称stage: Build #处于流水线哪个阶段tags: #用哪个注册过的runner,页面menu——admin——overview——runners 最下面显示所有runner- dev-executoronly:- devimage: maven:3-openjdk-11 #在哪个镜像环境里面运行script:- echo "当前目录:$(pwd)" # builds/root/mygitlab-project-1(在这个maven容器,如果shell启动是在gitlab-runner容器)- ls- echo "编译打包"- mvn clean package -Dmaven.test.skip=true -s /usr/local/maven/config/setting.xml #-s指定配置文件- ls- ls targetartifacts:name: $IMAGE_NAME-1.0-SHAPSHOT.jar #制品名称when: on_success #job运行成功时做制品库expire_in: 30 days #保留时间paths: #源文件路径- target/*.jarcreatImage:stage: Imagetags:- dev-executorimage: bradj/docker:latestdependencies: #使用制品- build #job名称script:- echo "当前目录:$(pwd)" # docker镜像路径:builds/root/mygitlab-project-1- ls- echo "构建镜像"#停止并关闭容器- >if docker ps | grep ${CONTAINER_NAME} ;thenecho "进入停止容器"docker stop `docker ps -a | grep ${CONTAINER_NAME} | awk '{print $1}' `fi- >if docker ps -a | grep ${CONTAINER_NAME} ;thenecho "进入删除容器"docker rm `docker ps -a | grep ${CONTAINER_NAME} | awk '{print $1}' `fi#删除镜像- >if docker images | grep ${IMAGE_NAME} | awk '{print $3}' ;thenecho "进入删除镜像"docker rmi $(docker images | grep ${IMAGE_NAME} | awk '{print $3}')fi#构建镜像- docker build -t ${IMAGE_NAME}:${IMAGE_TAG} .deploy:stage: Deploytags:- dev-executorimage: bradj/docker:latestscript:- echo "容器名称:${CONTAINER_NAME}, 镜像:${IMAGE_NAME}:${IMAGE_TAG}"- docker run -d -p 9091:9091 --name ${CONTAINER_NAME} ${IMAGE_NAME}:${IMAGE_TAG}踩坑记录:1.提交代码部署报错提示环境内没有Dock:Docker Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running安装gitlab-runner的时候映射本机docker,这样gitlab-runner才能运行执行器类型为docker的runner2.runner每次执行脚本都重新再拉取所需镜像(gitlab-runner要再拉取镜像,比如maven,docker,配置gitlab-runner)去runner容器里面的/etc/gitlab-runner/config config.toml ,找到这个runner进行如下配置在[[runners.docker]下面加上pull_policy = "if-not-present" //拉取策略,就不用每次都拉取镜像3.runner每次执行脚本都去下载依赖包导(gitlab-runner里面的容器要再下载依赖,配置gitlab-runner里面的容器,比如maven)a.注册runner的时候映射maven配置文件、maven仓库(也可以注册完去gitlab-runner/config/congit.toml文件修改)b.runner作业脚本指定maven配置文件 mvn clean package -Dmaven.test.skip=true -s /usr/local/maven/config/setting.xml4.运行jar包提示找不到主类pom加入插件<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>com.test.MainApplication</mainClass></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>8</source><target>8</target></configuration></plugin></plugins></build>5.Depoy阶段运行成功,容器日志显示项目启动,端口8081,但是无法访问运行镜像要做端口映射 docker run -d -p 8081:8081 --name $CONTAINER_NAME $IMAGE_NAME:$IMAGE_TAG