gitlab CI脚本编写

从 GitLab 8.0 开始,GitLab CI 就已经集成在 GitLab 中,我们只要在项目中添加一个 .gitlab-ci.yml 文件,然后添加一个 Runner,即可进行持续集成。 而且随着 GitLab 的升级,GitLab CI 变得越来越强大,本文将介绍如何使用 GitLab CI 进行持续集成。 一些概念 在介绍 GitLab CI 之前,我们先看看一些持续集成相关的概念。 参考链接

https://segmentfault.com/a/1190000006120164

CI配置详解参考

https://segmentfault.com/a/1190000011881435

环境介绍:

develop分支: IP: 192.168.1.92   系统:centos7.4 web目录/develop/

test分支:  IP: 192.168.1.136 系统:centos7.4 web目录/www/

master分支:  IP: 192.168.1.61  系统:centos7.4 web目录/www/

gitlab服务器:   IP: 192.168.1.37  系统:centos7.4

ssh端口都是22

gitlab服务器,需要安装gitlab,docker

docker的镜像列表如下:

kb-rsync

docker.io/gitlab/gitlab-runner

docker.io/alpine

其中kb-rsync是自己制作的,后续文章会讲到

192.168.1.92 需要安装dns服务器

.gitlab-ci.yml完整代码如下:

#镜像地址,通过docker images查看
image: kb-rsync

#构建阶段
stages:
  #需要执行的流程,按照顺序来,就是deploy
  - deploy

#定义环境变量
variables:
  #项目名
  PROJECT_NAME: kuaidihelp_monitor
  
  #develop(开发分支),服务器IP地址
  DEV_ADDRES_IP: "192.168.1.92"
  #服务器ssh端口
  DEV_ADDRES_PORT: "22"
  #项目访问域名
  DEV_DOMAIN: "http://${PROJECT_NAME}.baidu.com"

  #test(测试分支)
  TEST_ADDRES_IP: "192.168.1.136"
  TEST_ADDRES_PORT: "22"
  TEST_DOMAIN: "http://${PROJECT_NAME}.baidu.com"

  #demo(预发布/灰度 分支)
  #DEMO_ADDRES_IP: "10.20.1.179"
  #DEMO_ADDRES_PORT: "2020"

  #prod(线上master分支)
  PROD_ADDRES_IP: "192.168.1.61"
  PROD_ADDRES_PORT: "22"
  PROD_DOMAIN: "http://${PROJECT_NAME}.baidu.com"

  #gitlab服务器端口号
  GITLAB_ADDRES_PORT: "22"
  #gitlab访问地址
  GITLAB_ADDRES_IP: "testgitlab.baidu.com"

#docker执行脚本前的动作
before_script:
  #创建ssh目录
  - mkdir -p ~/.ssh
  #读取Settings->CI/CD->Secret variables 添加的公钥变量
  - echo "$ID_RSA_PUB" > ~/.ssh/id_rsa.pub
  #读取私钥变量,并设置权限为600(必须要600,否则报错)
  - echo "$ID_RSA" > ~/.ssh/id_rsa && chmod 0600 ~/.ssh/id_rsa
  #收集主机公钥,写入known_hosts,避免出现Are you sure you want to continue connecting (yes/no)? 
  #注意:ecdsa是针对centos7系统的,如果是centos6 需要使用rsa
  #以下命令是将各个环境的主机公钥写入docker容器的~/.ssh/known_hosts文件
  - ssh-keyscan -H -t ecdsa -p $DEV_ADDRES_PORT $DEV_ADDRES_IP >> ~/.ssh/known_hosts
  - ssh-keyscan -H -t ecdsa -p $TEST_ADDRES_PORT $TEST_ADDRES_IP >> ~/.ssh/known_hosts
  #因为目前还没有灰度环境,这里先注释掉
  #- ssh-keyscan -H -t rsa -p $DEMO_ADDRES_PORT $DEMO_ADDRES_IP >> ~/.ssh/known_hosts
  - ssh-keyscan -H -t ecdsa -p $PROD_ADDRES_PORT $PROD_ADDRES_IP >> ~/.ssh/known_hosts
  - ssh-keyscan -H -t ecdsa -p $GITLAB_ADDRES_PORT $GITLAB_ADDRES_IP >> ~/.ssh/known_hosts

#deploy_dev(开发)任务
deploy_dev:
  stage: deploy
  script:
    #将gitlab仓库代码同步到开发服务器,排除.git目录,代码以gitlab仓库为准,不匹配的,直接删除掉。
    #将代码同步到测试服务器的/develop/目录下
    - rsync -avztH -e "ssh -p $DEV_ADDRES_PORT" --exclude ".git" --delete ./ $DEV_ADDRES_IP:/develop/${PROJECT_NAME}/
  only:
    #当一个分支被push上来
    - branches
  tags:
    #对应了注册runner的时候的tags
    - dev
  except:
    #except是排除的意思,排除了master,test,除了develop以外的分支
    - master
    - test
    - /^(?!develop).*$/
  #environment 定义让job完成部署的环境名称
  environment:
    name: dev
    url: $DEV_DOMAIN

