Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓƵ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
°¢ÀïÔÆKubernetesʵս

 
  10570  次浏览      19
 2019-6-19
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚÔÆÉçÇø,±¾ÎĽ«Í¨¹ýʵ¼Ê°¸Àý´®ÁªËùÓеĻù´¡Èí¼þ·þÎñ£¬»ùÓÚK8S×öDevOps£¬Ï£Íû±¾ÎĶÔÄúµÄѧϰÓÐËù°ïÖú¡£

ÕûÌåµÄÒµÎñÁ÷³ÌÈçÏÂͼËùʾ£º

Ò»¡¢Ò»»ú¶àJenkins Slave

ÓÉÓÚÒµÎñÐèÒª£¬ÎÒÃǵÄ×Ô¶¯»¯²âÊÔÐèÒª»ùÓÚwindows×öweb¹¦ÄܲâÊÔ£¬Ã¿Ò»¸ö²âÊÔÈÎÎñ¶ÀÕ¼Ò»¸öwindowsÓû§×ÀÃ棬ËùÒÔÎÒÃÇÊ×ÏÈÒª¸øJenkinsÅäÖü¸¸öWindowsµÄSlave Node.ÔÚÎÒ֮ǰµÄpost¡¶³ÖÐø¼¯³ÉCIʵʩָÄÏÈý¨Cjenkins¼¯³É²âÊÔ¡·ÖÐÏêϸ½²½âÁ˸øJenkinsÌí¼ÓNodeµÄ·½·¨²½Öè¡£ ±¾ÆªÎÞÐèÖظ´£¬µ«ÕâÀïÖ÷Òª½²µÄÊÇ£¬ÈçºÎÔÚһ̨Windows·þÎñÆ÷Éϴ¶à¸öJenkins Node£¬¹©¶àÓû§Ê¹Óá£

ÔÚÄ¿±ê»úÉϽ¨Á¢¶à¸öÓû§£¬ÈçÏÂͼËùʾ£º

ÓÃAdministratorÓû§°²×°JDK

ÔÚJenkinsµÄ½Úµã¹ÜÀí½¨Á¢Èý¸öNode£¬·Ö±ðΪWinTester01¡¢WinTester02¡¢WinTester03£¬ÅäÖÃÈçÏÂ

ÔÚÄ¿±ê»úµÄAdministrator£¬ÓÃIE´ò¿ªJenkins²¢½øÈë½Úµã¹ÜÀí£¬ÔÚ WinTester01¡¢WinTester02¡¢WinTester03 Öзֱðµã»÷¡°Launch¡±Æô¶¯Slave

È·ÈÏÆô¶¯³É¹¦ºó£¬µã»÷¡°File¡±Ïµġ°Install as service¡±

Èý¸öSlave¶¼Æô¶¯ºó£¬¿ÉÒÔÔÚ·þÎñ¹ÜÀíÆ÷¿´µ½

³ýÁËJenkins Slave1ÎÞÐèÅäÖã¬Slave2ºÍSlave3¶¼ÐèÒªÓÒ¼ü½øÈëÊôÐÔ£¬Ð޸ĵǼÓû§·Ö±ðΪJenkinsSlave2ºÍJenkinsSlave3

ͨ¹ýÉÏÃæµÄÅäÖ㬿ÉÒÔÔÚһ̨Ŀ±ê»ú²¿ÊðÈý¸öÓû§¶ÔÓ¦Èý¸öJenkins SlaveÒÔÂú×ãÎÒÃǵÄÒµÎñÐèÇó¡£

¶þ¡¢ ¶þ´Î¿ª·¢Jenkins ¶¤¶¤Í¨Öª²å¼þ

