实践过程和目的大致阐述下: 1.目的。为了通过 jenkins 实现CICD,即自动打包 SpringBoot 项目成 docker 镜像,并启动,这样方便开发人员专注于开发无需手动打包,运维人员可直接一键构建发布。
2.过程。开发人员提交代码到gitlab > 触发jenkins构建 > gitlab自动拉取项目源码 > maven 加载nexus依赖打包 > 打包docker镜像 > 发布。
一、准备阶段
1.1.服务器配置
提示:为了方便,实践均在一台服务器上实现,故如果是基于虚拟机安装linux实现,那配置要调高一点,内存4G起。 以下为我自己配置,仅供参考:
1.2.JDK1.8安装
提示:我这里安装的版本是 1.8.0_202,1.8 以上版本就可以
yum install wget
wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
mkdir /usr/local/java/
tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local/java/
rm -f jdk-8u202-linux-x64.tar.gz
vi /etc/profile.d/java.sh
JAVA_HOME=/usr/local/java/jdk1.8.0_202
CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
PATH=$PATH:${JAVA_HOME}/bin
ln -s /usr/local/java/jdk1.8.0_202/bin/java /usr/bin/java
source /etc/profile
java -version
1.3.Gradle安装(非必须)
提示:本文实践没有用到gradle,可以跳过,我这里只是顺手记一记,万一有人需要,我安装的是6.7版本
wget https://downloads.gradle-dn.com/distributions/gradle-6.7-bin.zip
mkdir /usr/local/gradle/
unzip -d /usr/local/gradle gradle-6.7-bin.zip
rm -f radle-6.7-bin.zip
vi /etc/profile.d/gradle.sh
GRADLE_HOME=/usr/local/gradle/gradle-6.7
PATH=$PATH:${GRADLE_HOME}/bin
source /etc/profile
gradle -v
1.4.Maven安装
提示:我这里安装的版本是3.6.3,可自行选择版本
wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
mkdir /usr/local/maven
tar -xf apache-maven-3.6.3-bin.tar.gz -C /usr/local/maven/
vi /etc/profile.d/maven.sh
MAVEM_HOME=/usr/local/maven/apache-maven-3.6.3
PATH=$PATH:${JAVA_HOME}/bin:$MAVEM_HOME/bin
source /etc/profile
mvn -version
1.5.Git安装
提示:我选择源码安装,你也可使用一键安装,只有清楚安装对应目录就可以。我这里安装的是2.25.1版本,自行选择
方式一:源码安装(我选择当前方式)
wget --no-check-certificate https://www.kernel.org/pub/software/scm/git/git-2.25.1.tar.gz
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker -y
mkdir /usr/local/git/git-2.25.1
tar -zxvf git-2.25.1.tar.gz
cd git-2.25.1
./configure --prefix=/usr/local/git/git-2.25.1 && make install
echo 'export PATH=$PATH:/usr/local/git/git-2.25.1/bin' > /etc/profile.d/git.sh
source /etc/profile
git --version
方式二:一键工具安装
yum install git
which -a git
1.6.Docker安装
提示:方便起见,我选择安装最新版本 docker-ce 20.10.14版本,有关docker安装及基础原理,或想选择安装版本,可以看我另外一篇博客《Docker入门与实践》,更加详细,这里就简单记录安装及配置脚本 附博客链接:《Docker入门与实践》
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce
sudo systemctl start docker
systemctl start docker
systemctl enable docker
systemctl stop firewalld.service
systemctl status firewalld.service
systemctl status docker
docker -v
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
sudo systemctl daemon-reload
sudo 3.systemctl restart docker
1.7.Nexus3安装
提示:方便起见,我这里采用docker安装,安装最新版本nexus私服,更多安装细节和原理可以看我另外一篇博客《Maven入门与实践》中的搭建步骤。以下只是简洁搭建脚本,纯干货。 附博客链接:《Maven入门与实践》
docker search nexus3
docker pull docker.io/sonatype/nexus3
sudo mkdir -p /home/docker/nexus3/nexus-data
sudo chmod 777 /home/docker/nexus3/nexus-data
docker run \
-d \
--privileged=true \
--name=nexus3 \
--restart=always \
-p 82:8081 \
-v /home/docker/nexus3/nexus-data:/var/nexus-data sonatype/nexus3
docker exec -it nexus3 /bin/bash
cd nexus-data/
cat admin.password
1.8.配置全局maven文件setting.xml
提示:该步骤需要上文私服搭建完成后进行,因为要配置私服地址,账号地址
sudo mkdir -p /usr/local/maven/repo
sudo chmod 777 /usr/local/maven/repo
vi /usr/local/maven/apache-maven-3.6.3/conf/setting.xml
提示:按配置顺序加载以下仓库,如果首次较慢可以先把私服放后面后面再改回来,因为首次加载本地仓库没有都是从其它仓库下载的。当然仓库个数自己选择,可以不用底下所有的仓库,我是一股脑配置进去了
<localRepository>/usr/local/maven/repo</localRepository>
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<name>Nexus name</name>
<url>http://192.168.36.110:82/repository/maven-public/</url>
</mirror>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>
<mirror>
<id>google-maven-central</id>
<name>Google Maven Central</name>
<url>https://maven-central.storage.googleapis.com</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<servers>
<server>
<id>releases</id>
<username>admin</username>
<password>1234</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>1234</password>
</server>
</servers>
<pluginGroups>
<pluginGroups>
<pluginGroup>com.spotify</pluginGroup>
</pluginGroups>
</pluginGroups>
注意:如果以上配置中没有加入group白名单,执行 mvn package docker:build 可能会报以下错误:
[ERROR] No plugin found for prefix 'docker' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (D:\xxxxxxx), nexus (http://repo2.maven.org/maven2/), skynet (http://maven2.mirrors.skynet.be/pub/maven2/)] -> [Help 1]
1.9.GitLab安装
提示:方便起见以下仅为docker安装gitlab相关脚本,如需要更详细了解步骤,已经基本使用,可以看我的博客《Docker安装GitLab与基本操作》 附博客链接:《Docker安装GitLab与基本操作》
docker pull gitlab/gitlab-ce
docker pull beginor/gitlab-ce:11.0.1-ce.0
mkdir -p /home/docker/gitlab/{etc,log,data}
docker run \
-d \
-p 8443:443 \
-p 83:83 \
-p 8022:22 \
--name gitlab \
--restart always \
-v /home/docker/gitlab/etc:/etc/gitlab \
-v /home/docker/gitlab/log:/var/log/gitlab \
-v /home/docker/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce
vi /home/docker/gitlab/etc/gitlab.rb
external_url 'http://192.168.36.110:83'
gitlab_rails['gitlab_ssh_host'] = '192.168.36.110'
gitlab_rails['gitlab_shell_ssh_port'] = 8022
vi /home/docker/gitlab/data/gitlab-rails/etc/gitlab.yml
ssh_host: 192.168.36.110
ssh_port: 8022
docker restart gitlab
docker exec -it gitlab /bin/bash
gitlab-rails console
user = User.where(id: 1).first
user.password = '你的密码'
user.password_confirmation = '你的密码'
user.save
cd ~/.ssh
ssh-keygen -t rsa -C "alone@123.com"
Enter file in which to save the key (/c/Users/icecr/.ssh/id_rsa):id_rsa_gitlab_alone
Host 192.168.36.110
User alone
IdentityFile ~/.ssh/id_rsa_gitlab_alone
1.10.Jenkins安装
提示:jenkins放最后安装是有道理的。因为jenkins要使用或者依赖以上安装的各个环境或者插件,所以启动jenkins时挂载目录需要上面安装后才能确定。这里为了方便我采用docker安装,并且安装的是最新版本
docker pull jenkins/jenkins:lts
sudo mkdir -p /home/docker/jenkins
sudo chmod 777 /home/docker/jenkins
sudo chmod 777 /var/run/docker.sock
docker run \
-d \
-p 81:8080 \
-p 50000:50000 \
--name jenkins \
--restart always \
-v /home/docker/jenkins:/var/jenkins_home \
-v /etc/localtime:/etc/localtime \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /usr/local/maven/apache-maven-3.6.3:/usr/local/maven \
-v /usr/local/maven/repo:/usr/local/maven/repo \
-v /usr/local/java/jdk1.8.0_202:/usr/local/java/jdk \
-v /usr/local/gradle/gradle-6.7:/usr/local/gradle \
-v /usr/local/git/git-2.25.1:/usr/local/git \
jenkins/jenkins:lts
cd /home/docker/jenkins/
vi hudson.model.UpdateCenter.xml
<sites>
<site>
<id>default</id>
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
</site>
</sites>
docker exec -it jenkins /bin/bash
cat /var/jenkins_home/secrets/initialAdminPassword
注意:如果上文不进行docker路径授权【chmod 777 /var/run/docker.sock】会报以下错误: (java.io.IOException) caught when processing request to {}->unix://localhost:80: Permission denied
1.11.Jenkins配置
1.系统设置 > 全局工具配置 2.配置 JDK 3.配置 Git 4.配置 Gradle (本文实践没有使用到,可以跳过) 5.配置 Maven 5.配置 Git 全局ssh凭证
系统管理 > Manage Credentials > 添加全局凭证 >添加以下内容 提示:这里类型要选择 ssh username with private key,username 自己取无所谓,key需要粘贴上文安装gitlab配置生成的账号的私钥,记住是私钥,而非 public后缀的公钥。拷贝私钥到 key 中粘贴,保存确定 >创建成功,获取到凭证id
提示:创建成功后,记住全局凭证id,下文创建项目配置需要用到
1.12.创建springboot项目
提示:我这里就简单写了一个接口,项目增加 Dockerfile 用来构建镜像,项目目录结构如下图。创建成功编写好代码后提交到你的 gitlab中(不懂得可以查看上文提到的博客《Docker安装GitLab与基本操作》) 部分 pom 配置展示
Dockerfile
FROM docker.io/relateiq/oracle-java8
ADD jenkins-boot-test-0.0.1-SNAPSHOT.jar app.jar
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
pom.xml 增加以下配置,用来使用 mvn docker:build打包构建镜像
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>${project.artifactId}</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>nexus</id>
<name>test public</name>
<layout>default</layout>
<url>http://192.168.36.110:82/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
二、使用Jenkins打包
2.1.创建任务
>新建任务 >选择自由风格,输入任务名称,名称自己取不重要 源码管理 > 配置gitlab项目代码地址 提示:Repository URL 是在gitlab 对应的项目下拷贝的ssh地址。Credentials 下的下拉框选择上文配置的全局凭证git ssh。分支选择你要构建的代码分支,我是自己创建了并提交代码到一个develop分支,所以这里设置开发分支。如果这里配置git会提示奇怪的错误,可能是你上文git配置中挂载的目录没有加 /bin/git,所以没有识别到可执行工具 构建 > 配置maven执行脚本
clean install -Dmaven.test.skip=true
构建 > 配置构建脚本
提示:这里为什么要进行稍微复杂一些的运行容器,镜像判断呢?这是为了重新构建时候不会报错,会先去停止运行的容器,删除镜像再进行镜像重新打包。后续如果个人需要推送进行到仓库,可以在以下脚本中添加,这里就怎么简单怎么来
containerName=jenkins-boot-test
imageName=jenkins-boot-test
echo "$imageName"
containerId=`docker ps -a | grep -w ${containerName} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
docker stop $containerId
docker rm $containerId
echo "成功删除容器"
fi
imageId=`docker images | grep -w $containerName | awk '{print $3}'`
if [ "$imageId" != "" ] ; then
docker rmi -f $imageId
echo "成功删除镜像"
fi
/usr/local/maven/bin/mvn docker:build
docker run -p 8083:8083 -d --name $containerName $imageName
echo "容器启动成功"
2.2.立即构建
>立即构建 >可查看控制台输出日志 查看日志,构建成功结果打印
2.3.测试验证
>我再进行接口返回结果代码修改,然后提交到 gitlab,测试重新构建后是否有变更 >提交gitlab 提示:截图只截了 push 指令,你要记得先的 commit >立即构建 >构建成功 >验证 完美!
|