Loading

基于Docker构建Jenkins CI平台

环境

主机名 IP 配置 软件
harbor 172.16.1.71 2核/4G/60G docker、harbor
gitlab 172.16.1.72 2核/4G/60G docker、gitlab
jenkins 172.16.1.73 2核/4G/60G docker、jenkins

主机:centos7.5

说明:docker的安装,可以参考其他文档,这里就不赘述了。

1、部署Gitlab

在172.16.1.72节点上操作

1.1 部署Gitlab

# mkdir /opt/gitlab
# GITLAB_HOME=/opt/gitlab
# docker run --detach \
--hostname gitlab.lc.com \
--publish 443:443 --publish 80:80 --publish 2222:22 \
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab \
--volume $GITLAB_HOME/logs:/var/log/gitlab \
--volume $GITLAB_HOME/data:/var/opt/gitlab \
-v /etc/localtime:/etc/localtime \
gitlab/gitlab-ce:latest

访问地址:http://172.16.1.72:80

初次会先设置管理员密码 ,然后登陆,默认管理员用户名root,密码我这里设置为12345678

1.2 创建项目,提交测试代码

进入gitlab后先创建名为"java-demo"的项目,提交代码,以便后面测试。

# unzip tomcat-java-demo-master.zip
# cd tomcat-java-demo-master
# git init
# git config --global user.email "you@example.com"
# git config --global user.name "Your Name"
# git remote add origin http://172.16.1.72:80/root/java-demo.git
# git add .
# git commit -m 'all'
# git push origin master

2、部署Harbor镜像仓库

在172.16.1.71节点上操作

2.1 安装docker与docker-compose

2.2 解压离线包部署

# cp docker-compose-Linux-x86_64 /usr/bin/docker-compose
# chmod +x /usr/bin/docker-compose
# tar zxvf harbor-offline-installer-v2.1.1.tgz
# cd harbor
# cp harbor.yml.tmpl harbor.yml
# vi harbor.yml
hostname: reg.lc.com
https:   # 先注释https相关配置
harbor_admin_password: Harbor12345
# ./prepare
# ./install.sh

访问地址:http://172.16.1.71:80

默认管理员用户名root,密码为harbor.yml配置文件中harbor_admin_password配置参数设置的密码Harbor12345

2.3 在Jenkins主机配置Docker可信任

在172.16.1.73节点上操作

如果是HTTPS需要拷贝证书,由于habor未配置https,需要在docker配置可信任。

# echo "172.16.1.71 reg.lc.com" >>/etc/hosts
# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://b1cx9cn7.mirror.aliyuncs.com"],
"insecure-registries": ["reg.lc.com"]
}
# systemctl daemon-reload
# systemctl restart docker
# docker login reg.lc.com

3、部署Jenkins

在172.16.1.73节点上操作

3.1 准备JDK和Maven环境

将二进制包上传到服务器并解压到工作目录,用于让Jenkins容器挂载使用。

# tar zxvf jdk-8u45-linux-x64.tar.gz
# mv jdk1.8.0_45 /usr/local/jdk
# tar zxf apache-maven-3.5.0-bin.tar.gz
# mv apache-maven-3.5.0 /usr/local/maven

修改Maven源:

# vi /usr/local/maven/conf/settings.xml

<mirrors>

<mirror>
<id>central</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

</mirrors>
# docker run -d --name jenkins -p 80:8080 -p 50000:50000 -u root \
   -v /opt/jenkins_home:/var/jenkins_home \
   -v /var/run/docker.sock:/var/run/docker.sock \
   -v /usr/bin/docker:/usr/bin/docker \
   -v /usr/local/maven:/usr/local/maven \
   -v /usr/local/jdk:/usr/local/jdk \
   -v /etc/localtime:/etc/localtime \
   --restart=always \
   --name jenkins jenkins/jenkins
  

参数说明:
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
表示将宿主机上的docker命令提供给Jenkins容器内部使用,这样Jenkins容器在使用pipeline脚本
构建docker镜像时就可以调用宿主机上的docker命令,且构建的镜像也在宿主机上。

访问地址:http://172.16.1.73:80

解锁Jenkins:使用 docker logs jenkins 命令查看Jenkins解锁密码。

自定义Jenkins:选择插件来安装—>无—>安装

创建用户:我这里用户名设置为root,密码设置为12345678

3.2 构架tomcat基础镜像

使用Dockerfile文件构建一个名为tomcat:v1的基础镜像,并上传到harbor镜像仓库

1 构建tomcat:v1镜像
# tar -xzf tomcat.tar.gz
# cd tomcat/
# docker build -t tomcat:v1 .

2 push镜像到harbor仓库
# docker tag tomcat:v1 reg.lc.com/library/tomcat:v1
# docker push reg.lc.com/library/tomcat:v1

3.3 安装插件

默认从国外网络下载插件,会比较慢,建议修改国内源:

# cd /opt/jenkins_home/updates
# sed -i 's/https:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
# sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
# systemctl daemon-reload
# docker restart jenkins

管理Jenkins->系统配置-->管理插件-->搜索Chinese (Simplified)/git/pipeline,选中点击安装。

4、发布测试

4.1 创建项目并配置

New Item -> Pipeline(java-test) -> This project is parameterized -> String Parameter

  • Name:Branch # 变量名,下面脚本中调用

  • Default Value:master # 默认分支

  • Description:发布的代码分支 # 描述

4.2 添加凭据

管理Jenkins->安全-->管理凭据->Jnekins->全局凭据(添加凭据)->Username with password

  • Username:用户名

  • Password:密码

  • ID:留空

  • Description:描述

