Jenkins

1.安装

# 带blueocean的镜像
docker pull jenkinsci/blueocean:latest

# -v jenkins-data:/var/jenkins_home 将容器中的 /var/jenkins_home 目录映射到Docker volume,并将其命名为jenkins-data。如果该卷不存在, 那么docker run命令会自动为你创建卷。
# 即df -h时,看到的/dev/sdc,因为是挂的,及时删除容器再创建心得,每次都保留数据。可以通过docker volume ls/rm 等命令删除。
# -v "%MY_DOCKER_HOME%":/home 将主机上的`%MY_DOCKER_HOME%` 目录 (即你的本地)映射到到容器的/home目录。设置环境变量MY_DOCKER_HOME为F:\download。用cmd执行,powershell报错!
docker run -d --name=myjenkins -u root -p 8080:8080 -v jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v "%MY_DOCKER_HOME%":/home jenkinsci/blueocean:latest

# 访问localhost:8080,按照提示完成初始设定并重启。

# 新建流水线任务,配置git项目地址及密码。进入BlueOcean执行流水线。

# 安装docker相关插件,否则会报一下错误
WorkflowScript: 3: Invalid agent type "docker" specified. Must be one of [any, label, none] @ line 3, column 9.

# git仓库的最外层默认必须有一个Jenkinsfile文件,Jenkinsfile文件路径当然也是可以配置的。

以下流水线配置,可以编译maven工程,并启动。Jenkinsfile:

pipeline {
    agent {
        docker {
            image 'maven:3-alpine'
            args '-v /root/.m2:/root/.m2'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean package'
            }
        }
        stage('Deliver') {
            steps {
                sh 'sh ./jenkins/scripts/deliver.sh'
            }
        }
    }
}

关于image ‘maven:3-alpine’ : 将在Docker中本地运行相互独立的Jenkins和Maven容器。Maven容器成为了Jenkins用来运行你的流水线项目的agent。这个容器寿命很短——它的寿命只是你的流水线的执行时间。 注意:stages中的step其实是在Maven容器执行的!

关于args ‘-v /root/.m2:/root/.m2’: 这里的args参数在暂时部署的Maven Docker容器的/root/.m2(即Maven仓库)目录和Docker主机文件系统的对应目录之间创建了一个相互映射。这背后的实现细节超出了本教程的范围,在此不做解释。 但是,这样做的主要原因是,在Maven容器的生命周期结束后,构建Java应用程序所需的工件(Maven在流水线执行时进行下载)能够保留在Maven存储库中。这避免了在后续的流水线执行过程中, Maven反复下载相同的工件。 请注意,不同于你为jenkins-data创建的Docker数据卷,Docker主机的文件系统在每次重启Docker时都会被清除。这意味着每次Docker重新启动时,都会丢失下载的Maven仓库工件。(docker run 添加–rm参数时)

git仓库中的/jenkins/scripts/deliver.sh如下,执行Java程序(示例程序就一个main函数)。实际应用中应该是jar包打包之类的操作。

#!/usr/bin/env bash

set -x
java -jar target/my-app-1.0-SNAPSHOT.jar

2.实际项目打包

适用于\pring-boot-startup\demo1,最终效果是执行后jar包拷贝到F:\download目录

Jenkinsfile:

pipeline {
    agent {
        docker {
            image 'maven:3-alpine'
            args '-v /root/.m2:/root/.m2'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean package'
            }
        }
        stage('Deliver') {
            steps {
                sh 'sh ./doc/rundir/deliver.sh'
            }
        }
    }
}

deliver.sh:

#!/usr/bin/env bash

# maven容器中的/home目录,映射到的是windows的F:\download目录。
cp target/demo-1.0.0-SNAPSHOT.jar /home

3.参考

(1)Jenkins官方手册:使用Maven构建Java应用程序

(2)Official Jenkins Docker image

(3)dockerhub jenkins

(4)dockerhub jenkinsci blueocean