Jenkins安装(Docker)

1. 拉取Jenkins镜像

访问Jenkins,在Stable (LTS)下找到最新版本号替换如下命令:
docker pull jenkins/jenkins:2.541.2-lts

2. 创建docker-compose文件

mkdir -p /usr/local/docker/jinkins_docker
cd /usr/local/docker/jinkins_docker/
vi docker-compose.yml

1
2
3
4
5
6
7
8
9
10
services:
 jenkins:
   image: jenkins/jenkins:2.541.2-lts
   container_name: jenkins
   restart: always
   ports:
     - "8080:8080"
     - "50000:50000"
   volumes:
     - ./data:/var/jenkins_home

4. 启动docker-compose

docker-compose up -d
第一次启动会创建data目录,但是没权限,此时停止,修改Jenkins插件更新源后赋予权限:
docker-compose down
vim data/hudson.model.UpdateCenter.xml

1
2
3
4
5
6
7
<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>https://mirrors.huaweicloud.com/jenkins/updates/update-center.json</url>
  </site>
</sites>

chmod -R 777 ../jinkins_docker/
docker-compose up -d
此时通过以下命令可以看到Jenkins的管理员密码:
docker logs -f jenkins

5. Jenkins初始化

  1. 在宿主机通过 http://10.10.10.11:8888 访问Jenkins,输入刚获取的管理员密码。
  2. 选择选择插件来安装,在新页面保持默认点击安装,等待安装完成。
  3. 使用设置的新密码重新登陆Jenkins,点击右上角齿轮,点击全局工具配置
  4. 在后端执行mv /usr/local/{maven,jdk} /usr/local/docker/jinkins_docker/data/`把Maven和JDK放到Jenkins的数据目录。
  5. 返回前端指定Maven和JDK地址,注意使用容器地址而不是宿主机地址。
  6. 在前端点击右上角齿轮,点击插件管理,在Available plugins搜索Publish Over SSHGit Parameter安装。
  7. 在前端点击右上角齿轮,点击系统配置,最后找到Publish Over SSH下的SSH Server,按情况填写账号密码等信息。

6. 创建Gitlab仓库并提交本地代码

  1. 打开Gitlab创建新项目mytest,可见性选择公开
  2. 点击mytest,点击项目设置,点击仓库,点击受保护的分支,取消保护。
  3. 在本地项目文件夹打开Git bash,依次输入以下命令:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    在当前目录初始化一个新的 Git 仓库
    git init
    设置远程仓库的 URL地址(origin是远程仓库的默认名称)
    git remote set-url origin http://10.10.10.11:8888/root/mytest.git
    指定分支为main
    branch -M main
    全局配置 Git的用户名
    git config --global user.name "loonzh"
    全局配置 Git 的用户邮箱
    git config --global user.email "loonzh@qq.com"
    关闭 SSL 证书验证
    git config --global http.sslVerify false
    允许使用旧版/不安全的 HTTP 协议
    git config --global http.unsafeLegacyProtocolCheck true
    配置凭证助手为manager,避免每次推送都输入密码
    git config --global credential.helper manager
    将当前目录(.)的所有文件添加到暂存区
    git add .
    将暂存区的文件提交到本地仓库(-m 后面是提交说明)
    git commit -m "Initial commit"
    将暂存区的文件提交到本地仓库
    将本地代码推送到远程仓库(-u 建立本地分支与远程分支的关联,后续可直接用 git push)
    git push -uf origin main
    
  4. 打开Gitlab,项目文件已经push到仓库中。

7. Jenkins实现基础CI操作

  1. 打开Jenkins,点击新建Item,输入项目名后选择Freestyle project
  2. 源码管理处配置Gitlab地址并指定分支为main
  3. 点击Build Steos,选择调用顶层 Maven 目标,选择配置好的maven版本,在目标框输入clean package -DskipTests
  4. 点击With Ant,选择之前配置的JDK。
  5. 点击构建后操作,选择Send build artifacts over SSH,在Source files填写target/*.jar docker/*
  6. Exec command填写:
    1
    2
    3
    4
    5
    cd /usr/local/test/docker
    mv ../target/*jar ./
    docker-compose down
    docker-compose up -d --build
    docker image prune -f
    
  7. docker目录创建Dockerfiledocker-compose.yml,推送文件后点击立即构建,第一次需要下载镜像所以速度较慢,构建完成后访问http://10.10.10.12:8081即可看到mytest的欢迎页。

Dockerfile示例:
docker pull ringcentral/jdk:8u202

1
2
3
4
FROM ringcentral/jdk:8u202
COPY *.jar /usr/local/app.jar
WORKDIR /usr/local
ENTRYPOINT ["java", "-jar", "app.jar"]

docker-compose.yml示例:

1
2
3
4
5
6
7
8
9
services: 
 mytest: 
   build: 
     context: ./ 
     dockerfile: Dockerfile 
   image: mytest:v1.0.1
   container_name: mytest 
   ports:
     - "8081:8080"

8. Jenkins实现基础CD操作

  1. 配置里勾选参数化构建过程,添加Git 参数,名称和描述自定义,参数类型标签,默认值填origin/main
  2. 点击Build Steos,选择执行 shell,输入git checkout $tag后把框体移动到调用顶层 Maven 目标上方。
  3. 打开Gitib新增标签1.0.0,保存当前版本。
  4. 开发更改代码后push,在Gitlib新增标签1.0.1
  5. 在Jenkins点击Build with Parameters,选择版本,访问http://10.10.10.12:8081即可看到mytest的欢迎页相应变化。

9. Jenkins使用宿主机的Docker

cd /usr/local/docker/jinkins_docker
docker-compose down
vi docker-compose.yml,在volumes:项下追加:

1
2
3
- /usr/bin/docker:/usr/bin/docker
- /etc/docker/daemon.json:/etc/docker/daemon.json
- /var/run/docker.sock:/var/run/docker.sock

groupadd docker
chown root:docker /etc/docker/daemon.json
chown root:docker /var/run/docker.sock
docker-compose up -d

10. 在Docker添加Harbor仓库地址

vi /etc/docker/daemon.json,在"registry-mirrors": [的上一行追加"insecure-registries": ["10.10.10.12:80"],
systemctl restart docker

11. 目标服务器构建制作镜像脚本

vi deploy.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash

harborAddr=$1
harborRepo=$2
projectName=$3
imageTag=$4
hostPort=$5
containerPort=$6

imageName=$harborAddr/$harborRepo/$projectName:$imageTag
containerId=`docker ps -a | grep ${projectName} | awk '{print $1}'`
tags=`docker images | grep ${projectName} | awk '{print $2}'`

if [ "$containerId" != "" ]; then
    docker stop $containerId
    docker rm $containerId
fi

if [[ "$tags" =~ "$imageTag" ]]; then
    docker rmi $imageName
fi

docker login -u admin -p Harbor12345 $harborAddr
docker pull $imageName
docker run -d -p $hostPort:$containerPort --name $projectName $imageName

chmod a+x deploy.sh
mv deploy.sh /usr/bin/

12. Jenkins制作镜像并推送Harbor

  1. 点击General,在参数化构建过程最下边点击添加参数,选择字符参数,名称hostPort,默认值8081
  2. 再次点击添加参数,选择字符参数,名称containerPort,默认值8080
  3. 在项目的配置里,点击Build Steps,在Execute SonarQube Scanner后边增加构建步骤,选择执行 shell
    1
    2
    3
    4
    5
    mv target/*.jar docker/
    docker build -t ${JOB_NAME}:$tag docker/
    docker login -u admin -p Harbor12345 10.10.10.12:80
    docker tag ${JOB_NAME}:$tag 10.10.10.12:80/library/${JOB_NAME}:$tag
    docker push 10.10.10.12:80/library/${JOB_NAME}:$tag
    
  4. 构建后操作,清空Send build artifacts over SSH的内容,在Exec command输入deploy.sh 10.10.10.12:80 library ${JOB_NAME} $tag $hostPort $containerPort
  5. 在本地项目删除Dockerfile,更新项目文件版本,推送到Gitlab,在Gitlab新增标签2.0.0
  6. 在Jenkins点击Build with Parameters,选择标签2.0.0,访问http://10.10.10.12:8081即可看到mytest的欢迎页相应变化。

13. Jenkins使用Pipeline script

  1. 打开Jenkins,点击新建Item,输入项目名后选择流水线
  2. 点击流水线选择Pipeline script from SCM,在SCM处选择Git,在Repository URL输入复制的Gitlab项目拉取地址。
  3. 本地项目根目录创建Jenkinsfile文件,在environment里追加如下内容:
    1
    2
    3
    4
    5
    harborUser = 'admin'
    harborPasswd = 'Harbor12345'
    harborAddress = '10.10.10.12:80'
    harborRepo = 'library'
    sonarqubeUrl = 'http://10.10.10.12:9000'
    
  4. 配置里勾选参数化构建过程,添加Git 参数,名称和描述自定义,参数类型标签,默认值填origin/main;点击添加参数,选择字符参数,名称hostPort,默认值8081;点击添加参数,选择字符参数,名称containerPort,默认值8080
  5. 点击流水线语法,选择checkout: Check out from version control,在Repository URL输入复制的Gitlab项目拉取地址,点击生成流水线脚本,将生成的命令放到Jenkinsfilesteps里,需要将*/master替换为${tag}
  6. 流水线语法选择sh: Shell Script,输入/var/jenkins_home/maven/bin/mvn clean package -DskipTests后点击生成流水线脚本,将生成的命令放到Jenkinsfilesteps里。
  7. 流水线语法选择sh: Shell Script,输入/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.host.url=${sonarqubeUrl} -Dsonar.source=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=[SonarQube密钥]后点击生成流水线脚本,将生成的命令放到Jenkinsfilesteps里。
  8. Jenkinsfileenvironment里追加如下内容:
    1
    2
    3
    4
    harborUser = 'admin'
    harborPasswd = 'Harbor12345'
    harborAddress = '10.10.10.12:80'
    harborRepo = 'library'
    
  9. 流水线语法选择sh: Shell Script,输入如下内容后点击生成流水线脚本,将生成的命令放到Jenkinsfilesteps里:
    1
    2
    3
    4
    5
    mv target/*.jar docker/
    docker build -t ${JOB_NAME}:${tag} docker/
    docker login -u ${harborUser} -p ${harborPasswd} ${harborAddress}
    docker tag ${JOB_NAME}:${tag} ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
    docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
    
  10. 流水线语法选择sshPublisher: Send build artifacts over SSH,在Exec command输入deploy.sh ${harborAddress} ${harborRepo} ${JOB_NAME} ${tag} ${hostPort} ${containerPort}后点击生成流水线脚本,将生成的命令放到Jenkinsfilesteps里:
  11. 在本地项目保存Jenkinsfile文件,推送到Gitlab,在Jenkins点击Build with Parameters,选择标签,访问http://10.10.10.12:8081即可看到loonzh的欢迎页。