pipeline {
agent {
kubernetes {
label "jenkins-slave"
yaml '''
apiVersion: v1
kind: Pod
metadata:
name: jenkins-slave
spec:
containers:
- name: jnlp
image: jenkins-slave-jdk:1.8
imagePullPolicy: Never
'''
}
}
stages {
stage('TestAgent') {
steps {
sh 'hostname'
}
}
stage('CheckOut') {
steps {
checkout([$class: 'GitSCM',
branches: [[name: '*/master']],
extensions: [],
userRemoteConfigs: [[credentialsId: 'bcfe14cb-2215-4862-a472-641f0241b573',
url: 'http://139.198.166.235:81/devop/devops-skywalking-service.git']]])
}
}
stage('Build') {
steps {
script{
sh 'ls'
sh 'pwd'
}
}
}
}
}
Started by user admin
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] echo
[WARNING] label option is deprecated. To use a static pod template, use the 'inheritFrom' option.
[Pipeline] podTemplate
[Pipeline] {
[Pipeline] node
Created Pod: kubernetes ops/jenkins-slave-4l66j-8c8gs
[Normal][ops/jenkins-slave-4l66j-8c8gs][Scheduled] Successfully assigned ops/jenkins-slave-4l66j-8c8gs to node2
[Normal][ops/jenkins-slave-4l66j-8c8gs][Pulled] Container image "jenkins-slave-jdk:1.8" already present on machine
[Normal][ops/jenkins-slave-4l66j-8c8gs][Created] Created container jnlp
[Normal][ops/jenkins-slave-4l66j-8c8gs][Started] Started container jnlp
Agent jenkins-slave-4l66j-8c8gs is provisioned from template jenkins-slave-4l66j
---
apiVersion: "v1"
kind: "Pod"
metadata:
annotations:
buildUrl: "http://jenkins.ops/job/devops-eurka-service/1/"
runUrl: "job/devops-eurka-service/1/"
labels:
jenkins: "slave"
jenkins/label-digest: "03ddc3eddf95d5470d5c7fb6d2937abaeca3b79e"
jenkins/label: "jenkins-slave"
name: "jenkins-slave-4l66j-8c8gs"
spec:
containers:
- env:
- name: "JENKINS_SECRET"
value: "********"
- name: "JENKINS_AGENT_NAME"
value: "jenkins-slave-4l66j-8c8gs"
- name: "JENKINS_NAME"
value: "jenkins-slave-4l66j-8c8gs"
- name: "JENKINS_AGENT_WORKDIR"
value: "/home/jenkins/agent"
- name: "JENKINS_URL"
value: "http://jenkins.ops/"
image: "jenkins-slave-jdk:1.8"
imagePullPolicy: "Never"
name: "jnlp"
resources:
limits: {}
requests:
memory: "256Mi"
cpu: "100m"
volumeMounts:
- mountPath: "/home/jenkins/agent"
name: "workspace-volume"
readOnly: false
nodeSelector:
kubernetes.io/os: "linux"
restartPolicy: "Never"
volumes:
- emptyDir:
medium: ""
name: "workspace-volume"
Running on jenkins-slave-4l66j-8c8gs in /home/jenkins/agent/workspace/devops-eurka-service
[Pipeline] {
[Pipeline] stage
[Pipeline] { (TestAgent)
[Pipeline] sh
+ hostname
jenkins-slave-4l66j-8c8gs
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (CheckOut)
[Pipeline] checkout
The recommended git tool is: NONE
using credential bcfe14cb-2215-4862-a472-641f0241b573
Cloning the remote Git repository
Cloning repository http://139.198.166.235:81/devop/devops-skywalking-service.git
> git init /home/jenkins/agent/workspace/devops-eurka-service # timeout=10
Fetching upstream changes from http://139.198.166.235:81/devop/devops-skywalking-service.git
> git --version # timeout=10
> git --version # 'git version 1.8.3.1'
using GIT_ASKPASS to set credentials gitlab-devop
> git fetch --tags --progress http://139.198.166.235:81/devop/devops-skywalking-service.git +refs/heads/*:refs/remotes/origin/* # timeout=10
Avoid second fetch
Checking out Revision 8a64bae344504217761314054e6dec360e22cc89 (refs/remotes/origin/master)
> git config remote.origin.url http://139.198.166.235:81/devop/devops-skywalking-service.git # timeout=10
> git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
> git rev-parse refs/remotes/origin/master^{commit} # timeout=10
> git config core.sparsecheckout # timeout=10
> git checkout -f 8a64bae344504217761314054e6dec360e22cc89 # timeout=10
Commit message: "all"
First time build. Skipping changelog.
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage (hide)
[Pipeline] { (Build)
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ ls
LICENSE
README.md
basic-common
db
eureka-service
gateway-service
k8s
lombok.config
order-service
pom.xml
portal-service
product-service
stock-service
[Pipeline] sh
+ pwd
/home/jenkins/agent/workspace/devops-eurka-service
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // podTemplate
[Pipeline] End of Pipeline
Finished: SUCCESS
[root@master ~]# kubectl get pod -n ops -w NAME READY STATUS RESTARTS AGE grafana-757fcd5f7c-fx72b 1/1 Running 15 11d jenkins-797ccbdbc5-88qrd 1/1 Running 6 45h jenkins-slave-mhzxx-g29pz 0/1 Pending 0 0s jenkins-slave-mhzxx-g29pz 0/1 Pending 0 0s jenkins-slave-mhzxx-g29pz 0/1 ContainerCreating 0 0s jenkins-slave-mhzxx-g29pz 0/1 ContainerCreating 0 1s jenkins-slave-mhzxx-g29pz 1/1 Running 0 2s jenkins-slave-mhzxx-g29pz 1/1 Terminating 0 4m30s jenkins-slave-mhzxx-g29pz 1/1 Terminating 0 4m31s jenkins-slave-mhzxx-g29pz 0/1 Terminating 0 4m31s jenkins-slave-mhzxx-g29pz 0/1 Terminating 0 4m39s jenkins-slave-mhzxx-g29pz 0/1 Terminating 0 4m39s
自动部署应用(yaml):
将kubectl工具封装到Slave镜像中,并通过Config File Provider插件存储连接K8s集群的kubeconfig认证文件,然后挂载到Slave容器中,这样就能用kubectl apply deploy.yaml --kubeconfig=config
注:为提高安全性,kubeconfig文件应分配权限
除了上述方式,还可以使用Kubernetes Continuous Deploy插件,将资源配置(YAML)部署到Kubernetes,这种
不是很灵活性。
def project = "dev"
def app_name = "java-demo"
def image_name = "${registry}/${project}/${app_name}:${BUILD_NUMBER}"
pipeline {
agent {
kubernetes {
label "jenkins-slave"
yaml '''
apiVersion: v1
kind: Pod
metadata:
name: jenkins-slave
spec:
containers:
- name: jnlp
image: jenkins-slave-jdk:1.8
imagePullPolicy: Never
volumeMounts:
- name: docker-cmd
mountPath: /usr/bin/docker
- name: docker-sock
mountPath: /var/run/docker.sock
- name: maven-cache
mountPath: /root/.m2
volumes:
- name: docker-cmd
hostPath:
path: /usr/bin/docker
- name: docker-sock
hostPath:
path: /var/run/docker.sock
- name: maven-cache
hostPath:
path: /tmp/m2
'''
}
}
stages {
stage('TestAgent') {
steps {
sh 'hostname'
}
}
stage('CheckOut') {
steps {
checkout([$class: 'GitSCM',
branches: [[name: "${branchName}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: "${credentialsId}",
url: "${srcUrl}"]]])
}
}
stage('Build') {
steps {
script{
sh """
mvn clean package -Dmaven.test.skip=true
mvn -v
"""
}
}
}
stage('Artifact') {
steps {
script{
withCredentials([usernamePassword(credentialsId: 'd8e0980c-1ffb-4096-a0b7-8f9379982c3f',
passwordVariable: 'passwd',
usernameVariable: 'user')]) {
sh """
docker build -t ${image_name} .
docker login -u ${user} -p ${passwd} ${registry}
docker push ${image_name}
"""
}
}
}
}
stage('Deploy') {
steps {
script{
configFileProvider([configFile(fileId: '22bdbd6d-14f4-49c1-a924-5c844073ea69',
targetLocation: "admin.kubeconfig")]){
sh """
sed -i 's#IMAGE_NAME#${image_name}#' deployment.yaml
sed -i 's#REPLICAS#${ReplicaCount}#' deployment.yaml
kubectl apply -f deployment.yaml -n ${Namespace} --kubeconfig=admin.kubeconfig
"""
}
}
}
}
}
}