ÔÚÕû¸öDevOpsµÄÒµÎñÁ÷³ÌͼÉÏ£¬ÎÒÃÇÏëʹÓö¤¶¤×÷Ϊ֪ͨ·½Ê½£¬Ïà±ÈÓʼþ¶øÑÔ£¬ÊµÊ±ÐÔºÍÀ©Õ¹ÐÔ¶¼ºÜ¸ß¡£ÔÚ2018Äê4Ô£¬JenkinsµÄ¶¤¶¤Í¨Öª²å¼þÓÐÁ½¿î£¬·Ö±ðÊÇDingding JSON PusherºÍDingding notification plugin£¬Ç°Õß³¤ÆÚδ¸üУ¬ÒѾ­²»ÄÜʹÓ㬺óÕß¿ÉÒÔÔÚ·ÇPipelineģʽÏÂʹÓ㬶ÔÓÚPipelineÔòÓÐһЩÎÊÌâ¡£ËäȻĿǰ£¬Dingding notification pluginÒѾ­¸üе½1.9°æ±¾²¢Ö§³ÖÁËPipeline£¬µ«ÔÚµ±Ê±£¬ÎÒÃDz»µÃ²»ÔÚ1.4°æ±¾µÄ»ù´¡ÉÏ×ö¶þ´Î¿ª·¢¡£

ÕûÌ忪·¢¾­¹ý²Î¿¼¡¶JenkinsÏîĿʵս֮-¶¤¶¤ÌáÐѲå¼þ¶þ´Î¿ª·¢¾ÙÀý¡·£¬×ÜÌåÀ´Ëµ»¹ÊDZȽϼòµ¥£º

Ð޸ġ±src/main/java/com/ztbsuper/dingtalk / DingTalkNotifier . java ¡±£¬¶¤¶¤µÄÏûÏ¢APIÀàÐÍÓÐÎı¾¡¢link¡¢markdown¡¢cardµÈ£¬ÎÒÃÇÕâÀï°Ñ֪ͨ½Ó¿Ú¸Ä³ÉÎı¾ÀàÐÍ

public class DingTalkNotifier extends Notifier implements SimpleBuildStep {
?
private String accessToken;
private String message;
private String imageUrl;
private String messageUrl;
?
@DataBoundConstructor
public DingTalkNotifier(String accessToken, String message, String imageUrl, String messageUrl) {
this.accessToken = accessToken; //¶¤¶¤µÄaccesstoken
this.message = message; //ÏûÏ¢Ö÷Ìå
this.imageUrl = imageUrl; //ËõÂÔͼ
this.messageUrl = messageUrl; //ÏûÏ¢µÄÁ´½ÓÀ´Ô´£¬Ò»°ãÊÇjenkinsµÄbuild url
}
?
public String getAccessToken() {
return accessToken;
}
public String getMessage() {
return message;
}
public String getImageUrl() {
return imageUrl;
}
public String getMessageUrl() {
return messageUrl;
}
?
@Override
public void perform(@Nonnull Run<?, ?> run, @Nonnull FilePath filePath, @Nonnull Launcher launcher, @Nonnull TaskListener taskListener) throws InterruptedException, IOException {
String buildInfo = run.getFullDisplayName();
if (!StringUtils.isBlank(message)) {
sendMessage(LinkMessage.builder()
.title(buildInfo)
.picUrl(imageUrl)
.text(message)
.messageUrl(messageUrl)
.build());
}
}
?
private void sendMessage(DingMessage message) {
DingTalkClient dingTalkClient = DingTalkClient.getInstance();
try {
dingTalkClient.sendMessage(accessToken, message);
} catch (IOException e) {
e.printStackTrace();
}
}
?
@Override
public BuildStepMonitor getRequiredMonitorService() {
return BuildStepMonitor.NONE;
}
?
@Symbol("dingTalk")
@Extension
public static final class DescriptorImpl extends BuildStepDescriptor<Publisher> {
?
@Override
public boolean isApplicable(Class<? extends AbstractProject> aClass) {
return true;
}
?
@Nonnull
@Override
public String getDisplayName() {
return Messages.DingTalkNotifier_DescriptorImpl_DisplayName();
}
}
}

ÓÃmaven´ò°ü

mavenÐèÒª°²×°java»·¾³£¬ÎªÁË·½±ã£¬ÎÒÖ±½ÓrunÒ»¸ömavenµÄdocker image£¬±àÒëÍê³Éºó°ÑhpiÎļþsend³öÀ´

ÔÚjenkinsµÄ²å¼þ¹ÜÀíÒ³ÃæÉÏ´«hpiÎļþ

ÔÚ¶¤¶¤ÈºÖпªÆô×Ô¶¨Òå»úÆ÷ÈË

ÕÒµ½accesstoken

