四时宝库

程序员的知识宝库

容器化CICD的实现方案(容器化技术 k8)

Author:Thor


一、现状

在目前的软件开发和发布中,已经形成了一套标准的流程。即持续集成、持续交付和持续部署。

这也称为CICD的过程,目前要解决的问题是如何在CICD中使用容器来完成。

1.持续集成

持续集成指的是频繁的将代码集成到主干,这有两个好处:1是保持主干的不断更新,防止后期大规模集成的难度。2是可以快速发现错误,定位错误。



2.持续交付

持续交付是持续集成的下一步,即不管怎么更新,项目是随时随地可以交付的。



3.持续部署

在持续交付之后,通过持续部署可以将代码自动的部署到生产环境。

持续部署的目标是代码在任何时刻都是可部署的,可以进入生产阶段。



4.容器化

在Devops和大规模集群管理方面,容器化是必须要介入的。

docker、docker compose、Kubernetes等将会作为容器化工具。

二、容器化CI实现方案


1.容器化CI方案



2.关键步骤

1) 基于Docker安装Gitlab-runner


2)为gitlab的组或是项目注册Runner



docker exec -it gitlab-runner gitlab-runner register


# 在gitlab的组或项目中的设置-cicd-runner或获取:GitLab 地址

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):

http://192.168.17.200/


# 输入 GitLab Token

Please enter the gitlab-ci token for this runner:

1Lxq_f1NRfCfeNbE5WRh


# 输入 Runner 的说明

Please enter the gitlab-ci description for this runner:

可以为空


# 设置 Tag,可以用于指定在构建规定的 tag 时触发 ci

Please enter the gitlab-ci tags for this runner (comma separated):

deploy


# 这里选择 true ,可以用于代码上传后直接执行

Whether to run untagged builds [true/false]:

true


# 这里选择 false,可以直接回车,默认为 false

Whether to lock Runner to current project [true/false]:

false


# 选择 runner 执行器,选择的是 shell

Please enter the executor: virtualbox, docker+machine, parallels, shell, ssh, docker-ssh+machine, kubernetes, docker, docker-ssh:

shell





3)在项目工程中编写.gitlab-ci.yml文件



stages:

- build

- push

- run

- clean


build:

stage: build

only:

- develop

- master

script:

- /usr/local/maven/apache-maven-3.6.3/bin/mvn clean package

- cp target/my-cicd-demo-1.0.0-SNAPSHOT.jar docker

- cd docker

- docker build -t my-cicd-demo:v1.0.0 .

- docker tag my-cicd-demo:v1.0.0 192.168.17.200:5000/my-cicd-demo:v1.0.0


push:

stage: push

only:

- develop

- master

script:

- docker push 192.168.17.200:5000/my-cicd-demo:v1.0.0


run:

stage: run

only:

- develop

- master

script:

- cd docker

- docker-compose down

- docker-compose up -d



clean:

stage: clean

only:

- develop

- master

script:

- docker image prune -f




上面的配置把一次流水线分成了四个作业:

a. build: 构建,用gitlab runner中安装的maven 打包项目,进入项目的docker文件夹,使用Dockerfile构建镜像。并为镜像打标。

Dockerfile文件如下:



FROM openjdk:8-jre


RUN mkdir /app


COPY my-cicd-demo-1.0.0-SNAPSHOT.jar /app/app.jar

ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar"]


EXPOSE 8080




b. push: 将镜像推送到镜像私服中。

c. run: 用docker运行镜像,实际运行的是项目中的docker-compose.yml



docker-compose.yml:

version: '3.1'

services:

my-cicd-demo:

image: 192.168.17.200:5000/my-cicd-demo:v1.0.0

container_name: my-cicd-demo

ports:

- 9009:8080



d. clean: 清除虚悬镜像

注意:设置 Job.only 后,只有当 develop 分支和 master 分支有提交的时候才会触发相关的 Jobs。


3.测试集成效果

所有操作完成后push代码到gitlab,查看流水线中的各项作业是否成功。



成功后查看镜像私服,镜像是否已上传;查看开发服务器,容器已正常运行。


三、容器化CD实现方案


1.容器化CD方案



2.关键步骤


1)jenkins所需插件:

· publish over ssh

· choice parameters

· Maven Integration

2)配置jenkins到gitlab的免密登陆


3)在jenkins中配置publish over ssh

这一步的目的是jenkins能将文件推送到目标服务器的/usr/local/jenkins路径下。



4)在jenkins中创建maven任务


5)第一次构建只做代码拉取


6)正式构建时添加参数化构建

使用groovy脚本拉取gitlab上最新tag


groovy脚本:



def ver_keys = [ 'bash', '-c', 'cd /var/lib/jenkins/workspace/my-cicd-demo;git pull>/dev/null; git remote prune origin >/dev/null; git tag -l|sort -r |head -10 ' ]

ver_keys.execute().text.tokenize('\n')



7)添加构建步骤

拉取最新脚本代码,并用maven打包



shell:



echo $RELEASE_VERSION

cd /var/lib/jenkins/workspace/my-cicd-demo

git checkout $RELEASE_VERSION

git pull origin $RELEASE_VERSION

mvn clean package



8)添加ssh publisher执行脚本

该步骤将jenkins中打包出的jar包及项目中的docker文件夹传输到目标服务器,并在目标服务器上构建镜像、打标镜像、上传镜像到镜像私服、生成容器。

exec command:



cd /usr/local/jenkins/my-cicd-demo

cp target/my-cicd-demo-$RELEASE_VERSION.jar docker

cd docker

docker build -t my-cicd-demo:$RELEASE_VERSION .

docker tag my-cicd-demo:$RELEASE_VERSION 192.168.17.200:5000/my-cicd-demo:$RELEASE_VERSION

docker push 192.168.17.200:5000/my-cicd-demo:$RELEASE_VERSION

docker-compose down

docker-compose up -d

docker image prune -f



至此,容器化CD得以实现。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接