分别添加连接git和harbor凭据,并修改脚本为实际凭据ID。

4.3 Pipeline脚本

#!/usr/bin/env groovy

def registry = "reg.lc.com"
// harbor仓库地址
def project = "library"
// harbor仓库中存放镜像的项目名称
def app_name = "java-demo"
// 构建docker镜像的名称
def image_name = "${registry}/${project}/${app_name}:${Branch}-${BUILD_NUMBER}"
// 拼接的docker镜像仓库的地址,方便向harbor项目中推送构建完成的镜像。
// 使用${Branch}-${BUILD_NUMBER},即git分支名和Jenkins构建ID作为镜像唯一标识。
def git_address = "http://172.16.1.72:80/root/java-demo.git"
// 项目代码git仓库地址
def docker_registry_auth = "f6d3afa1-aa7a-404b-8678-0db2d07ea0a9"
// Jenkins连接harbor仓库的用户凭证ID
def git_auth = "f011e4f7-c1ae-4f49-a9d8-0f3420c037b2"
// Jenkins连接git代码库的用户凭证ID

pipeline {
    agent any
    stages {
        stage('拉取代码'){
            steps {
              checkout([$class: 'GitSCM', branches: [[name: '${Branch}']], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
            }
        }

        stage('代码编译'){
           steps {
             sh """
                pwd
                ls
                JAVA_HOME=/usr/local/jdk
                PATH=$JAVA_HOME/bin:/usr/local/maven/bin:$PATH
                mvn clean package -Dmaven.test.skip=true
                """ 
           }
        }

        stage('构建镜像'){
           steps {
                withCredentials([usernamePassword(credentialsId: "${docker_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
                sh """
                  docker login -u ${username} -p '${password}' ${registry}
                  echo '
                    FROM ${registry}/library/tomcat:v1
                    LABEL maitainer liuchang
                    RUN rm -rf /usr/local/tomcat/webapps/*
                    ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
                  ' > Dockerfile
                  docker build -t ${image_name} .
                  docker push ${image_name}
                """
                }
           } 
        }

        stage('部署到Docker'){
           steps {
              sh """
              docker rm -f tomcat-java-demo |true
              docker container run -d --name tomcat-java-demo -p 88:8080 ${image_name}
              """
            }
        }
    }
}

上述脚本中,docker_registry_auth 和git_auth变量的值为Jenkins凭据ID,添加凭据后修改。

4.4 Jenkins工作空间

Jenkins工作空间是Jenkins在构建Jenkins项目时的工作目录,每个Jenkins项目都有其单独的工作目录,该目录主要存放构建Jenkins项目时所用的
从gitlab仓库拉取的代码,打包完成的代码包,dockerfile等。

[root@jenkins ~]# ls -l /opt/jenkins_home/workspace/
total 0
drwxr-xr-x 6 root root 118 Nov 14 14:24 java-test
drwxr-xr-x 2 root root   6 Nov 14 14:24 java-test@tmp

[root@jenkins ~]# ls -l /opt/jenkins_home/workspace/java-test
total 24
drwxr-xr-x 2 root root    34 Nov 14 14:24 db
-rw-r--r-- 1 root root   250 Nov 14 14:24 Dockerfile
-rw-r--r-- 1 root root 11357 Nov 14 14:24 LICENSE
-rw-r--r-- 1 root root  1930 Nov 14 14:24 pom.xml
-rw-r--r-- 1 root root   270 Nov 14 14:24 README.md
drwxr-xr-x 3 root root    18 Nov 14 14:24 src
drwxr-xr-x 7 root root   170 Nov 14 14:24 target

# ls -l /opt/jenkins_home/workspace/java-test/target/
total 17840
drwxr-xr-x 5 root root       95 Nov 14 14:24 classes
drwxr-xr-x 3 root root       25 Nov 14 14:24 generated-sources
drwxr-xr-x 4 root root       37 Nov 14 14:24 ly-simple-tomcat-0.0.1-SNAPSHOT
-rw-r--r-- 1 root root 18265403 Nov 14 14:24 ly-simple-tomcat-0.0.1-SNAPSHOT.war
drwxr-xr-x 2 root root       28 Nov 14 14:24 maven-archiver
drwxr-xr-x 3 root root       35 Nov 14 14:24 maven-status

# ls -l /opt/jenkins_home/workspace/java-test@tmp/
total 0

4.5 镜像、容器信息

[root@jenkins ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
reg.lc.com/library/java-demo   master-6            c070738ab140        20 minutes ago      784MB
reg.lc.com/library/tomcat      v1                  52468fd10719        12 hours ago        766MB
jenkins/jenkins                latest              13e2b551515d        3 days ago          717MB
centos                         7                   7e6257c9f8d8        3 months ago        203MB

[root@jenkins ~]# docker ps
CONTAINER ID  IMAGE                                 COMMAND                CREATED          STATUS
PORTS                                                         NAMES
9a4ae1a3ce29  reg.lc.com/library/java-demo:master-6 "catalina.sh run"      20 minutes ago   Up 20 minutes
0.0.0.0:88->8080/tcp                                          tomcat-java-demo

25c4f68c3188  jenkins/jenkins                       "/sbin/tini -- /usr/…" 13 hours ago     Up 22 minutes       0.0.0.0:50000->50000/tcp, 0.0.0.0:80->8080/tcp                jenkins

posted @ 2021-04-24 20:54  云起时。  阅读(167)  评论(0编辑  收藏  举报