0%

Jenkins-邮件通知

默认自带邮件功能

  1. 配置系统管理员邮件地址

  2. 配置邮件通知,并发送测试邮件

  3. 查收邮件

  4. job中配置邮件通知

  5. 查看job日志

  6. 查收邮件

  7. 再将第四步中错误命令修复好,重新构建
  8. 查看job日志

  9. 查收恢复邮件

使用Email-ext插件

Email-ext+plugin

  1. 安装插件

    可以通过系统管理→管理插件→可选插件,选择Email Extension插件进行安装:

  2. 配置发件人账号密码,smtp服务器地址,端口

  3. 配置邮件文本类型,模板内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <hr/>
    (本邮件是程序自动下发,请勿回复!)<br/><hr/>

    Jenkins地址: $HUDSON_URL<br/><hr/>

    项目名称: $PROJECT_NAME<br/><hr/>

    构建编号: $BUILD_NUMBER<br/><hr/>

    构建状态: $BUILD_STATUS<br/><hr/>

    触发原因: ${CAUSE}<br/><hr/>

    构建日志地址: <a href="${BUILD_URL}console">${BUILD_URL}console</a><br/><hr/>

    构建地址: <a href="$BUILD_URL">$BUILD_URL</a><br/><hr/>

    变更集: ${JELLY_SCRIPT,template="html"}<br/><hr/>
  4. 配置发送规则

  5. 开启邮件通知

    增加构建后操作步骤,选择Editable Email Notifiation

  6. 配置收件人、抄送人、是否发送附件(构建日志)等

  7. 查看job日志

  8. 查收邮件

配置Jenkins URL

配置域名解析

添加Nginx解析

nginx配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
server {
listen 80;
server_name jenkins.visualchina.com;
location / {
rewrite ^/(.*)$ http://jenkins.visualchina.com/jenkins;
}
location /jenkins {
proxy_pass http://127.0.0.1:8080/jenkins;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
}

}

server {
listen 443 ssl;
server_name jenkins.visualchina.com;
access_log /var/log/nginx/jenkins.visualchina.com main;
error_log /var/log/nginx/jenkins.visualchina.com.error.log;

ssl on; #ssl功能开启
ssl_certificate sslfile/visualchina.pem; #证书路径
ssl_certificate_key sslfile/visualchina.key;


location / {
rewrite ^/(.*)$ http://jenkins.visualchina.com/jenkins;
}
location /jenkins {
proxy_pass http://127.0.0.1:8080/jenkins;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
}
}

插件安装

Web控制台安装
  1. 进入“插件管理”界面

  2. 搜索插件名称

  3. 勾选插件,选择直接安装

  4. 安装完成。(部分插件安装后需重启,勾选重启Jenkins选项即可。)

上传插件

公司以前使用Swarm管理Docker容器,用到aliyun-container-service-deploy的jenkins插件更新应用

  1. 到清华源下载插件

    https://mirror.tuna.tsinghua.edu.cn/jenkins/plugins/aliyun-container-service-deploy/latest/

  2. 上传插件

  3. 等待安装

Jenkins-Pipeline

Jenkins Pipeline总体介绍

  • Pipeline,简而言之,就是一台运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。
  • Pipeline是Jenkins2.X最核心的特性,帮助Jenkins实现从CI到CD与DevOps的转变。
  • 详细介绍可见https://jenkins.io/2.0

Jenkins Pipeline

  • Jenkins Pipeline是一组插件,让Jenkins可以实现持续交付管道的落地和实施。
  • 持续交付管道(CD Pipeline)是将软件从版本控制阶段到交付给用户或客户完整过程的自动化表现
  • Pipeline提供了一组可扩展的工具,通过Pipeline Domain Specific Language(DSL)syntax可以达到Pipeline as Code的目的
  • Pipeline as Code: Jenkinsfile 存储在项目的源代码库

核心概念

  • Node

    Jenkins节点,或是Master,或是Agent,是执行Step的具体运行环境

  • Stage

    阶段,一个Pipeline可以划分为若干个Stage,每个Stage代表一组操作,如:“Build”,“Test”, “Deploy”。

    注意,Stage是一个逻辑分组的概念,可以跨多个Node。

  • step

    步骤,Step是 最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类 Jenkins Plugin提供,例如:sh ‘make’

Pipeline特性

  • 代码(Code): Pipeline以代码的形式实现,通常被检入源代码控制,是团队能够编辑,审查 和迭代其CD流程。
  • 可持续性(Durable):Jenkins重启或者中断后都不会影响Pipeline Job。
  • 可停顿(Pausable):Pipeline可以选择停止并等待人工输入或者批准,然后再继续Pipeline运行。
  • 多功能(Versatile):Pipeline支持实现现实世界的复杂CD要求,包括fork/join子进程,循环和并行执行工作的能力。
  • 可拓展(Extensible):Pipeline插件支持其DSL的自定义扩展及与其他插件集成的多个选 项。

语法

官网文档:https://jenkins.io/doc/book/pipeline/syntax/

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
pipeline {
agent any
options {
timestamps()
}
environment {
TimeStamp="${currentBuild.startTimeInMillis}"
Service="${JOB_BASE_NAME}"
Branch="${env.gitlabTargetBranch}"
}
parameters {
choice(name: 'Action',choices: '程序发版\n程序回滚',description: '请选择操作')
choice(name: 'Scope',choices: '测试环境\n预发环境\n生产环境\n灾备环境',description: '请选择部署环境')
string(name: 'JenkinsApi', defaultValue: 'false', description: '是否是JenkinsAPI触发')
string(name: 'BranchOrTag', defaultValue: '', description: '指定分支或tag发版')
}
stages {
stage('PrintEnv') {
steps {
sh "printenv"
}
}
stage('Check Out') {
when {
anyOf {
environment name: 'Branch',value:'master';
environment name: 'Branch',value:'test';
environment name: 'Scope',value:'测试环境';
environment name: 'Scope',value:'预发环境';
environment name: 'Scope',value:'灾备环境'
}
}
steps {
sh "sh jenkins.sh 'CheckOut' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${BranchOrTag}'"
}
}
stage('Build Package') {
when {
anyOf {
environment name: 'Branch',value:'master';
environment name: 'Branch',value:'test';
environment name: 'Scope',value:'测试环境';
environment name: 'Scope',value:'预发环境';
environment name: 'Scope',value:'灾备环境'
}
}
steps {
sh "sh jenkins.sh 'BuildPackage' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}'"
}
}
stage('Build Dockerfile') {
when {
anyOf {
environment name: 'Branch',value:'master';
environment name: 'Branch',value:'test';
environment name: 'Scope',value:'测试环境';
environment name: 'Scope',value:'预发环境';
environment name: 'Scope',value:'生产环境';
environment name: 'Scope',value:'灾备环境'
}
}
steps {
sh "sh jenkins.sh 'BuildDockerfile' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}'"
}
}
stage('Build K8S Yaml') {
when {
anyOf {
environment name: 'Branch',value:'master';
environment name: 'Branch',value:'test';
environment name: 'Scope',value:'测试环境';
environment name: 'Scope',value:'预发环境';
environment name: 'Scope',value:'生产环境';
environment name: 'Scope',value:'灾备环境'
}
}
steps {
sh "sh jenkins.sh 'BuildK8SYaml' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${env.Action}'"
}
}
stage('Deploy') {
steps {
script {
if ("${Scope}" == "测试环境") {
echo "测试环境发版"
sh "sh jenkins.sh 'DockerBuildPush' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${env.Action}'"
sh "sh jenkins.sh 'Deploy' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}'"
}
if ("${Scope}" == "预发环境") {
echo "预发环境发版"
sh "sh jenkins.sh 'DockerBuildPush' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${env.Action}'"
sh "sh jenkins.sh 'Deploy' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}'"
}
if ("${Scope}" == "灾备环境") {
echo "灾备环境发版"
sh "sh jenkins.sh 'DockerBuildPush' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${env.Action}'"
sh "sh jenkins.sh 'Deploy' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}'"
}
if ("${Scope}" == "生产环境") {
script {
if ("${JenkinsApi}" == "true") {
sh "sh jenkins.sh 'DockerBuildPush' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${env.Action}'"
sh "sh jenkins.sh 'Deploy' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}'"
}
else {
script {
if ("${env.Action}" == "程序回滚") {
echo "生产环境回滚,等待领导确认"
script {
input message: "请确认是否回滚 ${Scope}: ",ok : '确认',submitter: "admin"
}
echo '已确认,即将回滚'
sh "sh jenkins.sh 'Deploy' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${env.Action}'"
}
else {
echo "生产环境发版,等待领导确认"
script {
input message: "请确认是否部署 ${Scope}: ",ok : '确认',submitter: "admin"
}
echo '已确认,即将发布'
sh "sh jenkins.sh 'DockerBuildPush' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${env.Action}'"
sh "sh jenkins.sh 'Deploy' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}'"
}
}
}
}
}
}
}
}
}
}

