参考链接:
https://blog.51cto.com/wzlinux/2467307
一、自己构建一个jenkins-agent
我们修改下,让其支持 git、maven以及jdk11
1、先用maven3.5.4和jdk11
还参考了:https://gitlab.com/feiweihy/centos-git-java-maven/-/blob/main/Dockerfile
在服务器
wget https://dlcdn.apache.org/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
FROM jenkins/jnlp-slave:4.9-1-jdk11
MAINTAINER 529486618@qq.com
LABEL Description="This is a extend image base from jenkins/jnlp-slave which install maven and git in it."
USER root
#install maven
ADD apache-maven-3.5.4-bin.tar.gz /usr/lib/
ENV M2_HOME /usr/lib/apache-maven-3.5.4
ENV PATH $JAVA_HOME/bin:$JRE_HOME/bin:$M2_HOME/bin:$PATH
RUN ln -s /usr/lib/apache-maven-3.5.4/bin/mvn /usr/bin/mvn
USER jenkins
docker build --rm --tag 192.168.1.169:80/jyyun/jenkins-agent:maven-3.5.4 .
docker run --name=maven -it -v /data/mavenrepo:/home/jenkins/.m2 192.168.1.169:80/jyyun/jenkins-agent:maven-3.5.4 /bin/bash
看到里面竟然还带了git的
git clone -b dev http://xxx/jieyi-saas/dep.git
cd dep
mvn clean compile package -Dmaven.test.skip=true -pl dep-admin -am -f pom.xml
那就把这个包上传,基于这个镜像来做
docker push 192.168.1.169:80/jyyun/jenkins-agent:maven-3.5.4
podTemplate(containers: [
containerTemplate(
name: 'jnlp',
image: '192.168.1.169:80/jyyun/jenkins-agent:maven-3.5.4',
alwaysPullImage: false,
args: '${computer.jnlpmac} ${computer.name}'),
]) {
node(POD_LABEL) {
stage('git pull') {
echo "hello git"
sh 'git clone -b dev http://xxx/jieyi-saas/dep.git'
}
stage('build') {
sh 'mvn -version'
}
stage('test') {
echo "hello test"
}
stage('deploy') {
echo "hello deploy"
sleep 10
}
}
}
可以了:
2、开始解决存储问题,需要在NFS里面有一个路径给jenkins的/home/jenkins/.m2使用,以便存储各种maven所需要的包
新建一个存储卷:
podTemplate(containers: [
containerTemplate(
name: 'jnlp',
image: '192.168.1.169:80/jyyun/jenkins-agent:maven-3.5.4',
alwaysPullImage: false,
args: '${computer.jnlpmac} ${computer.name}'),
],
volumes: [
persistentVolumeClaim(mountPath: '/home/jenkins/.m2/', claimName: 'jenkins-mavenrepo')
]) {
node(POD_LABEL) {
stage('git pull') {
echo "hello git"
sh 'git clone -b dev http://xxx/jieyi-saas/dep.git'
sh '''
cd dep
mvn clean compile package -Dmaven.test.skip=true -pl dep-admin -am -f pom.xml
'''
}
stage('build') {
sh 'mvn -version'
}
stage('test') {
echo "hello test"
}
stage('deploy') {
echo "hello deploy"
sleep 10
}
}
}
构建在不断下载资源包
同时可以看到NFS服务器的这个路径下有maven下载的资源包了
第一次构建了
再次构建,因为maven的资源包都下载过了,所以明显变短了
二、基于前面一节的内容继续扩展发布部分
docker run --name=maven -it -v /data/mavenrepo:/home/jenkins/.m2 192.168.1.169:80/jyyun/jenkins-agent:maven-3.5.4 /bin/bash
设置免密登录
cd
ssh-keygen -t rsa
cd .ssh
cat id_rsa.pub
然后把内容拷贝到docker服务器的~/.ssh/authorized_keys中(备注,目标服务器的设置在jenkins配置的时候已经有说明,此处不赘述)
在宿主机执行
docker commit maven 192.168.1.169:80/jyyun/jenkins-agent:maven-3.5.4-20220319
测试这个镜像是否可以用
docker run --name=maven -it -v /data/mavenrepo:/home/jenkins/.m2 192.168.1.169:80/jyyun/jenkins-agent:maven-3.5.4-20220319 /bin/bash
git clone -b dev http://xxx/jieyi-saas/dep.git
cd dep
mvn clean compile package -Dmaven.test.skip=true -pl dep-admin -am -f pom.xml
ssh root@192.168.1.197
cd /root/dockerbuild/dep/target
rm -rf *
exit
scp dep-admin/target/dep-admin.jar
root@192.168.1.197:/root/dockerbuild/dep/target/
ssh root@192.168.1.197
cd /root/dockerbuild/dep/
verno=date +%Y%m%d
docker build --rm --tag 192.168.1.169:80/jyyun/dep:$verno .
docker push 192.168.1.169:80/jyyun/dep:$verno
执行下来没问题
那就把这个包上传,基于这个镜像来做
docker push 192.168.1.169:80/jyyun/jenkins-agent:maven-3.5.4-20220319
修改流水线:
:
podTemplate(containers: [
containerTemplate(
name: 'jnlp',
image: '192.168.1.169:80/jyyun/jenkins-agent:maven-3.5.4-20220319',
alwaysPullImage: false,
args: '${computer.jnlpmac} ${computer.name}'),
],
volumes: [
persistentVolumeClaim(mountPath: '/home/jenkins/.m2/', claimName: 'jenkins-mavenrepo')
]) {
node(POD_LABEL) {
stage('git pull') {
echo "prepare to pull"
sh 'git clone -b dev http://xxx/jieyi-saas/dep.git'
echo "pull completely"
}
stage('build') {
sh '''
cd dep
mvn clean compile package -Dmaven.test.skip=true -pl dep-admin -am -f pom.xml
'''
}
stage('test') {
echo "hello test"
}
stage('deploy') {
echo "remote 1 start"
sh '''
ssh -o StrictHostKeyChecking=no root@192.168.1.197 << remotessh
cd /root/dockerbuild/dep/target
rm -rf *
exit
remotessh
'''
echo "remote 1 end"
echo "remote 2 start"
sh '''
cd
scp -o StrictHostKeyChecking=no agent/workspace/test_pipline/dep/dep-admin/target/dep-admin.jar root@192.168.1.197:/root/dockerbuild/dep/target/
'''
echo "remote 2 end"
echo "remote 3 start"
sh '''
ssh -o StrictHostKeyChecking=no root@192.168.1.197 << remotessh
cd /root/dockerbuild/dep/
docker build --rm --tag 192.168.1.169:80/jyyun/dep:`date +%Y%m%d` .
docker push 192.168.1.169:80/jyyun/dep:`date +%Y%m%d`
exit
remotessh
'''
echo "remote 3 end"
}
}
}
终于成功了:
镜像仓库也有对应的镜像了:
四、其它
这里其实就是流水线拉取git、在Pod的容器里面编译、传包到一个docker构建的服务器、在docker构建服务器上构建并且推送到镜像仓库的过程
像其它的,如果你想直接部署等,可以按照上面的配置做变化即可
欢迎关注公众号一起探讨: