基于Jenkins拉取GitLab指定發(fā)行版本的SpringBoot代碼進行構(gòu)建發(fā)布到生產(chǎn)環(huán)境實現(xiàn)CD實現(xiàn)持續(xù)部署
image.png
準(zhǔn)備測試項目
準(zhǔn)備一個簡單的Spring boot 項目
image.png
Jenkins新建任務(wù)
image.png
image.png
Jenkins關(guān)聯(lián)Gitlab自動拉取最新代碼
image.png
ssh key 配置
進入容器生成新的ssh key
[root@localhost mytest]# docker exec -it jenkins bash
jenkins@790140a70e6f:/$ cd /var/jenkins_home/
jenkins@790140a70e6f:~$ ssh-keygen -t rsa -C "wangyuhao01@163.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa):
Created directory '/var/jenkins_home/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/jenkins_home/.ssh/id_rsa
Your public key has been saved in /var/jenkins_home/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:LJt2FmYqJFN6fUrn64TtXPgOTigPKLVwLwFJjNK+5Wo wangyuhao01@longfor.com
The key's randomart image is:
+---[RSA 3072]----+
|oo |
|+o. |
|+. . |
| ..o.. . |
|. B+o + S |
| +.X.. / o |
|. +.= O X . |
| .E. * O = |
| . ..*.o |
+----[SHA256]-----+
[root@localhost data]# cd .ssh/
[root@localhost .ssh]# ls
id_rsa id_rsa.pub
進入容器現(xiàn)在執(zhí)行下如下命令,否則直接使用ssh key 會報錯:
[root@localhost mytest]# docker exec -it jenkins bash
jenkins@790140a70e6f:/$ git ls-remote -h -- git@gitee.com:xiaolyuh/test.git HEAD
The authenticity of host 'gitee.com (212.64.63.190)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'gitee.com,212.64.63.190' (ECDSA) to the list of known hosts.
將公鑰配id_rsa.pub
置到gitlab,私鑰id_rsa
配置到j(luò)enkins全局憑據(jù).
image.png
image.png
image.png
image.png
執(zhí)行構(gòu)建&查看日志
image.png
image.png
通過日志我們可以發(fā)現(xiàn)jenkins將代碼拉取到了/var/jenkins_home/workspace/mytest1
目錄,/var/jenkins_home/
目錄我們已經(jīng)映射到了宿主機的/usr/local/docker/jenkins/data
目錄,到這個目錄我們可以看到已經(jīng)拉取下來后的文件篷就。
image.png
配置Maven構(gòu)建代碼
將安裝好的maven和jdk映射到j(luò)enkins容器的數(shù)據(jù)卷中
mv /usr/local/maven/ /usr/local/docker/jenkins/data/
mv jdk1.8.0_361/ /usr/local/docker/jenkins/data/jdk
映射好后,我們可以到j(luò)enkins容器中的home目錄查看到maven和jdk近忙。
image.png
Jenkins配置Maven&JDK
image.png
image.png
/var/jenkins_home/maven/apache-maven-3.8.8
就是剛剛映射到容器的maven地址竭业。
在任務(wù)上使用Maven構(gòu)建項目
image.png
image.png
重新構(gòu)建任務(wù)&日志
image.png
image.png
查看jar包
[root@localhost data]# docker exec -it jenkins bash
jenkins@790140a70e6f:/$ cd /var/jenkins_home/workspace/mytest1/spring-boot-student-devops/target
jenkins@790140a70e6f:~/workspace/mytest1/spring-boot-student-devops/target$ ls
classes generated-test-sources maven-status spring-boot-student-devops-0.0.1-SNAPSHOT.jar.original
generated-sources maven-archiver spring-boot-student-devops-0.0.1-SNAPSHOT.jar test-classes
jenkins@790140a70e6f:~/workspace/mytest1/spring-boot-student-devops/target$
將jar包推送到遠(yuǎn)程服務(wù)器&通過Docker打包部署
配置全局server服務(wù)
image.png
image.png
新增Docker打包和啟動所需的配置
image.png
在項目下新增docker文件夾,然后新增Dockerfile和docker-compose.yml文件
增加Dockerfile文件
# 設(shè)置依賴鏡像
FROM daocloud.io/library/java:8u40-jdk
# 拷貝jar到容器工作目錄
WORKDIR /usr/local/docker
COPY ./app.jar /usr/local/docker
# 啟動jar文件
CMD java -jar app.jar
增加docker-compose.yml文件
version: "3.1"
services:
mytest:
# 通過當(dāng)前目錄下的Dockerfile來構(gòu)建鏡像
build:
context: ./
dockerfile: Dockerfile
image: mytest:v1.0.0
container_name: mytest
ports:
# 將容器80端口映射到宿主機80端口映上
- 8081:80
配置單個任務(wù)的Publish
image.png
image.png
命令解釋
# 切換到上傳后的docker
cd /root/docker
# 刪除原有jar包
rm -rf app.jar
# 將新的jar包拷貝到docker目錄
mv ../spring-boot-student-devops/target/*.jar app.jar
# 刪除無效目錄
rm -rf ../spring-boot-student-devops
# 通過docker-compose進行打包和啟動容器
docker-compose down
docker-compose up -d --build
# 刪除所有未打標(biāo)簽的鏡像
docker rmi $(docker images -q -f dangling=true)
執(zhí)行任務(wù)構(gòu)建&日志
image.png
這里傳輸了3個文件
目前服務(wù)器查看部署情況
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
24d77685afcd mytest:v1.0.0 "/bin/sh -c 'java -j…" About an hour ago Up About an hour 0.0.0.0:8081->80/tcp, :::8081->80/tcp mytest
[root@localhost docker]#
image.png
參數(shù)化構(gòu)建項目
配置參數(shù)類型
image.png
image.png
設(shè)置構(gòu)建前的操作
image.png
image.png
# 配置參數(shù)
REMOTE_NAME="origin" # 遠(yuǎn)程倉庫名
BRANCH_NAME=$branch # 拉取的分支名
BRANCH_NAME=${BRANCH_NAME#*/}
# 檢查輸入?yún)?shù)
if [ -z "$BRANCH_NAME" ]; then
echo "Please provide the branch name as the first argument."
exit 1
fi
# 判斷本地分支是否存在
if git show-ref --verify --quiet "refs/heads/$BRANCH_NAME"; then
echo "Local branch $BRANCH_NAME exists."
git checkout $BRANCH_NAME
git config pull.rebase false
git pull $REMOTE_NAME $BRANCH_NAME
else
echo "Local branch $BRANCH_NAME does not exist."
git fetch $REMOTE_NAME $BRANCH_NAME
git checkout -b $BRANCH_NAME $REMOTE_NAME/$BRANCH_NAME
fi
# 執(zhí)行完畢
echo "The latest code has been successfully pulled from the remote branch."
exit 0
準(zhǔn)備多分支
image.png
重新構(gòu)建任務(wù)
image.png
查看結(jié)果
image.png