環(huán)境
使用虛擬機(jī)搭建環(huán)境,centos7.8系統(tǒng)
主機(jī) | 說(shuō)明 | 必要軟件 |
---|---|---|
192.168.8.110 | jenkins服務(wù)節(jié)點(diǎn) | jekins,jdk8,tomcat9 |
192.168.8.101 | harbor服務(wù),docker管理鏡像 | harbor |
192.168.8.111 | jenkins工作節(jié)點(diǎn) | maven,jdk8,git,docker |
jenkins安裝
rpm方式安裝
1.安裝JDK8
yum install java-1.8.0-openjdk* -y
2.yum方式安裝
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install jenkins
3.啟動(dòng)Jenkins服務(wù)
systemctl start jenkins
systemctl enable jenkins
4.打開(kāi)瀏覽器訪(fǎng)問(wèn)
http://192.168.8.110:8080
war方式安裝
jenkins官方下載地址
選擇合適的版本,注意各個(gè)版本依賴(lài)的jdk版本,如果jdk版本不符合會(huì)導(dǎo)致插件安裝失敗
下載好war包后使用tomcat部署即可
在圖片給出的目錄中查看登陸密碼
cat /var/lib/jenkins/secrets/initialAdminPassword
登陸成功后點(diǎn)擊“選擇插件安裝”,然后就是漫長(zhǎng)的安裝插件。。。。。。。。
agent工作節(jié)點(diǎn)配置
1.docker安裝(TODO)
2.jdk8安裝
下載地址:
https://www.oracle.com/webapps/redirect/signon?nexturl=https://download.oracle.com/otn/java/jdk/8u261-
b12/a4634525489241b9a9e1aa73d9e118e6/jdk-8u261-linux-x64.tar.gz
tar -zxf jdk-8u261-linux-x64.tar.gz
mv jdk1.8.0_261/ /opt/jdk1.8
3.git 安裝
官網(wǎng)下載速度非常慢。國(guó)內(nèi)加速地址大部分為windows版本。登錄https://github.com/git/git/releases查看git的最新版。不要下載帶有-rc的,因?yàn)樗砹艘粋€(gè)候選發(fā)布版本。
https://www.kernel.org/pub/software/scm/git/git-2.28.0.tar.gz
1.安裝依賴(lài)環(huán)境:
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
2.刪除yum方式安裝的git:
添加依賴(lài)時(shí)自動(dòng)yum安裝了git1.8版本。需要先移除git1.8版本。
yum -y remove git
tar -zxvf git-2.28.0.tar.gz
mv git-2.28.0 /opt/git2.28
./configure --prefix=/opt/git2.28
cd /opt/git2.28/
make && make install
4.maven安裝
下載地址:
https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apachemaven-3.6.3-bin.tar.gz
tar -zxf apache-maven-3.6.3-bin.tar.gz.gz
mv apache-maven-3.6.3 maven
創(chuàng)建本地倉(cāng)庫(kù):
mkdir -p /data/maven/repository
設(shè)置本地倉(cāng)庫(kù)目錄
<localRepository>/data/maven/repository</localRepository>
配置阿里云倉(cāng)庫(kù)地址
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
maven工程配置jdk8編譯
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
5.統(tǒng)一配置
vi /etc/profile
加入以下內(nèi)容
export PATH
export JAVA_HOME=/opt/jdk1.8
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export MAVEN_HOME=/opt/maven
export PATH=$MAVEN_HOME/bin:$PATH
export PATH=$PATH:/opt/git2.28/bin
source /etc/profile
檢測(cè)環(huán)境
java -version
mvn -v
git --version
配置軟連接
ln -s /opt/jdk1.8/bin/java /usr/bin/
ln -s /opt/mvn/bin/mvn /usr/bin/
ln -s /opt/git2.28/bin/git /usr/bin
ln -s /opt/maven/bin/mvn /usr/local/bin/ 這里解決通過(guò)jenkins在agent節(jié)點(diǎn)上執(zhí)行mvn命令,mvn無(wú)法找到的問(wèn)題
jenkins agent節(jié)點(diǎn)配置
jenkins連接agent方式有兩種:java方式和ssh方式,java方式就是在agent節(jié)點(diǎn)部署個(gè)jar包
ssh方式連接agent
1.master節(jié)點(diǎn)免密登陸agent節(jié)點(diǎn)
在服務(wù)節(jié)點(diǎn)生成秘鑰
ssh-keygen -t rsa
復(fù)制公鑰(-p 端口號(hào)來(lái)指定ssh端口號(hào))
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.198.154
免密登錄測(cè)試
ssh 192.168.8.111
2.配置jenkins憑據(jù)
位置:jenkins工作臺(tái)->系統(tǒng)管理->憑據(jù)管理(manager credentials)
類(lèi)型:SSH Username with private key
私鑰信息獲?。?/p>
在生成秘鑰的服務(wù)節(jié)點(diǎn)執(zhí)行命令,將打印的私鑰信息拷貝
cat .ssh/id_rsa
創(chuàng)建agent節(jié)點(diǎn)
位置:jenkins工作臺(tái)->系統(tǒng)管理->節(jié)點(diǎn)管理(Manage nodes and clouds)
注意標(biāo)簽:稍后選擇執(zhí)行節(jié)點(diǎn)會(huì)用到配置的標(biāo)簽,通過(guò)標(biāo)簽選擇
新建構(gòu)建任務(wù)
腳本:
pipeline {
agent {
label 'agent-111'
}
stages {
stage('環(huán)境監(jiān)測(cè)') {
steps {
echo '環(huán)境監(jiān)測(cè)'
sh '''java -version
mvn -v
git --version
docker -v'''
}
}
}
}
piepline腳本是groovy語(yǔ)法,可以點(diǎn)擊上面藍(lán)色字體“流水線(xiàn)語(yǔ)法”,進(jìn)流水線(xiàn)語(yǔ)法工具來(lái)生成
選擇自己需要的操作,例如從svn拉取代碼,執(zhí)行shell腳本等,例如上述環(huán)境監(jiān)測(cè)語(yǔ)法,選擇sh,將命令粘貼到命令輸入框,點(diǎn)擊生成流水線(xiàn)腳本即可,然后將生成的腳本內(nèi)容粘貼到腳本的steges->stege->steps中
構(gòu)建任務(wù)
選擇剛創(chuàng)建的agent-test任務(wù),點(diǎn)擊“Build Now ->構(gòu)建計(jì)劃”
點(diǎn)擊console output進(jìn)入控制臺(tái),可以看到流水線(xiàn)腳執(zhí)行的結(jié)果
實(shí)戰(zhàn)
創(chuàng)建項(xiàng)目jenkinsdemo
使用jenkins完成以下構(gòu)建步驟:
- 環(huán)境檢測(cè):檢測(cè)agent-111節(jié)點(diǎn)基礎(chǔ)軟件運(yùn)行情況
- 拉取代碼:從git服務(wù)器拉取項(xiàng)目
- 編譯構(gòu)建:agent-111執(zhí)行maven命令;使用jib插件聲明周期push鏡像至harbor-101服務(wù)
器 - 刪除容器:刪agent-111服務(wù)器jenkinsdemo容器
- 刪除鏡像:刪除agent-111服務(wù)器jenkinsdemo鏡像
- 登錄harbor:docker登錄harbor-101服務(wù)器
- 拉取鏡像:拉取jenkinsdemo鏡像
- 運(yùn)行容器:運(yùn)行jenkinsdemo容器
創(chuàng)建項(xiàng)目
創(chuàng)建一個(gè)springboot項(xiàng)目jenkinsdemo
寫(xiě)一個(gè)簡(jiǎn)單的helloController
在pom文件中引入jib插件,jib是google出品的用來(lái)做容器鏡像構(gòu)建的類(lèi)庫(kù),無(wú)需編寫(xiě)Dockerfile,無(wú)需深入學(xué)習(xí)dockerfile,通過(guò)maven插件為java用構(gòu)建docker鏡像,此類(lèi)插件還有dockerfile-maven-plugin,docker-maven-plugin等,這兩款插件都需要自己編寫(xiě)Dockerfile,這里選擇jib插件最重要的原因是鏡像構(gòu)建的速度,docker-maven-plugin每次構(gòu)建都是全量構(gòu)建,因此速度較慢,jib構(gòu)建只是從新構(gòu)建修改的內(nèi)容,因此構(gòu)建速度快。jib github官網(wǎng)地址:https://github.com/GoogleContainerTools/jib
jib的pom配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.demo</groupId>
<artifactId>jenkinsdemo</artifactId>
<version>1.0</version>
<name>jenkinsdemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.name}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>2.5.2</version>
<configuration>
<!--from標(biāo)簽配置鏡像的基礎(chǔ)鏡像,相當(dāng)于Dockerfile的FROM-->
<from>
<!--使用harbor上的jdk8基礎(chǔ)鏡像-->
<image>192.168.8.101:5000/dan/openjdk:8-alpine3.9</image>
<!--harbor服務(wù)器登陸信息-->
<auth>
<username>admin</username>
<password>Harbor12345</password>
</auth>
</from>
<to>
<!--鏡像名稱(chēng)和tag,使用了mvn內(nèi)置變量${project.version},表示當(dāng)前工程的version-->
<image>192.168.8.101:5000/dan/${project.name}:${project.version}</image>
<auth>
<username>admin</username>
<password>Harbor12345</password>
</auth>
</to>
<container>
<!--配置jvm參數(shù)-->
<jvmFlags>
<jvmFlag>-Xms512m</jvmFlag>
</jvmFlags>
<!--配置使用的時(shí)區(qū)-->
<environment>
<TZ>Asia/Shanghai</TZ>
</environment>
<!--要暴露的端口-->
<ports>
<port>8080</port>
</ports>
</container>
<!--可以進(jìn)行HTTP-->
<allowInsecureRegistries>true</allowInsecureRegistries>
</configuration>
<!--將jib與mvn構(gòu)建的生命周期綁定 mvn package自動(dòng)構(gòu)造鏡像-->
<!--打包及推送命令 mvn -DsendCredentialsOverHttp=true clean
package-->
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
在項(xiàng)目根目錄下新建文件,名稱(chēng)為Jenkinsfile,用來(lái)存放流水線(xiàn)腳本,后面會(huì)配置從git上拉取腳本,而不是在jenkins上編寫(xiě)。
將項(xiàng)目上傳到git上,自己搭建的gitlab或者gitee都可以
創(chuàng)建git憑據(jù)
新建一個(gè)憑據(jù),用來(lái)登陸git服務(wù)器,拉取代碼
創(chuàng)建任務(wù) jenkinsdemo
選擇流水線(xiàn)
這里repository url下有紅色保存,原因是在jenkins服務(wù)器上沒(méi)有安裝git才會(huì)導(dǎo)致報(bào)錯(cuò),安裝git即可
創(chuàng)建流水線(xiàn)任務(wù),腳本來(lái)源配置為從git上來(lái)取,也就上面創(chuàng)建項(xiàng)目中的Jenkinsfile。
編寫(xiě)流水線(xiàn)腳本 Jenkinsfile
pipeline{
agent {
label 'agent-222' //這里通過(guò)標(biāo)簽選擇執(zhí)行任務(wù)的agent節(jié)點(diǎn)
}
stages{
stage('環(huán)境檢測(cè)'){
steps{
echo '環(huán)境監(jiān)測(cè)'
}
}
stage('拉取代碼'){
steps{
echo '拉取代碼'
}
}
stage('編譯構(gòu)建'){
steps{
echo '編譯構(gòu)建'
}
}
stage('刪除容器'){
steps{
echo '刪除容器'
}
}
stage('刪除鏡像'){
steps{
echo '刪除鏡像'
}
}
stage('登陸harbor'){
steps{
echo '登陸harbor'
}
}
stage('拉取容器'){
steps{
echo '拉取容器'
}
}
stage('運(yùn)行容器'){
steps{
echo '運(yùn)行容器'
}
}
}
}
下面對(duì)腳本內(nèi)容進(jìn)行填充
使用jenkins提供的流水線(xiàn)語(yǔ)法工具
1.環(huán)境檢查
java -version
mvn -v
git --version
docker -v
生成流水線(xiàn)語(yǔ)法方式同上,將生成的腳本內(nèi)容粘貼到環(huán)境監(jiān)測(cè)階段
2.拉取代碼
從git中拉取代碼
將生成的腳本拷貝到拉取代碼階段
3.編譯構(gòu)建
mvn clean package -Dmaven.test.skip=true jib:build -DsendCredentialsOverHttp=true
maven構(gòu)建命令,并使用jib插件, -DsendCredentialsOverHttp=true配置是使用http從harbor倉(cāng)庫(kù)拉取鏡像,默認(rèn)必須使用https。
同樣是生成shl腳本,同1
4.刪除容器
#刪除容器shell腳本,先檢查容器是否存在,如果存在先停止,然后刪除容器
echo '檢查容器是否存在'
containerid=`docker ps -a | grep -w jenkinsdemo | awk '{print $1}'`
if [ "$containerid" != "" ];then
echo ‘容器存在,停止容器’
docker stop $containerid
echo ‘刪除容器’
docker rm $containerid
fi
同樣是生成shl腳本,同1
5.刪除鏡像
#刪除鏡像shell腳本
echo '檢查鏡像是否存在'
imageid=`docker images | grep jenkinsdemo | awk '{print $3}'`
if [ "$imageid" != "" ];then
echo '刪除鏡像'
docker rmi -f $imageid
fi
同樣是生成sh腳本,同1
6.登陸harbor
docker login -u admin -p Harbor12345 192.168.8.101:5000
同樣是生成sh腳本,同1
7.拉取容器
docker pull 192.168.8.101:5000/dan/jenkinsdemo:1.0
同樣是生成sh腳本,同1
8.運(yùn)行容器
docker run -itd --name jenkinsdemo -p 8080:8080 192.168.8.101:5000/dan/jenkinsdemo:1.0
同樣是生成sh腳本,同1
完整腳本內(nèi)容:
pipeline{
agent {
label 'agent-111'
}
stages{
stage('環(huán)境檢測(cè)'){
steps{
echo '環(huán)境監(jiān)測(cè)'
sh '''java -version
mvn -v
git --version
docker -v'''
}
}
stage('拉取代碼'){
steps{
echo '拉取代碼'
//略
}
}
stage('編譯構(gòu)建'){
steps{
echo '編譯構(gòu)建'
sh 'mvn clean package -Dmaven.test.skip=true jib:build -DsendCredentialsOverHttp=true'
}
}
stage('刪除容器'){
steps{
echo '刪除容器'
sh '''echo \'檢查容器是否存在\'
containerid=`docker ps -a | grep -w jenkinsdemo | awk \'{print $1}\'`
if [ "$containerid" != "" ];then
echo ‘容器存在,停止容器’
docker stop $containerid
echo ‘刪除容器’
docker rm $containerid
fi'''
}
}
stage('刪除鏡像'){
steps{
echo '刪除鏡像'
sh '''echo \'檢查鏡像是否存在\'
imageid=`docker images | grep jenkinsdemo | awk \'{print $3}\'`
if [ "$imageid" != "" ];then
echo \'刪除鏡像\'
docker rmi -f $imageid
fi'''
}
}
stage('登陸harbor'){
steps{
echo '登陸harbor'
sh 'docker login -u admin -p Harbor12345 192.168.8.101:5000'
}
}
stage('拉取容器'){
steps{
echo '拉取容器'
sh 'docker pull 192.168.8.101:5000/dan/jenkinsdemo:1.0'
}
}
stage('運(yùn)行容器'){
steps{
echo '運(yùn)行容器'
sh 'docker run -itd --name jenkinsdemo -p 8080:8080 192.168.8.101:5000/dan/jenkinsdemo:1.0'
}
}
}
}
腳本完成后push到git
構(gòu)建任務(wù)
選擇之前創(chuàng)建的jenkinsdemo任務(wù),點(diǎn)擊構(gòu)建
構(gòu)建成功后瀏覽器訪(fǎng)問(wèn):http://192.168.8.111:8080
可以反復(fù)構(gòu)建任務(wù),檢查腳本是否能正確執(zhí)行文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-737576.html
---------------------------------------------over--------------------------------------------------------文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-737576.html
到了這里,關(guān)于jenkins結(jié)合docker實(shí)現(xiàn)自動(dòng)部署的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!