Jenkins-创建freestyle风格项目

创建第一个Job

  1. 新建Item

  2. 输入名称、选择Job类型

  3. 配置Job,

    共六部分:通用源码管理构建触发器构建环境构建构建后操作

    常用操作:

    通用:配置参数话构建

    源码管理:配置代码仓库地址(git或svn)

    构建触发器:配置GitLab的webhook自动触发

    构建环境:Delete workspace before build starts

    构建:shell脚本或者bat脚本执行任务

    构建后操作:邮件通知

  4. 参数化构建

  5. Git地址

  6. 触发器

  7. 构建-shell脚本

  8. 保存退出

  9. 构建

  10. 查看构建状态

  11. 查看构建日志

实战分享

需求:
  1. 项目名称为vdam-web-vip
  2. 此job会根据环境不同确定git分支
  3. git clone后编译安装nodejs模块
  4. 构建docker镜像,push到镜像仓库
  5. 触发应用更新
部署:
  1. 创建自由风格项目

  2. 名称输入vdam-web-vip

  3. 开启参数化构建

  4. 配置构建shell

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    set -e

    ## 确定 default.conf 和 nginx.conf文件存在

    Time=`date +%Y%m%d%H%M%S`
    WorkDir=`pwd`

    if [[ ${Scope} == "测试环境" ]]; then
    Branch="release"
    ScopeName="test"
    JavaServiceDomain="test-vdam-gateway-service.fotomore.com"
    fi
    if [[ ${Scope} == "预发环境" ]]; then
    Branch="master"
    ScopeName="pre"
    JavaServiceDomain="vdam-gateway-service1.fotomore.com"
    fi
    if [[ ${Scope} == "生产环境" ]]; then
    Branch="master"
    ScopeName="pro"
    JavaServiceDomain="vdam-gateway-service.fotomore.com"
    fi

    rm -rf vdam-web
    mkdir -p vdam-web
    cd vdam-web
    git clone -b ${Branch} git@git.vcg.com:vdam/vue-vip-2019.git
    git clone -b ${Branch} git@git.vcg.com:vdam/vue-admin.git
    git clone -b ${Branch} git@git.vcg.com:vdam/vue-saas.git
    git clone -b ${Branch} git@git.visualchina.com:vdam/vue-vip-upload.git

    cd vue-vip-upload
    sed -i "s/vdam-gateway.vcg.com/$JavaServiceDomain/g" setBaseUrl.ts
    sed -i "s/vdam-gateway-service.fotomore.com/$JavaServiceDomain/g" setBaseUrl.ts
    sed -i "s/vdam-gateway.fotomore.com/$JavaServiceDomain/g" setBaseUrl.ts
    sed -i "s/vdam-gateway-service.caf79ccb624f24a5cabd1de8623b2e617.cn-beijing.alicontainer.com/$JavaServiceDomain/g" setBaseUrl.ts

    npm install --registry https://registry.npm.taobao.org
    npm run build
    mv dist ../
    cd ..
    mv dist upload

    cd vue-vip-2019
    sed -i "s/vdam-gateway.vcg.com/$JavaServiceDomain/g" setBaseUrl.ts
    sed -i "s/vdam-gateway-service.fotomore.com/$JavaServiceDomain/g" setBaseUrl.ts
    sed -i "s/vdam-gateway.fotomore.com/$JavaServiceDomain/g" setBaseUrl.ts
    sed -i "s/vdam-gateway-service.caf79ccb624f24a5cabd1de8623b2e617.cn-beijing.alicontainer.com/$JavaServiceDomain/g" setBaseUrl.ts

    npm install --registry https://registry.npm.taobao.org
    npm run build
    mv dist ../
    cd ..
    mv dist vip

    cd vue-admin
    sed -i "s/vdam-gateway.vcg.com/$JavaServiceDomain/g" src/config/index.js
    sed -i "s/vdam-gateway-service.fotomore.com/$JavaServiceDomain/g" src/config/index.js
    sed -i "s/vdam-gateway.fotomore.com/$JavaServiceDomain/g" src/config/index.js
    sed -i "s/vdam-gateway-service.caf79ccb624f24a5cabd1de8623b2e617.cn-beijing.alicontainer.com/$JavaServiceDomain/g" src/config/index.js

    npm install --registry https://registry.npm.taobao.org
    npm run build
    mv dist ../
    cd ..
    mv dist admin

    cd vue-saas
    sed -i "s/test-vdam.gateway.vcg.com/$JavaServiceDomain/g" src/config/index.js
    sed -i "s/vdam-gateway.vcg.com/$JavaServiceDomain/g" src/config/index.js
    sed -i "s/vdam-gateway-service.fotomore.com/$JavaServiceDomain/g" src/config/index.js
    sed -i "s/vdam-gateway.fotomore.com/$JavaServiceDomain/g" src/config/index.js
    sed -i "s/vdam-gateway-service.caf79ccb624f24a5cabd1de8623b2e617.cn-beijing.alicontainer.com/$JavaServiceDomain/g" src/config/index.js

    npm install --registry https://registry.npm.taobao.org
    npm run build
    mv dist ../
    cd ..
    mv dist saas

    rm -rf vue-vip
    rm -rf vue-admin
    rm -rf vue-saas

    cd ..

    tar zcf vdam-web-vip.tar.gz vdam-web/

    # cp vdam-web-vip.tar.gz /jenkins/vcgapp/vdam-web-vip/vdam-web-vip.tar.gz-${Time}

    cat > Dockerfile <<EOF
    FROM nginx
    MAINTAINER hongye.zhao@vcg.com
    ADD vdam-web-vip.tar.gz /usr/share/nginx/html/
    ADD nginx.conf /etc/nginx/nginx.conf
    ADD default.conf /etc/nginx/conf.d/
    RUN chmod -R 777 /usr/share/nginx/html/
    EOF

    docker build -t registry-vpc.cn-beijing.aliyuncs.com/vcg/vdam-web-vips:${ScopeName} .
    docker build -t registry-vpc.cn-beijing.aliyuncs.com/vcg/vdam-web-vips:${ScopeName}-$Time .
    docker push registry-vpc.cn-beijing.aliyuncs.com/vcg/vdam-web-vips:${ScopeName}
    docker push registry-vpc.cn-beijing.aliyuncs.com/vcg/vdam-web-vips:${ScopeName}-$Time
    docker rmi -f registry-vpc.cn-beijing.aliyuncs.com/vcg/vdam-web-vips:${ScopeName}
    docker rmi -f registry-vpc.cn-beijing.aliyuncs.com/vcg/vdam-web-vips:${ScopeName}-$Time

    if [[ ${Scope} == "测试环境" ]]; then
    curl https://cs.console.aliyun.com/hook/trigger?token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbHVzdGVySWQiOiJjYWY3OWNjYjYyNGYyNGE1Y2FiZDFkZTg2MjNiMmU2MTciLCJpZCI6IjM5NTI2In0.S9KkUgPkymqsc1xclUHFo9zFyd_iLMrKxxEbsPB06lajpw_YSm7aOXAonq_olgP0SxmL6ydiDE5Bu3LuAXjhMCkojXQx4FlnH8uoaBOr2fT9e_RL-4LCGSQLDvoOFqQQ1csBfPi2UpT6oDh_KkxvaYoF7kqvTmpClF2XQO9X9f4
    #curl https://cs.console.aliyun.com/hook/trigger?token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbHVzdGVySWQiOiJjYWY3OWNjYjYyNGYyNGE1Y2FiZDFkZTg2MjNiMmU2MTciLCJpZCI6IjMyNzQ0In0.afM-iP1cZUVBDdIefzca6SJyIfFBPO3hqcC0HgrJPcaQLkvmFQYuHAgF6OHKgdHLa0rErRvcKgq1t_6g4DhBiql5EN9qQYAiAKEwXTpfc-0tiNfZg4w2Z4mybg-MeiduZCD0Reh1hUy-jdNNg58poR-IeKJZRhT3IlmfIp4Ssis
    fi
    if [[ ${Scope} == "预发环境" ]]; then
    curl https://cs.console.aliyun.com/hook/trigger?token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbHVzdGVySWQiOiJjMmFiNDFlZWE0YjgxNDNlZmEwMzg3OWZiNDlhOWEyODIiLCJpZCI6IjM5NTI1In0.nwNJTY-9jPhbnVe1_4fTUuCXPd5JlkRlvGgQC8GD-u1qBqsousj8wsO65s6xhksW0h1PBPVnTn8QelwgCLMLyIvN8Pv_H7uB2x4tGHudZHjrPxKURgU6cwH4SnXhd3VYOdfd-Qc3sMKAe9aG_HoKwQoC2Zj2yT3kTQEB7j7Mlv0
    #curl https://cs.console.aliyun.com/hook/trigger?token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbHVzdGVySWQiOiJjMmFiNDFlZWE0YjgxNDNlZmEwMzg3OWZiNDlhOWEyODIiLCJpZCI6IjM3MDcyIn0.Dxx3lVTAysaRBtI6jcDLMm0M0Yh239eUznxq4dpUIIjhDsKLlgtN-UJt0TIBOmAucj8XnBjI_T-mX7hy6WrHH8bKREyMz6cWrGutfBQqNYQ2j-HyScP-Q8tsqO1q4XZuuS9__BB2-mDoN0xqqFUAAITkDkmw702rfRpbIolvNu4
    fi
    if [[ ${Scope} == "生产环境" ]]; then
    echo ""
    curl https://cs.console.aliyun.com/hook/trigger?token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbHVzdGVySWQiOiJjNDY0MTNjYjEzYmIzNDkwZGEzZTQ5NWU0MjY0ZjZkMTkiLCJpZCI6IjM3MTkzIn0.HJfnm1ujwLRYnQpsRpiXLErKi2gE_glnZBcss9c2zmHGv-_Gcl6vYLRPdmnPpvcU2cVkuKgExHUUFGdNqzkKDEeFu8lBez9c2gCWi7l81KNAFhsgtTIEm8YRpi9p92kIsutjD_AEj6UuY_jy58nvIWGeXRtuYAaWJGXFQ6B5ItE
    fi

  5. 保存退出

  6. 参数化构建

  7. 验证ok

