简介
GitLab Runner是一个开源的应用程序,它可以在GitLab CI/CD系统中运行作业。GitLab Runner可以在不同的操作系统和平台上运行,支持多种编程语言和构建工具。它可以在单个主机上运行多个实例,也可以在多个主机上分布式运行,以提高作业的执行效率。
执行器
GitLab Runner支持多种Executor,可以根据不同的需求选择合适的Executor来执行作业。以下是一些常用的Executor:
1. Shell Executor:Shell Executor是GitLab Runner的默认Executor,它使用本地Shell来执行作业。Shell Executor适用于简单的构建和测试任务,但对于复杂的任务和需要使用Docker等容器技术的任务,Shell Executor的功能较为有限。
2. Docker Executor:Docker Executor使用Docker容器来执行作业,它可以在Docker容器中创建作业执行环境,并且可以使用Docker镜像来实现快速环境部署。Docker Executor适用于需要使用Docker容器技术的任务,例如构建和部署Docker镜像等。
3. Kubernetes Executor:Kubernetes Executor使用Kubernetes集群来执行作业,它可以在Kubernetes集群中创建作业执行环境,并且可以使用Kubernetes Pod来实现快速环境部署。Kubernetes Executor适用于需要使用Kubernetes集群技术的任务,例如构建和部署Kubernetes应用程序等。
4. SSH Executor:SSH Executor使用SSH协议来远程执行作业,它可以在远程服务器上创建作业执行环境,并且可以使用远程服务器上的资源来实现作业的执行。SSH Executor适用于需要在远程服务器上执行任务的情况,例如远程部署和测试等。
除了以上常用的Executor,GitLab Runner还支持其他一些Executor,如Parallels Executor、VirtualBox Executor等。通过选择合适的Executor,我们可以更好地利用GitLab Runner来实现自动化构建、测试和部署功能。
服务相关命令
- 注册Runner:sudo gitlab-runner register
- 启动Runner:sudo gitlab-runner start
- 停止Runner:sudo gitlab-runner stop
- 重启Runner:sudo gitlab-runner restart
- 查看Runner状态:sudo gitlab-runner status
- 查看所有Runner:sudo gitlab-runner list
- 删除Runner:sudo gitlab-runner unregister --name "runner_name"
类型
GitLab Runner支持以下几种类型:
1. Shared Runner:Shared Runner是由GitLab社区提供的公共Runner,可供所有GitLab项目使用。Shared Runner通常由GitLab社区维护,用户无需自己搭建和维护Runner环境,但可能会受到其他用户的影响和限制。
2. Specific Runner:Specific Runner是用户自己搭建和维护的Runner,只能由指定的项目使用。Specific Runner通常由用户自己在自己的服务器或云平台上搭建和维护,可以根据自己的需求和资源来配置Runner环境。
3. Group Runner:Group Runner是由GitLab项目组内的多个项目共享的Runner,可以在多个项目之间共享资源和配置,提高资源利用率和管理效率。
4. Parent/Child Runner:Parent/Child Runner是一种层次结构的Runner,可以通过继承和覆盖的方式来实现Runner的管理和配置。Parent Runner可以定义通用配置和资源,Child Runner可以继承和覆盖Parent Runner的配置和资源,实现更细粒度的Runner配置和管理。
通过选择合适的Runner类型,我们可以更好地利用GitLab Runner来实现自动化构建、测试和部署功能。在选择Runner类型时,需要根据项目的需求、环境要求、资源限制等因素进行综合考虑,选择最合适的Runner类型来执行作业。
流水线任务
GitLab中的流水线(Pipeline)是一种自动化工具,它可以将代码从源代码管理工具中的存储库自动构建、测试和部署到目标环境中。流水线任务(Pipeline Job)是流水线中的一个步骤,它可以完成一个特定的任务,例如构建、测试、打包、部署等。
在GitLab中,您可以通过编写.gitlab-ci.yml文件来定义流水线任务。.gitlab-ci.yml文件是一个YAML格式的文件,其中包含了一系列的流水线任务定义。每个流水线任务包含了一些特定的功能和配置,例如脚本、环境变量、依赖关系等。当GitLab检测到代码提交时,它会自动运行.gitlab-ci.yml文件中定义的流水线任务,以自动化执行构建、测试和部署流程。
以下是一个示例.gitlab-ci.yml文件,其中包含了三个流水线任务:Build、Test和Deploy:
stages:
- build
- test
- deploy
build:
stage: build
script:
- echo "Building the application..."
- mvn clean install
test:
stage: test
script:
- echo "Running tests..."
- mvn test
deploy:
stage: deploy
script:
- echo "Deploying the application..."
- ssh user@server "cd /var/www/myapp && git pull && npm install && pm2 restart myapp"
在这个示例中,我们定义了三个流水线任务:Build、Test和Deploy。这些任务被分组到不同的阶段(stage)中,以便定义它们的执行顺序。在build阶段中,我们使用Maven构建应用程序;在test阶段中,我们运行测试;在deploy阶段中,我们使用SSH连接到远程服务器,并更新代码、安装依赖项并重启应用程序。
通过定义.gitlab-ci.yml文件并定义流水线任务,我们可以实现自动化的构建、测试和部署流程,提高软件交付的效率和质量。
常用关键字
以下是.gitlab-ci.yml文件中常用的关键字的总结:
- 流程控制类关键字:
- stages:定义流水线任务执行的阶段。
- jobs:定义流水线任务的具体执行步骤。
- only和except:定义流水线任务执行的触发条件,例如只有在特定分支提交代码时才会触发任务执行。
- when:定义任务执行的条件,例如只有在前面的任务执行成功时才会执行当前任务。
- allow_failure:定义任务执行失败时是否继续执行后续任务。
- dependencies:定义任务执行所依赖的其他任务。
- trigger:定义任务执行时需要触发的另一个流水线。
- manual:定义任务是否需要手动触发执行。
- 环境和依赖类关键字:
- image:定义流水线任务使用的Docker镜像。
- services:定义任务执行需要启动的服务,例如数据库服务、消息队列服务等。
- variables:定义流水线任务中使用的环境变量,可以在任务执行时访问这些变量。
- before_script和after_script:定义任务执行前和执行后需要运行的脚本。
- script:定义任务的执行脚本,可以是任何可以在流水线运行的命令或脚本。
- artifacts:定义任务执行后生成的输出文件或结果,可以将这些输出文件上传到GitLab服务器或存储在特定位置。
- cache:定义任务执行时需要缓存的文件或目录,以加速任务执行速度。
- 其他关键字:
- include:引入其他.gitlab-ci.yml文件中的配置信息。
- tags:定义流水线任务所使用的GitLab Runner标签。
- timeout:定义任务执行的超时时间。
- retry:定义任务执行失败时的重试次数。
- interruptible:定义任务执行是否可以被中断。
- hooks:定义流水线任务执行时的钩子操作,例如在任务执行成功或失败时发送通知。
这些关键字可以根据需要组合使用,实现各种复杂的流水线任务和应用场景,提高软件交付的效率和质量。
gitlab-ci.yml 简单示例
以下是一个简单的示例,其中使用了一些常用的关键字:
stages:
- build
- test
- deploy
variables:
DATABASE_URL: "postgres://user:password@localhost/mydb"
IMAGE_TAG: "$CI_COMMIT_REF_NAME-$CI_COMMIT_SHA"
before_script:
- npm install
build:
stage: build
script:
- npm run build
- docker build -t my_app:$IMAGE_TAG .
artifacts:
paths:
- dist/
- Dockerfile
test:
stage: test
script:
- run_unit_tests
- run_integration_tests_with_database
only:
- master
allow_failure: true
deploy:
stage: deploy
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker push my_app:$IMAGE_TAG
- deploy_to_production
when: manual
dependencies:
- test
tags:
- production
cache:
paths:
- node_modules/
在这个示例中,定义了三个阶段(build、test和deploy)。在variables中定义了两个环境变量,DATABASE_URL和IMAGE_TAG,分别用于测试阶段需要使用的数据库连接和构建Docker镜像时使用的标签。在before_script中定义了任务执行前需要运行的命令,这里是安装npm包。
在build任务中,使用了script关键字定义了任务的执行脚本,先运行npm的build命令,然后使用Docker构建镜像,并将构建产生的文件和Dockerfile保存为artifacts。
在test任务中,使用了多个关键字。only定义了任务只有在master分支上提交代码时才会执行;allow_failure定义了任务执行失败时不会终止整个流水线的执行。
在deploy任务中,使用了多个关键字。when定义了任务需要手动触发执行;dependencies定义了任务的执行依赖;tags定义了任务需要在带有production标签的Runner上执行。
最后,在cache中定义了需要缓存的文件和目录,这里是node_modules目录。
这个示例只是一个简单的例子,实际使用中还需要根据具体需求进行调整和扩展。
gitlab-ci.yml 关键字使用
以下是GitLab CI/CD中所有可用的关键字及其描述和示例:
image: 指定任务运行时所使用的Docker镜像。示例:
image: node:14
services: 指定任务运行时所使用的服务。示例:
services:
- postgres:latest
stages: 指定流水线中的阶段。示例:
stages:
- build
- test
- deploy
variables: 定义流水线中使用的环境变量。示例:
variables:
DATABASE_URL: postgres://user:password@localhost/mydb
before_script: 定义任务执行前需要运行的命令。示例:
before_script:
- npm install
after_script: 定义任务执行后需要运行的命令。示例:
after_script:
- cleanup
cache: 定义需要缓存的文件和目录。示例:
cache:
paths:
- node_modules/
artifacts: 定义任务执行后需要保存的文件和目录。示例:
artifacts:
paths:
- dist/
- Dockerfile
script: 定义任务的执行脚本。示例:
script:
- npm run build
- docker build -t my_app:$IMAGE_TAG .
only: 定义任务只有在满足特定条件时才会执行。示例:
only:
- master
except: 定义任务不会执行的条件。示例:
except:
- tags
when: 定义任务的执行条件。示例:
when: manual
allow_failure: 定义任务执行失败时是否会终止整个流水线的执行。示例:
allow_failure: true
dependencies: 定义任务的执行依赖。示例:
dependencies:
- build
timeout: 定义任务执行的超时时间。示例:
timeout: 5m
retry: 定义任务执行失败时的重试次数。示例:
retry: 3
parallel: 定义任务并发执行的数量。示例:
parallel: 3
trigger: 定义触发另一个流水线的条件和参数。示例:
trigger:
include:
- local: path/to/another/ci.yml
strategy: depend
rules: 定义任务的执行规则。示例:
rules:
- if: '$CI_COMMIT_BRANCH =~ /^feature\//'
when: manual
- if: '$CI_COMMIT_BRANCH == "master"'
when: never
extends: 定义扩展配置。示例:
extends:
- .common-config
include: 引入其他的YAML文件。示例:
include:
- remote: 'https://example.com/path/to/another.yml'
- local: '/path/to/local.yml'
rules:variables: 定义任务的执行规则,根据变量的值来判断是否执行任务。示例:
rules:
- if: '$CI_COMMIT_BRANCH == "master"'
variables:
GIT_STRATEGY: fetch
rules:changes: 定义任务的执行规则,根据代码改动来判断是否执行任务。示例:
rules:
- changes:
- '*.js'
script:
- eslint
rules:exists: 定义任务的执行规则,根据指定的文件或目录是否存在来判断是否执行任务。示例:
rules:
- exists:
- package-lock.json
script:
- npm ci
rules:if: 定义任务的执行规则,使用CI/CD系统提供的变量和用户自定义变量来判断是否执行任务。示例:
rules:
- if: '$CI_COMMIT_BRANCH =~ /^feature\//'
script:
- npm test
rules:when: 定义任务的执行规则,根据前置任务的执行状态来判断是否执行任务。示例:
rules:
- when: on_success
changes:
- 'src/**'
script:
- npm run build
trigger:include: 定义触发另一个流水线的条件和参数。示例:
trigger:
include:
- artifact: my-artifact
job: deploy
trigger:strategy: 定义触发另一个流水线的策略。示例:
trigger:
include:
- local: path/to/another/ci.yml
strategy: depend
trigger:variables: 定义触发另一个流水线的参数。示例:
trigger:
include:
- local: path/to/another/ci.yml
variables:
ENVIRONMENT: production
rules:manual: 定义任务的执行规则,使任务成为手动触发。示例:
rules:
- if: '$CI_COMMIT_BRANCH == "master"'
when: manual
script:
- deploy
这些关键字可以根据实际需求进行组合使用,以实现更加复杂的CI/CD流程。