jenkins gradle docker 持续集成

Posted by 小炒肉 on June 6, 2017

部署 jenkins

基于 jenkins 持续集成 自动打包 构建镜像 更新版本

初始化环境

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
# 安装 open-jdk

yum -y install java


# 安装 kubectl

yum install -y kubectl


# 拷贝 master 证书到 本机

证书文件一般在 /etc/kubernetes/ssl 下

需要拷贝的证书有

ca.pem
admin.pem
admin-key.pem


# 执行如下脚本 

vi master.sh

#!/bin/bash

KUBE_API_SERVER="https://master-api"
CERT_DIR=${CERT_DIR-"."}

kubectl config set-cluster default-cluster --server=${KUBE_API_SERVER} \
    --certificate-authority=${CERT_DIR}/ca.pem 

kubectl config set-credentials default-admin \
    --certificate-authority=${CERT_DIR}/ca.pem \
    --client-key=${CERT_DIR}/admin-key.pem \
    --client-certificate=${CERT_DIR}/admin.pem      

kubectl config set-context default-system --cluster=default-cluster --user=default-admin
kubectl config use-context default-system



# 注意修改 master api 地址
# 这里一定要切换 jenkins 用户,否则执行报错

su jenkins
sh master.sh





# 安装 docker 这里略过了

# 配置 jenkins 的 docker 权限

vim /etc/sudoers

## Allow root to run any commands anywhere 
root    ALL=(ALL)       ALL
jenkins ALL=(ALL)       ALL


# 加到 root 组里
usermod -aG docker jenkins


# 这里要注意,如果你之前安装了jenkins 修改以后要重启jenkins



安装 jenkins

1
2
3
4
5
6
7
8
9
10
# 导入 jenkins yum 源
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins.io/redhat-stable/jenkins.repo

# 导入 key
rpm --import http://pkg.jenkins.io/redhat-stable/jenkins.io.key


# 安装 jenkins
yum -y install jenkins

配置 jenkins

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 修改 默认目录

vi /etc/sysconfig/jenkins

JENKINS_HOME="/opt/jenkins"


# JVM 调优 (4G内存限制2G内存)

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Xms1024m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m"


# 创建 目录 

mkdir -p /opt/jenkins

# 授权

chown -R jenkins:jenkins /opt/jenkins

启动 服务

1
2
3
systemctl start jenkins
chkconfig jenkins on

访问测试

1
2
3
4
5
6
7
http://myip:8080/


# 查看初始化密码

cat /opt/jenkins/secrets/initialAdminPassword
8e082d8cd85e4207a148bf2429e32f59

配置 用户密钥

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
# 打开 jenkins 用户 bash

vi /etc/passwd

jenkins 用户  

/var/lib/jenkins 修改为 /home/jenkins
/bin/false 修改为 /bin/bash


# 创建 home 目录

mkdir /home/jenkins

# 授权

chown -R jenkins:jenkins /home/jenkins

#  切换用户
su jenkins



# 生成key
ssh-keygen -t rsa -b 4096 -C "[email protected]"


# 查看 公钥
cat /home/jenkins/.ssh/id_rsa.pub

添加 Credentials

1
2
3
4
5
6
7
8
9
10
11
# 登陆 web ui --> Credentials --> System
  --> Global Credentials --> Add Credentials

Kind: SSH Username with private key
    Scope: Global(Jenkins, nodes, items, all child tiems, etc)
    Username: jenkins-git
    Private Key: Form the Jenkins master ~/.ssh
    Passphrase: 
    ID: 
    Decription: jenins-git
    

添加 插件

1
2
3
4
5
6
7
8
9
10
# 登陆 web ui -->  系统管理 --> 插件管理


1. Pipeline
2. Gradle Plugin
3. Git plugin
4. Build WIth Parameters    (构建 输入参数的插件)
5. Email Extension Plugin   (邮件 发送 插件)
6. Multiple SCMs Plugin   (多 git 版本库 同时构建)
7. Git Parameter Plug-In  ( git 分支 构建选择)

配置 全局组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 登陆 web ui --> 系统管理 --> Global Tool Configuration

JDK: (新增JDK)
    JDK: orace-jdk-8
    JAVA_HOME: /usr/java/jdk1.8.0_131/

