gitlab-ci 的研究
gitlab
1.基本语法
- 1.基本语法
- 构建产物
- 选择何时触发构建
- 2.构建并发布到指定服务器
- 3.钉钉通知
1.基本语法
语法:
一个ci文件里面有多个stage阶段,一个stage里面可以有多个job
stages: #流水线阶段
- stage01
- stage02
job01:
stage:
tags:stage01
- runner02 #gitlab-runner的tag
rules:
- if: '$CI_COMMIT_BRANCH == "dev"' #如果dev分支发生提交
script:
- linux cmd01
- shell02
- shell03
job02:
stage: stage02
tags:stage01
- runner02 #gitlab-runner的tag
script:
- linux cmd01
- shell02
- shell03
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
构建产物
-定义每个作业的产物。
-同一流水线后期的后续作业可以使用产物。
-不同的项目不能共享产物。
-默认情况下,产物会在 30 天后过期。您可以自定义到期时间。
-如果启用了保留最新产物,则最新的产物不会过期。
-使用依赖来控制哪些作业获取工件
jobs-build:
script: mvn clean package
artifacts:
paths:
- ./target/
expire_in: 1 week
- 1
- 2
- 3
- 4
- 5
- 6
在此示例中,名为 的作业调用 jobs-build 命令会使用mvn clean package命令构建maven项目
paths 关键字确定要添加到作业产物的文件。 文件和目录的所有路径都相对于创建作业的仓库。
expire_in 关键字决定保留作业产物的时间。 您还可以使用 UI 防止作业产物过期。 如果未定义 expire_in,则使用gitlab工程级别的设置
选择何时触发构建
1.使用if语句-分支发生提交事件触发构建
stages:
- build
build-dev: #build dev阶段
stage: build
tags:
- runner02 #gitlab-runner的tag
rules:
- if: '$CI_COMMIT_BRANCH == "dev"' #如果dev分支发生提交
#when: manual #可以控制手工作业
script:
- some linux shell cmd
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
2.使用only语句-限制分支
stages:
- build
build-dev: #build dev阶段
stage: build
tags:
- runner02 #gitlab-runner的tag
only:
- dev #此job只适用于dev分支
script:
- some linux shell cmd
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
3.使用更复杂的if语句作为触发条件
job1:
script:
- echo This rule uses parentheses.
rules:
if: $CI_COMMIT_BRANCH == "release" && $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == "dev"
- 1
- 2
- 3
- 4
- 5
CI_COMMIT_BRANCH表示发生提交的分支
CI_MERGE_REQUEST_SOURCE_BRANCH_NAME表示合并请求的源分支名称。
2.构建并发布到指定服务器
stages:
- build
- deploy
build-dev: #build dev阶段
stage: build
tags:
- runner02 #gitlab-runner的tag
rules:
- if: '$CI_COMMIT_BRANCH == "dev"' #如果dev分支发生提交
script:
- git fetch
- git checkout dev
- git pull
- mvn clean
- mvn package
- if [ ! -d "dev_jar" ]; then mkdir dev_jar;fi
- cp ./validator/target/ ./dev_jar/
artifacts:
expire_in: 1 day
paths:
- ./dev_jar/ # 需要保留的构建产物
deploy-dev:
stage: deploy
tags:
- runner02 #gitlab-runner的tag
only:
- dev
script:
- ls ./dev_jar/
- ansible test-server -m copy -a "src=./dev_jar dest=/usr/local/kiki/jar/"
- ansible test-server -m shell -a "cd /usr/local/kiki/jar/ && rm -fr && mv dev_jar/ ."
- ansible test-server -m shell -a "sudo systemctl restart "
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
3.钉钉通知
-事先在dingding申请一个钉钉机器人token
-在gitlab-runner所在的服务器写好这个脚本
#!/bin/bash
# 钉钉通知
# 自动化部署脚本中使用
DEPLOY_STATUS=$1
echo "========== 开始执行函数 ==========="
webhook='/robot/send?access_token=63xxxxxxxxxxxxxxxx7e9358dc'
sonar_url="/dashboard?id=${CI_PROJECT_NAME}-${CI_COMMIT_REF_NAME}&branch=${CI_COMMIT_REF_NAME}"
# 推送模板发送(模板拼接)
function sendDingTalkNotifications ( ) {
#logStep "STEP 5 - Send Notifications to DingTalk"
local title="[gitlab-ci]"
local text="### ${title} \n #### 构建工程:${CI_PROJECT_NAME} \n #### 构建分支:${CI_COMMIT_REF_NAME} \n #### 构建状态:${DEPLOY_STATUS}\n #### 提交者:${GITLAB_USER_EMAIL} \n
### 扫描详情:${sonar_url} \n\n ##### [流水线 Pipeline #${CI_PIPELINE_ID}](${CI_PROJECT_URL}/pipelines/${CI_PIPELINE_ID}) \n"
curl "$webhook" -H 'Content-Type: application/json' -d "{\"msgtype\": \"markdown\",\"markdown\": {\"title\":\"$title\",\"text\": \"$text\"}}"
}
#if [ "$?" -eq "0" ];then # "$?" -eq "0" 表示上一句脚本执行成功,1的话表示失败
# DEPLOY_STATUS='部署成功!'
# sendDingTalkNotifications
#else
# DEPLOY_STATUS='部署失败!'
sendDingTalkNotifications
#fi
echo "========== 结束执行函数 ==========="
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
然后,在gitlab-ci之中加入运行通知脚本的script
stages:
- build
- deploy
- ding_notify_failure_end
- ding_notify_success_end
build-dev: #build dev阶段
stage: build
tags:
- runner02 #gitlab-runner的tag
rules:
- if: '$CI_COMMIT_BRANCH == "dev"' #如果dev分支发生提交
script:
- git fetch
- git checkout dev
- git pull
- mvn clean
- mvn package
- if [ ! -d "dev_jar" ]; then mkdir dev_jar;fi
- cp ./validator/target/ ./dev_jar/
artifacts:
expire_in: 1 day
paths:
- ./dev_jar/ # 需要保留的构建产物
deploy-dev:
stage: deploy
tags:
- runner02 #gitlab-runner的tag
only:
- dev
script:
- ls ./dev_jar/
- ansible test-server -m copy -a "src=./dev_jar dest=/usr/local/kiki/jar/"
- ansible test-server -m shell -a "cd /usr/local/kiki/jar/ && rm -fr && mv dev_jar/ ."
- ansible test-server -m shell -a "sudo systemctl restart "
ding_notify_failure_end:
stage: ding_notify_failure_end
tags:
- runner02
when: on_failure
variables:
DEPLOY_STATUS: "构建失败,请查看构建详情"
script:
- bash /home/gitlab-ci/ $DEPLOY_STATUS
ding_notify_success_end_release:
stage: ding_notify_success_end
tags:
- runner02
only:
- dev
variables:
DEPLOY_STATUS: "构建成功"
script:
- bash /home/gitlab-ci/ $DEPLOY_STATUS
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
这是钉钉通知群的通知效果