Jenkins-安装

官方安装文档

安装部署:

  1. jdk + war包
  2. jdk + tomcat + war包
  3. docker
JDK+War包
  1. 安装JDK

    源码安装:

    oracle官网获取JDK安装包,jdk-8u211-linux-x64.tar.gz,并上传到服务器。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 服务器软件目录  /data/vcg/

    # 1、解压
    tar zxf jdk-8u211-linux-x64.tar.gz
    # 2、配置环境变量 /etc/profile
    vim /etc/profile
    添加如下内容:
    #jdk
    export JAVA_HOME=/data/vcg/jdk1.8.0_211
    export CLASSPATH=.:$JAVA_HOME/jar/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$JAVA_HOME/bin:$PATH
    # 3、重新加载配置文件
    source /etc/profile
    # 4、验证
    java -version

    YUM安装

    1
    yum install -y java-1.8.0-openjdk.x86_64
  2. 获取Jenkins war包

    Jenkins官网获取下载链接,或直接下载程序包,然后scp上传到服务器待用。

    1
    wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.176.1/jenkins.war
  3. 启动Jenkins

    1
    java -jar jenkins.war
    1
    2
    后台启动:
    nohup java -jar jenkins.war &
  4. 访问ip:8080/jenkins

JDK+Tomcat+War包
  1. 安装JDK
    1
    yum install -y java-1.8.0-openjdk.x86_64
  2. 安装Tomcat

    apache官网获取Tomcat安装包,apache-tomcat-8.5.42.tar.gz,并上传到服务器。

    1
    2
    3
    4
    5
    6
    7
    8
    # 服务器软件目录  /data/vcg/

    # wget
    wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.42/bin/apache-tomcat-8.5.42.tar.gz
    # 解压
    tar zxf apache-tomcat-8.5.42.tar.gz
    # 重命名
    mv apache-tomcat-8.5.42 tomcat
  3. 获取Jenkins war包

    1
    wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.176.1/jenkins.war
  4. 将Jenkins war包放到tomcat下

    1
    cp jenkins.war /data/vcg/tomcat/webapps
  5. 启动tomcat

    1
    sh /data/vcg/tomcat/bin/startup.sh
  6. 访问ip:8080/jenkins

