- 获取 jenkins 安装包
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.277.4-1.1.noarch.rpm
- 安装 jenkins
yum install -y jenkins-*
- 修改端口(可以不修改)
- 修改这个属性 JENKINS_PORT
vim /etc/sysconfig/jenkins
- 如果 你的https是这样的你需要进行一下配置
git config --global http.sslVerify false
- 如果还不行,请求切换jenkins的启动用户,然后重启jenkins
- 获取初始密码
cat /var/lib/jenkins/secrets/initialAdminPassword
- 修改插件下载和更新地址
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' /var/lib/jenkins/updates/default.json && \
sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' /var/lib/jenkins/updates/default.json
- Jenkins->Manage Jenkins-> Manage Plugins点击Advanced,把Update Site改为国内插件下载地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
- 重启
http://IP:port/restart
-
下载中文汉化插件(如果没有,说明已经安装)
- Jenkins->Manage Jenkins->Manage Plugins,点击Available,搜索"Chinese"
-
安装插件 (如果没有,说明已经安装)
- 进入 Jenkins->Manage Jenkins->Manage Plugins-> 可选插件
-
搜索/安装 "Credentials Binding"
image.png -
搜索/安装 "Git"
image.png
-
添加凭证
-
进入 Jenkins->Manage Jenkins->Manage Credentials 添加凭证
image.png - 名称解释
- Username with password:用户名和密码
- SSH Username with private key: 使用SSH用户和密钥
- Secret file:需要保密的文本文件,使用时Jenkins会将文件复制到一个临时目录中,再将文件路径
- 设置到一个变量中,等构建结束后,所复制的Secret file就会被删除。
- Secret text:需要保存的一个加密的文本串,如钉钉机器人或Github的api token
- Certificate:通过上传证书文件的方式
-
CentOS 安装 git
yum install git -y
git --version
- CentOS 安装
wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz #下载maven
tar -xzf apache-maven-3.6.3-bin.tar.gz # 解压
mkdir -p /opt/maven #创建目录
mv apache-maven-3.6.3/* /opt/maven #移动文件
- 配置环境变量
vi /etc/profile 在文件的末尾
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export MAVEN_HOME=/opt/maven
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
source /etc/profile #配置生效
mvn -v #查找Maven版本
-
全局工具配置关联JDK和Maven
-
Jenkins->Manage Jenkins->Global Tool Configuration->JDK
image.png -
Jenkins->Manage Jenkins->Global Tool Configuration->MAVEN
image.png
-
在项目一级子目录下创建Jenkinsfile文件
-
添加插件 Extended Choice Parameter
image.png 进行配置
在配置之前我们先来说一个坑,当我们在配置git中写了远端地址后,会有如下报错:
这是因为 jenkins 我们 yum 装的运行用户是 jenkins 用户,此处是 jenkins 用户去 git 仓库进行拉取,而 jenkins 用户的话默认是 /bin/false 的,不但不能登录,也没有 git 命令权限,所以肯定是失败的。
解决此问题两种办法:
更改jenkins用户为root用户;
更改jenkins用户为正常的普通用户/bin/bash,将其的公钥加入到git服务器的git用户中。
此处暂时先用第一种解决办法,更改 jenkins 的运行用户为 root 用户,通过如下方式进行更改:
-
将/etc/sysconfig/jenkins文件由image.png
改为[图片上传失败image.png 然后再重启即可。
-
添加服务
-
Jenkins->Dashboard->新建item
image.png -
服务配置
image.png
image.png
image.png
image.png
-
-
安装插件 Publish Over SSH
image.png 配置远程登录
-
Jenkins->Manage Jenkins->Configure System
image.png
image.png
- 安装maven插件
-
进入 Jenkins->Manage Jenkins->Manage Plugins-> 可选插件
image.png
- 全局属性设置
-
Jenkins->Manage Jenkins->Configure System
image.png
JAVA_HOME
/usr/lib/jvm/java-1.8.0-openjdk
M2_HOME
/opt/maven
PATH+EXTRA
/opt/maven/bin
- 配置docker
服务部署服务器, Jenkins 服务器都需要
{
"registry-mirrors": ["https://l71irppo.mirror.aliyuncs.com"],
"insecure-registries": ["210.210.210.223:7001"]
}
- registry-mirrors: 镜像下载地址
- insecure-registries: docker信任的地址
- 210.210.210.223:7001 harbor 仓库地址
- 创建基础镜像
-
前置条件, 需要到harbor 建立一个 base 的项目
image.png
vim Dockerfile
FROM openjdk:8-jdk-alpine
RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig #安装字体
docker build -f ./Dockerfile -t 210.210.210.223:7001/base/base-images:latest .
docker login -u 你的账号 -p 你的密码 210.210.210.223:7001
docker push 210.210.210.223:7001/base/base-images:latest
-
创建每个镜像的 Dockerfile
image.png
FROM 210.210.210.223:7001/base/base-images:latest
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 9207
ENTRYPOINT ["java","-jar","-Duser.timezone=Asia/Shanghai","/app.jar"]
-
添加docker 插件
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.10</version>
<configuration>
<repository>${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.6.RELEASE</version>
</plugin>
</plugins>
</build>
- 添加需要发布工程的存放项目
-
harbor 创建用户
image.png -
创建项目
image.png -
如果怕镜像下载不成功可以公开项目
image.png -
创建GIT凭证
image.png -
创建harbor凭证
image.png
- 配置远程服务器
- 用xshell等远程攻击连接 jenkins 服务器
ssh-keygen -t rsa
- 一直回车
- 拷贝公钥到启动容器的服务器
ssh-copy-id 210.210.210.209
-
添加远程服务器(服务部署服务器)
image.png
image.png
-
创建Jenkinsfile
image.png
- Jenkinsfile
/*在jenkins->Manage Jenkins->Manage Credentials建立的全局登录git帐号凭证*/
def git_auth="git";
/*git 项目下载地址*/
def git_url="https://200.200.200.79/wutianqi/copote-cloud-hunan.git"
/*镜像版本*/
def tag="latest"
/*harbor地址*/
def harbor_url="210.210.210.223:7001"
/*镜像存放项目名称*/
def harbor_project_name="phjr_hunan"
def harbor_auth="phjr_hunan_harbor"
def phjrstbt_key_209 = "210.210.210.209"
node {
stage("拉取代码") {
checkout([$class: "GitSCM", branches: [[name: "*/你在git上配置的分支"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
echo "拉取成功"
}
stage("项目构建,发布"){
def port = "9200";
def current_project_name = "copote-hunan-auth"
sh "mvn -f ./${current_project_name}/pom.xml clean package -U spring-boot:repackage dockerfile:build"
echo "项目${current_project_name}构建完毕"
sh "docker tag ${current_project_name}:${tag} ${harbor_url}/${harbor_project_name}/${current_project_name}:${tag}"
echo "项目${current_project_name}镜像打完毕"
withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: "password",
usernameVariable: "username")]) {
sh "docker login -u ${username} -p ${password} ${harbor_url}"
sh "docker push ${harbor_url}/${harbor_project_name}/${current_project_name}:${tag}"
echo "项目${current_project_name} 上传 完毕"
}
sh "docker rmi -f ${current_project_name}:${tag}"
sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${current_project_name}:${tag}"
echo "项目${current_project_name} 本地镜像删除完毕"
echo "/opt/jenkins_deploy.sh $harbor_url $harbor_project_name $current_project_name $tag $port"
sshPublisher(publishers: [sshPublisherDesc(configName: "${phjrstbt_key_209}",
transfers: [sshTransfer(cleanRemote: false, excludes: "",
execCommand:"/opt/jenkins_deploy.sh $harbor_url $harbor_project_name $current_project_name $tag $port",
execTimeout: 1200000, flatten: false, makeEmptyDirs: false,
noDefaultExcludes: false, patternSeparator: "[, ]+", remoteDirectory: "",
remoteDirectorySDF: false, removePrefix: "", sourceFiles: "")],
usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
echo "${current_project_name} 启动完成";
}
}
2.. 配置远程服务器的Docker 配置
mkdir -p /etc/docker && vim /etc/docker/daemon.json
- jenkins服务器, 服务部署服务器都需要配置
{
"registry-mirrors": ["https://l71irppo.mirror.aliyuncs.com"],
"insecure-registries": ["210.210.210.223:7001"]
}
- 配置远程服务器 启动文件
vim /opt/jenkins_deploy.sh
- jenkins_deploy.sh
#!/bin/sh
#接收外部参数
harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
port=$5
imageName=$harbor_url/$harbor_project_name/$project_name:$tag
echo "$imageName"
#查询容器是否存在,存在则删除
containerId=`docker ps -a | grep -w ${project_name}:${tag} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
#停掉容器
docker stop $project_name
#删除容器
docker rm -f $project_name
echo "成功删除容器"
fi
#查询镜像是否存在,存在则删除
imageId=`docker images | grep -w $project_name | awk '{print $3}'`
if [ "$imageId" != "" ] ; then
#删除镜像
docker rmi -f $imageId
echo "成功删除镜像"
fi
# 登录Harbor私服
docker login -u phjr_hunan -p Harbor123456 $harbor_url
# 下载镜像
docker pull $imageName
# 启动容器
docker run -d --name $project_name -p $port:$port --restart=always --net=host $imageName
echo "容器启动成功"
- 添加执行权限
chmod +x /opt/jenkins_deploy.sh