±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚÔÆÉçÇø,±¾ÎĽ«Í¨¹ýʵ¼Ê°¸Àý´®ÁªËùÓеĻù´¡Èí¼þ·þÎñ£¬»ùÓÚ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£¬Âú×㲻ͬµÄÒµÎñÐèÒª¡£ÖÁ´Ë£¬Íê½á£¬Èö»¨£¡
|