使用gitlab-ci自动发布你的应用

时间:2024-10-28 07:57:03

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

这是钉钉通知群的通知效果
在这里插入图片描述