Docker
1
2
3
4
5
6
7
8
9
docker run \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean

配置Jenkins

  1. 解锁

    jenkins1

  2. 安装插件

    jenkins2

    jenkins3

    等待插件安装————————

  3. 创建管理员用户

    一般选择 “使用admin账号继续”

    jenkins4

  4. 安装完成

    jenkins5

重置管理员密码

默认admin密码保存在.jenkins/secrets/initialAdminPassword

登录jenkins后,在“用户列表”—>”admin”—>”设置”的配置页中,找到Password配置项,输入新的密码后保存即可。

jenkins6

需求

研发需要找老代码,找到备份文件后恢复时报错版本过低

操作

  1. 下载安装包
    https://packages.gitlab.com/gitlab/gitlab-ce
    找到对应的版本,下载到服务器
  2. 安装

    1
    rpm -ivh gitlab-ce-8.6.6-ce.0.el7.x86_64.rpm
  3. 恢复数据

    1
    gitlab-rake gitlab:backup:restore RAILS_ENV=production BACKUP=1561606164

需求:

  1. 升级linux内核版本,修复SACK Panic”远程DoS漏洞
  2. 安装nscd,提升RDS响应速度

说明:

漏洞描述:

Linux 以及 FreeBSD 等系统内核上存在严重远程DoS漏洞,攻击者可利用该漏洞构造并发送特定的 SACK 序列请求到目标服务器导致服务器崩溃或拒绝服务。

