这一篇,我们介绍一下使用Gitlab-runner进行持续集成与部署,经过以往的经验,我们使用Jenkins的时候,会在jenkins中安装一系列的开发环境包,比如:
- node.js
- go
- maven
- gradlew/gradle
- ...
当然也有最佳实践,就是可以不在jenkins中集成这些开发工具,我们可以将这些开发环境包在Jenkinsfile的agent中通过docker镜像也能解决,如Jenkinsfile:
代码语言:javascript复制pipeline {
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2'
}
}
stages {
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
}
}
同样的在Gitlab-runner中我们也能这样做,可能还更简单,在第二篇小实践的时候就知道,我们可以通过指定不同的tags来将stage调度到不同的runner上去在特定的开发环境中编译构建我们的镜像。这一部分实践,我们使用Python语言的一个Flask web的demo来研究一下,如何进行持续构建与持续部署。
我们可以在https://github.com/opsenv/flask-web-demo.git中fork一下代码,然后克隆到本地进行实践。我们先来看一下源代码中的 .gitlan-ci.yml
stages:
- style
- test
- deploy
pep8:
stage: style
script:
- pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com tox
- tox -e pep8
tags:
- python2.7
unittest-py2.7:
stage: test
script:
- pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com tox
- tox -e py27
tags:
- python2.7
unittest-py3.4:
stage: test
script:
- pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com tox
- tox -e py34
tags:
- python3.4
这里来简单的解析一下这个文件:
- stages是描述执行哪些stage的,按照数组的先后顺序进行执行;
- 下面的
pep8
,unittest-py2.7
,unittest-py3.4
这些是job名称,在gitlab-ci.yml中,这些job名称是唯一的,不能重复的 - job是否被执行,要看job下面的stage是否在stages中被引用,多个job可能包含同名的stage名称,表示同级的含义
- script是在每个stage运行的过程中执行的命令;这些命令与tags指令的环境有关
- tags是匹配gitlab-runner标签,将当前的script运行在tags所匹配到的gitlab-runner的环境中
这些简单的解释一下,文件是不是很简单了,文件中有一个tox命令,这个是用来检测python的兼容性的测试工具,感兴趣的可以自己研究一下;
通过上面的解析,我们发现tags有三类,分别是 default
, python2.7
, python3.4
,默认的default,在前面的时候我们已经部署过了,现在我们来准备一下剩余的两个python环境:
在安装完成后,我们可以在gitlab上进行查看其状态;同样如第二篇实践一样,我们把flask-web项目enable到gitlab-runner中;
这样我们就可以在CI/CD下面的Pipeline中运行流水线了
现在我们已经完成了兼容性测试了
下面应该进行构建和部署了,我们在 .gitlab-ci.yml
尾部增加上一个job,用于构建和部署:
docker-deploy:
stage: deploy
script:
- docker build -t flask-demo:latest .
- if [ $(docker ps -qa --filter name=flask-web-demos-xue) ];then docker rm -f flask-web-demos-xue;fi
- docker run -d --name flask-web-demos-xue -p 15000:5000 flask-demo:latest
tags:
- default
看起来很简单,通过docker构建一个flask-demo的镜像,为了能够持续部署,我们需要简单的判断一下服务器上是否存在已经部署的测试容器,如果有的话,为了避免端口冲突,我们需要将其删除掉(下线),然后在部署新的容器,看一下效果图:
然后我们看一下flask-demo的效果图:
是不是很简单,现在我们就完成了使用gitlab-runner进行对python服务的持续构建与部署了。