参考官网:
gitlab持续集成流水线配置
结合官网,以一种探索性的方式,展示gitlab持续集成流水线的搭建过程。
环境
软件 | 版本 |
---|---|
gitlab | 11.5.1 |
gitlab-runner | 11.5.1 |
第一章 gitlab持续集成流水线 - 创建“流水线”
简介
如果您对“持续集成”“流水线”概念还处于模糊阶段,那么这节也许很适合您。
持续集成,对于当前的gitlab ci,个人理解,持续性表现在 gitlab push提交动作触发流水线、定时任务流水线;集成性的话想对较弱,至少是需要通过配置来加强。
流水线,基本上就是需要配置来实现,完成一整套操作:代码质量检查、单元测试、构建、接口测试等等。类似于工厂的流水线,毛件(代码等)放到传送带上,进行一系列检查(代码质量检查、测试)、处理(构建等),直到生成成品(可运行文件文件夹)或其他(出现异常、代码编译构建错误等)。
本章有两个目的,一是最简单的方式配置gitlab-ci流水线(暂时免去实际的操作),二是整体感受下gitlab-ci流水线。
还有,gitlab-ci流水线触发有三种方式,其中可通过“only”和“except”配置自定义触发方式:
- 默认方式,gitlab服务器接收到更新后自动触发
- Pipelines页面,“Run Pipeline”按钮,当然,单击后还需要选择分支,选择性添加变量,“Create pipeline”
- TOKEN+ Pipeline triggers API,http请求触发,创建token,然后如下页面往下翻会有调用方式详情。
简单例子
在代码库创建配置文件 .gitlab-ci.yml ,如下
配置stages和jobs,stages基本就是流水线的顺序,jobs有“sonar_analyze”和“my_build”,在此处,一个stage对应一个job,当然可以一个stage对应多个job。
job的tags,用于job与gitlab-runner关联配置(赶稿中。。。),只有打了这些标签的runner才配得上run我。
stages:
- analyze
- build
sonar_analyze:
script:
- echo sonar_analyze
- echo job done
tags:
- master
my_build:
script:
- echo my_build
- echo job done
tags:
- master
第二章 gitlab持续集成流水线 - 添加自定义操作
简介
在上章我们已经建立起自己的流水线,接下来,该添加实际应用中的操作步骤了。
需要重点说下的是,docker镜像的使用,这里是直接在(docker hub官网)[https://hub.docker.com/]找的,所以会出现有些工具没有的情况,在工程使用中是应该避免的,自动化成功率和这种流程精简密切相关的。
实用例子
# stages基本就是流水线的阶段顺序
stages:
- analyze
- build_build
- build_docker
- deploy
# 可以自定义一些参数,需要修改的参数方便配置
variables:
APP_ID: "app_id"
APOllO_HOST: "xxx.xxx.xxx.xxx:xxxx"
APPHOUSE_HOST: "xxx.xxx.xxx.xxx:xxx"
APPHOUSE_USER: "xxxx"
APPHOUSE_PASSWD: "xxxxxx"
TAG: "gitlab-pipline"
BRANCH: "master"
DB_HOST: "xxx.xxx.xxx.xxx:xxx"
DOCKER_BRANCH: "master"
GIT_NAME: "xxxx"
GIT_PASSWD: "xxxxx"
# sonar
SONAR_TOKEN: "xxxx"
SONAR_HOST: "http://xxx.xxx.xxx:9000"
# deploy
DEPLOY_IP: "xxx.xxx.xxx.xxx"
DEPLOY_USER: "xxx"
DEPLOY_PASSWD: "xxx"
# sonarqube结合maven,无缝连接,无需配置pom.xml
sonar_analyze:
stage: analyze
image: maven:3-jdk-8
script:
- cd $CI_PROJECT_DIR
- mvn -f pom.xml clean install -DskipTests
- mvn -f pom.xml -Dsonar.host.url=${SONAR_HOST} -Dsonar.login=${SONAR_TOKEN} -Dsonar.projectKey=gitlab:pipelines:exam -Dsonar.projectName=exam_gitlab_pipelines -Dsonar.sourceEncoding=UTF-8 -Dsonar.revision=xxxrevisionxxx sonar:sonar
tags:
- master
# 构建步骤,使用maven构建工具
build_maven:
stage: build_build
image: maven:3-jdk-8
script:
# 可以直接使用docker hub已有的镜像,那么如果有些工具确实了,可以使用下面的方式安装
# 缺点:很明显,默认apt源一般都较慢,受外网能力影响
# 解决方案,可以自己打定制镜像,放到本地架设的docker hub
- apt-get update
- apt-get install -y dos2unix
# 代码里面已经有一个build脚本,包括maven操作、文件格式转换、文件文件夹移动等
- chmod +x build
- ./build -m ${APP_ID} -b ${BRANCH} -v ${TAG}
- ls
tags:
- master
-
# 构建步骤,使用docker构建,并推送到docker hub
build_docker:
stage: build_docker
image: docker:stable-git
# docker in docker,docker里面的docker
services:
- name: docker:stable-dind
command: [ "--insecure-registry=https://xxx.xxx.xxx.xxx:xxx" ]
script:
- docker info
- cd $CI_PROJECT_DIR/..
- rm -rf my-docker
# 我们可以在这个环境中下载其他git库
- git clone http://${GIT_NAME}:${GIT_PASSWD}@xxx.xxx.xxx.xxx/xxxx/my-docker.git
# 使用sed简单处理下配置文件,自定义参数
- sed -i 's/--start-period=60s//g' $CI_PROJECT_DIR/../xxxx/${APP_ID}/Dockerfile
# docker制作组件镜像,build
- rm -rf my-docker/${APP_ID}/${APP_ID} && cp -rfv out/${APP_ID} my-docker/${APP_ID}/
- cd my-docker/${APP_ID} && chmod +x build.sh && sh build.sh -t ${TAG}
# 登录docker hub
- docker login -u${APPHOUSE_USER} -p${APPHOUSE_PASSWD} ${APPHOUSE_HOST}
# 推送制作好的镜像到docker hub
- docker push ${APPHOUSE_HOST}/ic/${APP_ID}:${TAG}
tags:
- master
deploy_ansible:
extends: .main
stage: deploy
image: williamyeh/ansible:ubuntu16.04
script:
- apt-get update
- apt-get install -y sshpass
- apt-get install -y git
- rm -rf my-docker
- git clone http://${GIT_NAME}:${GIT_PASSWD}@xxx.xxx.xxx.xxx/software/my-docker
- cd $CI_PROJECT_DIR/my-docker/common
# 配置文件设置服务器密码账号,结合sshpass,实现即时连接,无需设置key
- echo "[cd]" > hosts
- echo "${DEPLOY_IP} apollo_ip=${APOlLO_HOST} db_ip=${DB_HOST} apollo_ip=${APOlLO_HOST} ansible_ssh_user=${DEPLOY_USER} ansible_ssh_pass=${DEPLOY_PASSWD} ansible_sudo_pass=${DEPLOY_PASSWD}" >> hosts
- sed -i 's/#host_key_checking/host_key_checking/g' /etc/ansible/ansible.cfg # disable SSH key host checking
# 运行定制好的deploy.yml剧本
- ansible-playbook deploy.yml -i hosts -l cd -f 10 -e service_name=${APP_ID} -e tag=$TAG -b
tags:
- master
第三章 gitlab持续集成流水线 - 重构,更简练更强复用性
简介
基本上,需要的操作已经配置完成,显然,配置文件略显冗长,毫无复用性。
接下来,我们会用到,函数、模板job与一些其他的设计思路,进行重构。待续。。。