目前已知受影响版本如下:
• FreeBSD 12(使用到 RACK TCP 协议栈)
• CentOS 5(Redhat 官方已停止支持,不再提供补丁)
• CentOS 6
• CentOS 7
• Ubuntu 18.04 LTS
• Ubuntu 16.04 LTS
• Ubuntu 19.04
• Ubuntu 18.10
各大Linux发行厂商已发布内核修复补丁,详细内核修复版本如下:
• CentOS 6 :2.6.32-754.15.3
• CentOS 7 :3.10.0-957.21.3
• Ubuntu 18.04 LTS :4.15.0-52.56
• Ubuntu 16.04 LTS:4.4.0-151.178

修复建议:
➤【CentOS 6/7 系列用户】
注:截止文章发布,CentOS官方暂未同步内核修复补丁到软件源,建议用户及时关注补丁更新情况并开展相应升级工作。升级方式如下:

  1. yum clean all && yum makecache,进行软件源更新;
  2. yum update kernel -y,更新当前内核版本;
  3. reboot,更新后重启系统生效;
  4. uname -a,检查当前版本是否为上述【安全版本】,如果是,则说明修复成功。

➤【Ubuntu 16.06/18.04 LTS 系列用户】

  1. sudo apt-get update && sudo apt-get install linux-image-generic,进行软件源更新并安装最新内核版本;
  2. sudo reboot,更新后重启系统生效;
  3. uname -a,检查当前版本是否为【安全版本】,如果是,则说明修复成功。
    如果用户不方便重启进行内核补丁更新,可选择临时缓解方案:
    运行如下命令禁用内核 SACK 配置防范漏洞利用:
    sysctl -w net.ipv4.tcp_sack=0
NSCD服务:

https://help.aliyun.com/knowledge_detail/41806.html

NSCD(Name Service Cache Daemon)是一种能够缓存passwd、group、hosts的本地缓存服务。若您使用短连接的方式连接RDS,请在与RDS相连的ECS实例上进行如下操作开启NSCD,提升RDS响应速度。

思路:

  1. 编写Shell脚本
  2. Ansible分发脚本
  3. Ansible执行脚本
  4. 验证脚本执行情况
  5. 分批重启主机

实现:

Shell脚本:
1
2
3
4
5
6
7
vim /data/vcg/zhy/ansible/0623.sh

yum clean all && yum makecache
yum update -y # 或者 yum update kernel -y
yum install -y nscd
systemctl enable nscd.service
echo "options timeout:1 attempts:1" >> /etc/resolv.conf
分发脚本
1
ansible pre-k8s -m copy -a "src=/data/vcg/zhy/ansible/0623.sh dest=/tmp/0623.sh mode=755"
执行脚本
1
ansible pre-k8s -m shell -a "/tmp/0623.sh"
验证脚本执行情况
1
ansible pre-k8s -m shell -a "cat /etc/resolv.conf |grep options"
分批重启主机
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#脚本内容:
hosts="
172.20.21.249
172.20.21.250
172.20.21.251
172.20.21.252
172.20.21.253
172.20.21.254
172.20.21.255
172.20.22.0
172.20.22.1
172.20.22.2"
for i in $hosts;
do
ssh $i uptime
ssh $i reboot
sleep 2m
ssh $i uptime
done