Git: 
   Name: git-1.8.3
   Path to Git executable: /usr/bin/git
 
   
 Gradle:
    Name: gradle-2.5
    GRADLE_HOME: /opt/gradle
   
Docker:
    Name: docker-1.13.1
    Installation root: /opt/docker      (docker info |grep Root)

配置插件

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
# 登陆 web ui --> 系统管理 --> 系统设置

Extended E-mail Notification: (没有标注 表示为空)

# SMTP server: 
xxxx.mail.com

# Default Content Type: 
HTML(text/html)

# Default Subject: 
Default Subject =  构建通知:$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!

# Default Content: 
<b style="font-size:12px">(本邮件是程序自动下发的,请勿回复,<span style="color:red">请相关人员fix it,重新提交到git 构建</span>)<br></b><hr>
<b style="font-size: 12px;">项目名称:$PROJECT_NAME<br></b><hr>
<b style="font-size: 12px;">构建编号:$BUILD_NUMBER<br></b><hr>
<b style="font-size: 12px;">GIT版本号:${GIT_REVISION}<br></b><hr>
<b style="font-size: 12px;">构建状态:$BUILD_STATUS<br></b><hr>
<b style="font-size: 12px;">触发原因:${CAUSE}<br></b><hr>
<b style="font-size: 12px;">构建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console</a><br></b><hr>
<b style="font-size: 12px;">构建地址:<a href="$BUILD_URL">$BUILD_URL</a><br></b><hr>
<b style="font-size: 12px;">变更集:${JELLY_SCRIPT,template="html"}<br></b><hr>


Default Triggers:
Failure - Any 
Success

创建项目

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
# 创建一个 自由风格 项目

Enter an item name:
java test



General:
参数化构建过程 --> 添加参数 --> String Parameter:
# 这里定义一个 参数,用来选择打包的项目,因为我这边一个项目下有多个war包,这里我是用 gradle 构建项目的,其他工具可以自行处理。

名字: models

默认值:(这里取settings.gradle 中的 include, 如下只是测试,只做参考) 
"java_1","java_2"

描述:
填写需要打包的项目
格式为: "项目名称"   多个项目以, 号隔开
如:  "java_1"    或者 "java_1","java_2" 


参数化构建过程  --> 添加参数 --> Git Parameter:

Name: 
    tag
Parameter Type:
    Branch or Tag




# 源码管理 ( 这里需要填写上面参数化构建 Git Parameter 名称)
  Git:

Branches to build
    Branch Specitfier (blank for 'any'):
            $Tag


# 构建
1
2
3
4
1. 选择一个 Execute shell
  Command: (这里是设置选择构建项目,因为有时候一个git版本库下有多个项目,需要分开来构建)
  sed -i '/include*/d' ${WORKSPACE}/settings.gradle
  echo "include $models" >> ${WORKSPACE}/settings.gradle
1
2
3
4
5
2. 选择Invoke Gradle Script
  Gradle Version:
    gradle-2.5
    
  Tasks:  clean war --stacktrace --debug
1
2
3
4
3. Execute Shell
  Command:
    mv ${WORKSPACE}/java_*/build/libs/*.war /opt/jenkins/war/
    ls -lt /opt/jenkins/war/
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
4. Execute Shell
  Command:
  
  
#!/bin/sh

set -e

war_home=/opt/jenkins/war

date=`date +%y%m%d%M`

cd $war_home

rm -rf dockerfile

for war in $(ls);do

cat > dockerfile << EOF

FROM service/tomcat

add $war /opt/htdocs/webapp/

EOF

echo ">>> cat dockerfile <<<"

cat dockerfile

img_name="$war|sed -e 's/\.war//g;s/_/-/g'"

image_name=$(eval echo $img_name)

# echo $image_name

docker build -t="job/$image_name:$date" .

docker push job/$image_name:$date

done

docker images |grep "$date"

1
2
3
4
5. Execute Shell
  Command:
    rm -rf /opt/jenkins/war/*

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 构建后操作 (这里只写需要更改的)

Editable Email Notification:

Content Type: 
    HTML (text/html)

# 点击下面的 Advanced Settings..
Triggers:
    Failure - Any
        高级...
            Recipient List:
                [email protected]
    
    Success
        高级...
            Recipient List:
                [email protected]