#deploy_test(测试)任务
deploy_test:
  stage: deploy
  script:
    #将代码同步到测试服务器的/www/目录下
    - rsync -avztH -e "ssh -p $TEST_ADDRES_PORT" --exclude ".git" --delete ./ $TEST_ADDRES_IP:/www/${PROJECT_NAME}/
  #只针对哪个分支
  only:
    #只针对于test分支
    - test
  tags:
    #对应了注册runner的时候的tags
    - vpc
  environment:
    name: test
    url: $TEST_DOMAIN

#deploy_demo:
#  stage: deploy
#  script:
#    - rsync -avztH -e "ssh -p $DEMO_ADDRES_PORT" --exclude ".git" --delete ./ $DEMO_ADDRES_IP:/www/${PROJECT_NAME}/
#  when: manual
#  only:
#    - demo
#  tags:
#    - vpc

#deploy_prod(上线)任务
deploy_prod:
  stage: deploy
  script:
    ##将代码同步到线上服务器的/www/目录下
    - rsync -avztH -e "ssh -p $PROD_ADDRES_PORT" --exclude ".git" --delete ./ $PROD_ADDRES_IP:/www/${PROJECT_NAME}/
  #when(什么时候执行) manual表示手动执行job的时候触发
  when: manual
  only:
    #表示只有打了tags之后,才会触发
    - tags
  tags:
    - vpc
  environment:
    name: prod
    url: $DOMAIN
  #允许生成失败。失败的构建不会导致提交状态。默认是true,这里表示不允许失败
  allow_failure: false

实现的功能:

当代码提交到develop分支的时候,自动将develop分支代码同步到测试服务器的/develop目录

当代码提交到test分支的时候,自动将test分支代码同步到测试服务器的/www目录

当代码提交到master分支的时候,必须要先手动打tag,然后点击CI/CD的tags任务

等到任务完成之后,自动将master分支代码同步到线上服务器的/www目录

kb-rsync的Dockerfile

# mkdir -p /opt/docker/kb-rsync
# vim /opt/docker/kb-rsync/Dockerfile

内容如下:

FROM docker.io/alpine

RUN echo "#aliyun" > /etc/apk/repositories
RUN echo "https://mirrors.aliyun.com/alpine/v3.6/main/" >> /etc/apk/repositories
RUN echo "https://mirrors.aliyun.com/alpine/v3.6/community/" >> /etc/apk/repositories
RUN apk update
RUN apk add openssh-client rsync

开始制作镜像

# docker build -t kb-rsync /opt/docker/kb-rsync

由于CI执行的任务依赖于runner,下一篇文章详细介绍,如何注册runner

http://www.py3study.com/Article/details/id/141.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序小工

【Docker】--安装与配置

docker 是 linux 虚拟化技术,能够一键式搭建开发环境,并且能保证运维、开发、上线部署的环境完全一致,避免了运行环境差异性带来的问题。 具有简单、轻...

15530
来自专栏偏前端工程师的驿站

CentOS6.5菜鸟之旅:U盘安装CentOS64位

一、前言                                      之前下载了个CentOS7 32位版,一下就安装成功了,但由于其目录结构等与...

39650
来自专栏运维前线

CentOS6 安装couchdb2 集群

CentOS6 安装couchdb2 集群 参考:http://blog.csdn.net/wh211212/article/details/74359497...

275100
来自专栏实战docker

Docker下dubbo开发,三部曲之二:本地环境搭建

在上一篇文章《Docker下dubbo开发,三部曲之一:极速体验》中,我们快速体验了dubbo服务的注册、发现、调用,今天我们一起在本地制作一套这样的环境,经过...

40370
来自专栏云计算教程系列

如何在Ubuntu 18.04上使用Traefik作为Docker容器的反向代理

Docker可以是在生产中运行Web应用程序的有效方法,但您可能希望在同一个Docker主机上运行多个应用程序。在这种情况下,您需要设置反向代理,因为您只想公开...

56820

20分钟搞定——通过Docker部署Spring Boot应用程序到Bluemix云计算平台

我很想了解关于 Java 中 Spring 框架的更多内容。借 Spring 之势来构建企业应用程序,其简单性使得它非常有趣。于是我着手实践了一个简单的教程,并...

33580
来自专栏杂烩

Rancher运行dubbo服务 原

        5、dubbo是dubbo-spring-boot-starter:1.0.0

18020
来自专栏乐沙弥的世界

java环境配置及jps命令未找到

最近基于CentOS 7下安装hadoop集群,碰到了java环境变量的问题,同时也出现了jps命令无法找到的情况。简要描述一下基于CentOS 7下Java环...

17530
来自专栏小狼的世界

Kubernetes中Pod的健康检查

我们先来看一下Kubernetes的架构图,每个Node节点上都有 kubelet ,Container Probe 也就是容器的健康检查是由 kubelet ...

40910
来自专栏熊二哥

SpringBoot详细研究-04部署测试与监控

这部分的内容实际就是devops的主要工作内容,当然一名合格的程序要也需要掌握这部分的知识。 ? ? 热部署 简单来说,在开发时,修改了任何的代码,I...

27090

扫码关注云+社区

领取腾讯云代金券