gitlab runner安装说明
安装gitlab-runner
主要介绍两种安装方式:docker方式和rpm方式
docker安装方式
在包市场里面找到对应的gitlab-runner:
https://hub.docker.com/r/gitlab/gitlab-runner/tags
1 查看gitlab版本
docker exec -it gitlab cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
#查出版本11.1.14
2 安装 runner
docker run -itd -v /data/devops/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:v11.1.0
3 进入容器里面
docker exec -it d35956ecdd17 bash
4 运行gitlab-runner -h
rpm安装方式
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
yum list gitlab-runner --showduplicates | sort -r
yum install gitlab-runner-11.1.0-1
gitlab-runner注册
注册步骤:
· 获取runner token ->进行注册
GitLabRunner类型
. shared :运行整个平台项目的作业(gitlab)
. group:运行特定group下的所有项目的作业(group)
. specific:运行指定的项目作业(project)
. locked:无法运行项目作业
. paused:不会运行作业
shared类型token获取
项目类型token获取
注册交互式
//runner注册
gitlab-runner register
//指定以下 URL
http://192.168.200.80:8090/
//输入描述
Please enter the gitlab-ci description for this runner
//输入标签
Please enter the gitlab-ci tags for this runner (comma separated)
//设置执行器
常用的执行器有shell,docker,kubernetes
注册完成,默认是锁定状态。
注册非交互式
docker run -itd --rm -v /data/devops/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:v11.1.0 register -n \
--non-interactive \
--url "http://192.168.200.80:8090/" \
--registration-token "ssQnNL2poyrajsTcsJys" \
--executor "shell" \
--description "devops-runner" \
--tag-list "build,deploy" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected"
//进入到 runner 容器里面
docker exec -it gitlab-runner bash
gitlab-runner register \
--non-interactive \
--url "http://192.168.200.80:8090/" \
--registration-token "ssQnNL2poyrajsTcsJys" \
--executor "shell" \
--description "devops-runner3" \
--tag-list "build" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected"
note:有问题待排查
常用命令:
gitlab-runner register #默认交互模式下使用,非交互模式添加--non-interactive
gitlab-runner list #此命令列出了保存在配置文件中的所有运行程序
gitlab-runner verify #此命令检查注册的runner是否可以连接,但不验证GitLab服务是否正在使用runner。--delete删除
gitlab-runner unregister#该命令使用GitLab取消已注册的runner.
#使用令牌注销
gitlab-runner unregister --url http://gitlab.example.com/ --token tok3n
#使用名称注销(同名删除第一个)
gitlab-runner unregister --name test-runner
#注销所有
gitlab-runner unregister --all-runners
gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
#--user指定将用于执行构建的用户
#--working-directory 指定将使用**Shell** executor运行构建时所有数据将存储在其中的根目录
gitlab-runner uninstall #该命令停止运行并从服务中卸载GitLab Runner.
gitlab-runner start #该命令启动GitLab Runner服务。
gitlab-runner stop #该命令停止GitLab Runner服务。
gitlab-runner restart #该命令将停止,然后启动GitLab Runner服务。
gitlab-runner status #此命令显示GitLab Runner服务的状态。当服务正在运行时,退出代码为零;而当服务未运行时,退出代码为非零。
编写gitlab-ci.yml Pipeline 语法
CI配置检查,验证语法正确性
job(作业)
在每个项目中,使用名为.gitlab-ci.yml的YAML文件配置GitLab CI / CD管道。在文件中可以定义一个或多个作业(job)。每个作业必须具有唯一的名称(不能使用关键字),每个作业是独立执行的。作业定义了在约束条件下进行相关操作,每个作业至少要包含一个script。
job1:
script: "execute-script-for-job1"
job2:
script: "execute-script-for-jcb2"
script
每个作业至少要包含一个script
before_script
用于定义一个命令,该命令在每个作业之前运行。必须是一个数组。指定的script与主脚本中指定的任何脚本串联在一起,并在单个shell中一起执行。
before_script失败导致整个作业失败,其他作业将不再执行。作业失败不会影响after_script运行。
after_script
用于定义将在每个作业(包括失败的作业)之后运行的命令。这必须是一个数组。
指定的脚本在新的she11中执行,与任何before_script或script脚本分开。
stages
用于定义作业可以使用的阶段,并且是全局定义的。
同一阶段的作业并行运行,不同阶段按顺序执行。
.pre&.post
.pre始终是整个管道的第一个运行阶段,.post始终是整个管道的最后一个运行阶段。
用户定义的阶段都在两者之间运行。.pre和.post的顺序无法更改。如果管道仅包含.pre或.post阶段的作业,则不会创建管道。
variables
定义变量,pipeline变量、job变量。job变量优先级最大。
完整例子
before_script:
- echo "before_script!"
variables:
DOMAIN: example.com
stages:
- build
- test
- codescan
- deploy
build:
before_script:
- echo "before_script in job"
stage: build
script:
- echo "mvn clean"
- echo "mvn install"
- echo "$DOMAIN"
after_script:
- echo "after script in buildjob"
unittest:
stage: test
script:
- echo "run test"
deploy:
stage: deploy
script:
- echo "codescan"
- sleep 2;
codescan:
stage: codescan
script:
- echo "codescan"
- sleep 5;
after_script:
- echo "after_script!!!!"
- echo "end"
tags 指定runner
用于从允许运行该项目的所有Runner列表中选择特定的Runner,在Runner注册期间,您可以指定Runner的标签。
allow_failure 允许失败
allow_failure允许作业失败,默认值为false。启用后,如果作业失败,该作业将在用户界面中显示橙色警告。但是,管道的逻辑流程将认为作业成功/通过,并且不会被阻塞。假设所有其他作业均成功,则该作业的阶段及其管遒将显示相同的橙色警告。但是,关联的提交将被标记为"通过",而不会发出警告。
when 控制作业运行
on_success 前面阶段中的所有作业都成功时才执行作业,默认值
on_failure 当前面阶段出现失败时执行。
always 总是执行作业。
manual 手动执行作业。
delayed 延迟执行作业。
retry 重试
·配置在失败的情况下重试作业的次数。
·当作业失败并配置了retry ,将再次处理该作业,直到达到retry关键字指定的次数。
如果retry设置为2,并且作业在第二次运行成功(第一次重试),则不会再次重试.
retry值必须是一个正整数,l等于或大于0,但小于或等于2(最多两次重试,总共运行3次)。
精准匹配错误:
默认情况下,在失败情况下重试作业。max :最大重试次数when :重试失败的错误类型
timeout
作业级别的超时可以超过项目级别超时,但不能超过Runner特定的超时。
parallel 并行作业
配置要并行运行的作业实例数,此值必须大于或等于2并且小于或等于50。
这将创建N个并行运行的同一作业实例.它们从job name 1/N到,job name N/N依次命名。
only except 限制分支标签
only和except用分支策略来限制jobs构建:
only定义哪些分支和标签的git项目将会被job执行。
except定义哪些分支和标签的git项目将不会被job执行。
only:master
except:dev
rules
rules允许按顺序评估单个规则,直到匹配并为作业动态提供属性。
rules不能only/except与only/except组合使用。
可用的规则:
if(如果条件匹配)
changes(指定文件发生变化)
exists(指定文件存在>
失败
workflow-rules-管道创建
顶级workflow关键字适用于整个管道,并将确定是否创建管道。
when:可以设置为always或never,如果未提供,则默认值always。
cache-缓存
存储编译项目所需的运行时依赖项,指定项目工作空间中需要在job之间缓存的文件或目录。
全局cache定义在job之外,针对所有job生效。job中cache优先于全局。
cache:paths
在job build中定义缓存,将会缓存target目录下的所有. jar文件。
当在全局定义了cache: paths会被job中覆盖。以下实例将缓存target目录。
由于缓存是在job之间共享的,如果不同的job使用不同的路径就出现了缓存覆盖的问题。
如何让不同的job缓存不间的cache呢 ? 设置不同的cache:key。
为缓存做个标记,可以配置job、分支为key来实现分支、作业特定的缓存。
为不同job 定义了不同的 cache:key 时,会为每个job 分配一个独立的 cache。
cache:key变量可以使用任何预定义变量,默认default 。
从GitLab 9.0开始,默认情况下所有内容都在管道和作业之间共享。
build:
stage: build
script:
- echo "test"
key:build
cache:
paths:
- target/*.jar
cache:
key:${CI_COMMIT_REF_SLUG}
cache : key : files 文件变化自动创建
files:文件发生变化自动重新生成缓存(files最多指定两个文件),提交的时候检查指定的文件。
根据指定的文件生成密钥计算SHA校验和,如果文件未改变值为default。
cache:
key:
files:
-Gemfile.lock
-package.json
paths:
- target/*.jar
cache : key : prefic 组合生成SHA校验
prefix:允许给定prefix的值与指定文件生成的秘钥组合。
在这里定义了全局的cache,如果文件发生变化则值为rspec-xxx111111111222222 ,未发生变化为rspec-default。
cache:policy 缓存策略
默认:在执行开始时下载文件,并在结束时重新上传文件。
policy: pull 跳过下载步骤,policy: push 跳过上传步骤。
images
默认在注册runner的时候需要填写一个基础的镜像,请记住一点只要使用执行器为docker类型的runner所有的操作运行都会在容器中运行。
如果全局指定了images则所有作业使用此image创建容器并在其中运行。
全局未指定image,再次查看job中是否有指定,如果有此job按照指定镜像创建容器并运行,没有则使用注册runner时指定的默认镜像。
docker exec -it gitlab-runner bash
gitlab-runner register \
--non-interactive \
--executor "docker" \
--docker-image alpine:latest \
--url "http://192.168.200.80:8090/" \
--registration-token "ssQnNL2poyrajsTcsJys" \
--description "devops-runner" \
--tag-list "build,deploy" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected"
vim /etc/gitlab-runner/config.toml
//不会每次下镜像
[[runners]]
pull_policy="if-not-present"
ssh-keygen -t ed25519 -C "GitLab SSH key"
variables:
RELEASE_FOLDER: '/var/ReleaseFolder/Baiyi.Energy/' #文件夹要有权限
TARGET_FOLDER: '/home/strategyenergy_job5107'
CSPROJ: '/src/Baiyi.Energy.Web/Baiyi.Energy.Web.csproj'
stages:
- build
- deploy
build_job:
before_script:
- echo $CI_COMMIT_REF_NAME
- echo $CI_BUILDS_DIR
- echo $CI_CONFIG_PATH
- echo $CI_RELEASE_DESCRIPTION
- echo $CI_JOB_NAME
- echo $CI_JOB_URL
- echo $CI_PIPELINE_URL
- echo $CI_PROJECT_DIR
- echo $CI_PROJECT_ID
- echo $CI_PROJECT_NAME
- echo $CI_PROJECT_NAMESPACE
- echo $CI_PROJECT_PATH_SLUG
- echo $CI_PROJECT_PATH
- echo $CI_PROJECT_ROOT_NAMESPACE
stage: build
tags:
- build
only:
- master
retry: 1
script:
- dotnet publish $CI_PROJECT_DIR$CSPROJ -c release -o $RELEASE_FOLDER
- cd $RELEASE_FOLDER
- rm appsettings*.json
- rm *.config
- rm quartz_jobs.xml
deploy_job:
before_script:
- echo $CI_COMMIT_REF_NAME
stage: deploy
tags:
- build
only:
- master
script:
- cd $RELEASE_FOLDER
- cp -ru ./* $TARGET_FOLDER
- sshpass -p $PASSWORD ssh $USER@$HOST supervisorctl restart BaiyiEnergy_job5107