ÔÚjenkins pipelineÖпÉÒÔʹÓÃÒÔÏÂÃüÁî·¢ËÍÐÅÏ¢µ½¶¤¶¤Èº

dingTalk accessToken:"2fccafaexxxx",message:"ÐÅÏ¢",imageUrl:"ͼƬµØÖ·",messageUrl:"ÏûÏ¢Á´½Ó"

Èý¡¢ DevOps½â¾ö·½°¸

Õë¶Ôÿһ¸öÈí¼þÏîÄ¿Ôö¼Ó²¿ÊðĿ¼£¬Ä¿Â¼½á¹¹ÈçÏ£º

_deploy
master
deployment.yaml
Dockerfile
other files
test
deployment.yaml
Dockerfile
other files

masterºÍtestÎļþ¼ÐÓÃÓÚÇø·Ö²âÊÔ»·¾³ÓëÉú²ú»·¾³µÄ²¿ÊðÅäÖÃ

DockerfileºÍother filesÓÃÓÚÉú³ÉÓ¦Óûò·þÎñµÄ¾µÏñ

ÈçÇ°¶ËvueºÍnodejsÏîÄ¿µÄDockerfile£º

# Ç°¶ËÏîÄ¿ÔËÐл·¾³µÄImage£¬´ÓHarbor»ñÈ¡
FROM xxx/xxx/frontend:1.0.0
RUN mkdir -p /workspace/build && mkdir -p /workspace/run
COPY . /workspace/build
# ±àÒ룬Éú³ÉÖ´ÐÐÎļþ£¬²¢É¾³ýÔ´Îļþ
RUN cd /workspace/build/frontend && \
cnpm install && \
npm run test && \
cp -r /workspace/build/app/* /workspace/run && \
rm -rf /workspace/build && \
cd /workspace/run && \
cnpm install
# ÔËÐÐÏîÄ¿£¬ÓÃnpm run test»òrun prodÇø·Ö²âÊÔºÍÉú²ú»·¾³
CMD cd /workspace/run && npm run test

ÓÖÈçdotnet coreÏîÄ¿µÄDockerfile£º

# dotnetÏîÄ¿±àÒë»·¾³µÄImage£¬´ÓHarbor»ñÈ¡
FROM xxx/xxx/aspnetcore-build:2 AS builder
WORKDIR /app
COPY . .
# ±àÒë
RUN cd /app/xxx
RUN pwd && ls -al && dotnet restore
RUN dotnet publish -c Release -o publish
?
# dotnetÏîÄ¿ÔËÐл·¾³µÄImage£¬´ÓHarbor»ñÈ¡
FROM xxx/xxx/aspnetcore:2
WORKDIR /publish
COPY --from=builder /app/xxx/publish .
# ÖØÃüÃûÅäÖÃÎļþ£¬ÖÐ׺test¡¢prodÓÃÓÚÇø·Ö²âÊÔ»·¾³ºÍÉú²ú»·¾³
RUN mv appsettings.test.json appsettings.json
# ÔËÐÐ
ENTRYPOINT ["dotnet", "xxx.dll"]

deployent.yamlÓÃÓÚÖ´ÐÐÓ¦Óûò·þÎñÔÚk8sÉϵIJ¿Êð

ÓÉÓÚdeploymentÓкܶàÅäÖÃÏî¿ÉÒÔ³éÀë³É¹«¹²ÅäÖã¬ËùÒÔdeploymentµÄÅäÖÃÓкܶàռλ±äÁ¿£¬Õ¼Î»±äÁ¿ÓÃÁ½¸ö#Öмä¼Ó±äÁ¿Ãû±íʾ£¬ÈçÏÂËùʾ£º

apiVersion: v1
kind: Namespace
metadata:
name: #namespace#
labels:
name: #namespace#
---
apiVersion: v1
data:
.dockerconfigjson: xxxxxxxxxxxxxxxxxxxxxx
kind: Secret
metadata:
name: regcred
namespace: #namespace#
type: kubernetes.io/dockerconfigjson
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: #app#-deploy
namespace: #namespace#
labels:
app: #app#-deploy
spec:
replicas: #replicas#
strategy:
type: Recreate
template:
metadata:
labels:
app: #app#
spec:
containers:
- image: #image#
name: #app#
ports:
- containerPort: #port#
name: #app#
securityContext:
privileged: #privileged#
volumeMounts:
- name: log-volume
mountPath: #log#
- image: #filebeatImage#
name: filebeat
args: [
"-c", "/etc/filebeat.yml"
]
securityContext:
runAsUser: 0
volumeMounts:
- name: config
mountPath: /etc/filebeat.yml
readOnly: true
subPath: filebeat.yml
- name: log-volume
mountPath: /var/log/container/
volumes:
- name: config
configMap:
defaultMode: 0600
name: filebeat-config
- name: log-volume
emptyDir: {}
imagePullSecrets:
- name: regcred
---
apiVersion: v1
kind: ConfigMap
metadata:
name: filebeat-config
namespace: #namespace#
labels:
app: filebeat
data:
filebeat.yml: |-
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/container/*.log
output.elasticsearch:
hosts: ["#es#"]
tags: ["#namespace#-#app#"]
---
apiVersion: v1
kind: Service
metadata:
name: #app#-service
namespace: #namespace#
labels:
app: #app#-service
spec:
ports:
- port: 80
targetPort: #port#
selector:
app: #app#
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: #app#-ingress
namespace: #namespace#
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "0"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: #host#
http:
paths:
- path: #urlPath#
backend:
serviceName: #app#-service
servicePort: 80

ÆäÖм¸¸ö¹Ø¼ü±äÁ¿µÄ½âÊÍÈçÏ£º

dockerconfigjson£ºÒòΪËùÓеľµÏñÐèÒª´ÓHarbor»ñÈ¡£¬¶øHarborµÄ¾µÏñÈç¹ûÉèÖÃΪ˽ÓÐȨÏÞ£¬¾ÍÐèÒªÌṩÉí·ÝÑéÖ¤£¬ÕâÀïµÄ dockerconfigjson ¾ÍÊÇHarborµÄÉí·ÝÐÅÏ¢¡£Éú³ÉdockerconfigjsonµÄ·½·¨ÈçÏ£º

½øÈëK8SÈκÎÒ»¸ö½Úµã£¬É¾³ý¡± ~/.docker/config.json ¡± Îļþ

ʹÓÃÃüÁ docker login harborµØÖ·¡±µÇ¼harbor

ͨ¹ýÃüÁ cat ~/.docker/config.json ¡° ¿ÉÒÔ¿´µ½harborµÄÉí·ÝÑéÖ¤ÐÅÏ¢

ʹÓÃÃüÁ cat /root/.docker/config.json | base64 -w 0 ¡°¶ÔÐÅÏ¢±àÂ룬½«Éú³ÉºóµÄ±àÂëÌîдµ½deployment.yamlµÄdockerconfigjson½Úµã¼´¿É

namespace£ºÍ¬Ò»¸öÏîÄ¿µÄ²»Í¬k8s×é¼þÓ¦ÖÃÓÚͬһ¸önamespace£¬ËùÒÔnamespace¿ÉͳһÅäÖã¬ÔÚÎÒÃǵÄÏîĿʵ¼ùÖУ¬Éú²ú»·¾³µÄnamespaceΪ¡± ÏîÄ¿Ãû ¡°£¬²âÊÔ»·¾³µÄnamespaceΪ¡± ÏîÄ¿Ãû-test ¡°

app£ºÓ¦Óûò·þÎñÃû³Æ

image£ºÓ¦Óûò·þÎñµÄ¾µÏñµØÖ·

replicas£º¸±±¾ÊýÁ¿

port£ºÓ¦Óûò·þÎñµÄPod¿ª·Å¶Ë¿Ú

log£ºÓ¦Óûò·þÎñµÄÈÕ־·¾¶£¬ÔÚ±¾ÏµÁеĵڶþƪÎÄÕÂÖУ¬Ìáµ½ÎÒÃǵÄÈÕÖ¾·½°¸ÊǸøÿ¸öÓ¦Óûò·þÎñÅäÒ»¸öfilebeat£¬·ÅÔÚͬһPodÖУ¬ÕâÀïÖ»Ðè¸æÖªÓ¦Óûò·þÎñµÄÈÕÖ¾µÄ¾ø¶Ô·¾¶£¬filebeat¾ÍÄܽ«ÈÕÖ¾´«µÝµ½ESÖУ¬ÈÕÖ¾µÄtagÃüÃû·½Ê½Îª¡± namespace-app¡±

host£ºÔÚ±¾ÏµÁеĵÚһƪÎÄÕÂÖУ¬½²ÁËʹÓÃnginx ingress×ö·þÎñ±©Â¶Ó븺ÔØ¡£ÕâÀïµÄhost¾ÍÊǸønginx ingress ÉèÖõÄÓòÃû£¬¶Ë¿ÚĬÈ϶¼ÊÇ80£¬Èç¹ûÐèÒªhttps£¬ÔòÔÚÍâ²ãʹÓð¢ÀïÔÆSLBת·¢

urlPath£ººÜ¶àÇé¿öÏ£¬Èç΢·þÎñ£¬ÐèҪͨ¹ýÏàͬµÄÓòÃû£¬²»Í¬µÄÒ»¼¶Ä¿Â¼½«ÇëÇó·Ö·¢µ½²»Í¬µÄºǫ́£¬ÔÚnginxÖУ¬¾ÍÊÇlocationµÄÅäÖÃÓë·´Ïò´úÀí£¬±ÈÈçhostµÄÅäÖÃÊÇÈ·¶¨ÁËÓòÃûaaa.bbb.com£¬¶øurlPathµÄÅäÖÃÊÇÈ·¶¨ aaa .bbb.com/user /getuser ½«»á±»×ª·¢µ½Óû§·þÎñ podIP:podPort / getuserÖÐ

ÒÔÉÏËùÓеÄռλ±äÁ¿¶¼ÊÇÔÚPipeline ScriptÖи³Öµ£¬¹ØÓÚ Jenkins Pipeline µÄÏà¹ØÄÚÈݽéÉÜÕâÀï²»Ôٶི£¬»¹ÊÇÈ¥¿´¹Ù·½Îĵµ¿¿Æס£ÎÒÃÇÕâÀォk8sµÄ²¿ÊðÎļþdeployment.yamlÓëJenkinsfile½áºÏ£¬¼´¿É×öµ½Ò»¸ödeployment.yamlÄÜÊÊÅäËùÓÐÏîÄ¿£¬Ò»¸öPipeline ScriptÄ£°åÄÜÊÊÅäËùÓÐÏîÄ¿£¬Õë¶Ô²»Í¬µÄÏîÄ¿£¬Ö»ÐèÔÚPipeline ScriptÖиøռλ±äÁ¿¸³Öµ£¬´ó´ó½µµÍÁËÅäÖø´ÔӶȡ£ÏÂÃæÊÇÒ»¸öÏîÄ¿µÄJenkinsÅäÖÃʾÀý£º

¶ÔÓÚÒ»¸öÏîÄ¿£¬ÎÒÃÇÖ»ÐèÅäÖÃTriggerºÍPipeline£¬ÉÏͼ¡°Do not allow concurrent builds ¡±Ò²ÊÇͨ¹ýPipelineµÄÅäÖÃÉú³ÉµÄ¡£Pipeline ScriptʾÀýÈçÏ£º

pipeline {
// Ö¸¶¨ÏîÄ¿ÔÚlabelΪjnlp-agentµÄ½ÚµãÉϹ¹½¨£¬

Ò²¾ÍÊÇJenkins Slave in Pod
agent { label 'jnlp-agent' }
// ¶ÔÓ¦Do not allow concurrent builds
options {
disableConcurrentBuilds()
}
environment {
// ------ ÒÔÏÂÄÚÈÝ£¬Ã¿¸öÏîÄ¿¿ÉÄܾùÓв»Í¬£¬°´ÐèÐÞ¸Ä

------
//author£ºÓÃÓÚ¶¤¶¤Í¨Öª
author="ÕÅÈý"
// branch: ·ÖÖ§£¬Ò»°ãÊÇtest¡¢ master£¬¶ÔÓ¦git´ÓÄĸö

·ÖÖ§À­È¡´úÂ룬Ҳ¶ÔÓ¦¾¿¾¹Ö´ÐÐ_deployÎļþ¼ÐϵÄtest

ÅäÖû¹ÊÇmasterÅäÖÃ
branch = "test"
// namespace: myproject-test, myproject£¬ÃüÃû¿Õ¼äÒ»

°ãÊÇÏîÄ¿Ãû³Æ£¬

²âÊÔ»·¾³¼Ótest
namespace = "myproject-test"
// hostname£º¶ÔÓ¦deploymentÖеÄhost
host = "test.aaa.bbb.com"
// appname£º¶ÔÓ¦deploymentÖеÄapp
app = "myserver"
// port£º¶ÔÓ¦deploymentÖеÄport
port= "80"
// replicas£º¶ÔÓ¦deploymentÖеÄreplicas
replicas = 2
//git repo path£ºgitµÄµØÖ·
git="git@git.aaa.bbb.com/xxx.git"
//log£º¶ÔÓ¦deploymentÖеÄlog
log="/publish/logs/"
// ------ ÒÔÏÂÄÚÈÝ£¬Ò»°ãËùÓеÄÏîÄ¿¶¼Ò»Ñù£¬²»¾­³£ÐÞ¸Ä

------
// harbor inner address
repoHost = "192.168.0.1:23280"
// harborµÄÕ˺ÅÃÜÂëÐÅÏ¢£¬ÔÚjenkinsÖÐÅäÖÃÓû§Ãû

/ÃÜÂëÐÎʽµÄÈÏÖ¤ÐÅÏ¢£¬ÃüÃû³Éharbor¼´¿É
harborCreds = credentials('harbor')
// filebeatµÄ¾µÏñµØÖ·
filebeatImage="${repoHost}/common/filebeat:6.3.1"
// esµÄÄÚÍø·ÃÎʵØÖ·
es="elasticsearch-logging.kube-system:9200"
}
// ------ ÒÔÏÂÄÚÈÝÎÞÐèÐÞ¸Ä ------
stages {
// ¿ªÊ¼¹¹½¨Ç°Çå¿Õ¹¤×÷Ŀ¼
stage ("CleanWS"){
steps {
script {
try{
deleteDir()
}catch(err){
echo "${err}"
sh 'exit 1'
}
}
}
}
// À­È¡
stage ("CheckOut"){
steps {
script {
try{
checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], doGenerateSubmoduleConfigurations:

false, extensions: [],

submoduleCfg: [], userRemoteConfigs: [[credentialsId:

'gitlab', url: "${git}"]]])
}catch(err){
echo "${err}"
sh 'exit 1'
}
}
}
}
// ¹¹½¨
stage ("Build"){
steps {
script {
try{
// 怬 harbor
sh "docker login -u ${harborCreds_USR} -p ${harborCreds_PSW}

${repoHost}"
sh "date +%Y%m%d%H%m%S > timestamp"
// ¾µÏñtagÓÃʱ¼ä´Á´ú±í
tag = readFile('timestamp').replace("\n", "").replace

("\r", "")
repoPath = "${repoHost}/${namespace}/${app}:${tag}"
// ¸ù¾Ý·ÖÖ§£¬½øÈë_deploy϶ÔÓ¦µÄ²»Í¬Îļþ¼Ð£¬Í¨¹ýdockerfile´ò°ü¾µÏñ
sh "cp _deploy/${branch}/* ./"
sh "docker login -u ${harborCreds_USR} -p ${harborCreds_PSW}

${repoHost}"
sh "docker build -t ${repoPath} ."
}catch(err){
echo "${err}"
sh 'exit 1'
}
}
}
}
// ¾µÏñÍÆË͵½harbor
stage ("Push"){
steps {
script {
try{
sh "docker push ${repoPath}"
}catch(err){
echo "${err}"
sh 'exit 1'
}
}
}
}
// ʹÓÃpipeline scriptÖи´ÖƵıäÁ¿Ìæ»»deployment.yaml

ÖеÄռλ±äÁ¿£¬Ö´ÐÐdeployment.yaml½øÐв¿Êð
stage ("Deploy"){
steps {
script {
try{
sh "sed -i 's|#namespace#|${namespace}|g' deployment

.yaml"
sh "sed -i 's|#app#|${app}|g' deployment.yaml"


sh "sed -i 's|#image#|${repoPath}|g' deployment.yaml"
sh "sed -i 's|#port#|${port}|g' deployment.yaml"
sh "sed -i 's|#host#|${host}|g' deployment.yaml"
sh "sed -i 's|#replicas#|${replicas}|g' deployment

.yaml"
sh "sed -i 's|#log#|${log}|g' deployment.yaml"
sh "sed -i 's|#filebeatImage#|${filebeatImage}|g' deployment.yaml"
sh "sed -i 's|#es#|${es}|g' deployment.yaml"
sh "sed -i 's|#redisImage#|${redisImage}|g' deployment.yaml"
sh "cat deployment.yaml"
sh "kubectl apply -f deployment.yaml"
}catch(err){
echo "${err}"
sh 'exit 1'
}
}
}
}
}
post {
// ʹÓö¤¶¤²å¼þ½øÐÐ֪ͨ
always {
script {
def msg = "¡¾${author}¡¿Äã°Ñ·þÎñÆ÷¸ã¹ÒÁË£¬

ÀÏÕ²º°Äã»Ø¼Ò¸ÄBUG£¡"
def imageUrl = "https://www.iconsdb.com/icons/

preview/red

/x-mark-3-xxl-2.png"
if (currentBuild.currentResult=="SUCCESS"){
imageUrl= "http://icons.iconarchive.com/icons/paomedia

/small-n-flat/1024/sign-check-icon-2.png"
msg ="¡¾${author}¡¿·¢²¼³É¹¦£¬¸ÉµÃ²»´í£¡"
}
dingTalk accessToken:"xxxx",message:"${msg}",imageUrl:"$

{imageUrl}",

messageUrl:"${BUILD_URL}"
}
}
}
}

·¢²¼Íê³Éºó£¬¿ÉÒԲο¼¡¶³ÖÐø¼¯³ÉCIʵʩָÄÏÈý¨Cjenkins¼¯³É²âÊÔ¡·£¬×ö³ÖÐø²âÊÔ£¬²âÊÔ½á¹ûÒ²¿Éͨ¹ý¶¤¶¤Í¨Öª¡£×îºóÎÒÃÇÀûÓÃ×Ô½¨µÄÔËάƽ̨£¬¼à¿Ø°¢ÀïÔÆECS״̬¡¢K8S¸÷×é¼þ״̬¡¢¼à¿ØESÖеÄÈÕÖ¾²¢×öÒ쳣ץȡºÍ±¨¾¯¡£ÐγÉÒ»ÕûÌ×DevOpsģʽ¡£

×ÛÉÏ£¬¶ÔÓÚÿ¸öÏîÄ¿£¬ÎÒÃÇÖ»Ðèά»¤Dockerfile£¬²¢ÔÚJenkins´´½¨³ÖÐø¼¯³ÉÏîĿʱ£¬ÌîдÏîÄ¿ËùÐèµÄ²ÎÊý±äÁ¿¡£½ø½×Çé¿öÏ£¬Ò²¿É¶¨ÖÆÐÔµÄÐÞ¸ÄdeploymentÎļþÓëpipeline script£¬Âú×㲻ͬµÄÒµÎñÐèÒª¡£ÖÁ´Ë£¬Íê½á£¬Èö»¨£¡

   
10570 ´Îä¯ÀÀ       19
Ïà¹ØÎÄÕÂ

DevOpsתÐÍÈÚÈëµ½ÆóÒµÎÄ»¯
DevOps ÄÜÁ¦Ä£ÐÍ¡¢Ñݽø¼°°¸ÀýÆÊÎö
»ùÓÚ DevOps ÀíÄîµÄ˽ÓÐ PaaS ƽ̨ʵ¼ù
΢Èí¿ª·¢ÍŶӵÄDevOpsʵ¼ùÆôʾ
Ïà¹ØÎĵµ

DevOpsÇý¶¯Ó¦ÓÃÔËά±ä¸ïÓë´´ÐÂ
ÔËά¹ÜÀí¹æ»®
ÈçºÎʵÏÖÆóÒµÓ¦Óò¿Êð×Ô¶¯»¯
ÔËά×Ô¶¯»¯Êµ¼ù֮·
Ïà¹Ø¿Î³Ì

×Ô¶¯»¯ÔËά¹¤¾ß£¨»ùÓÚDevOps£©
»¥ÁªÍøÔËάÓëDevOps
MySQLÐÔÄÜÓÅ»¯¼°ÔËάÅàѵ
ITϵͳÔËά¹ÜÀí