Jenkins安装,发布PHP代码

CI/CD介绍

互联网软件的开发和发布,已经形成了一套标准流程,假如把开发工作流程分为以下几个阶段:

编码 → 构建 → 集成 → 测试 → 交付 → 部署

img

正如你在上图中看到,持续集成(Continuous Integration)、持续交付(Continuous Delivery)和持续部署(Continuous Deployment)有着不同的软件自动化交付周期。

持续集成(CI)

上面整个流程中最重要的组成部分就是持续集成(Continuous integration,简称CI)。

持续集成指的是,频繁地(一天多次)将代码集成到主干。将软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误。

它的好处主要有两个:

\1. 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易;

\2. 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。

img

持续集成并不能消除Bug,而是让它们非常容易发现和改正。持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。

持续交付

持续交付(Continuous delivery)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。

持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。

img

持续交付可以看作持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。

持续部署(CD)

持续部署(continuous deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。

持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。

持续部署的前提是能自动化完成测试、构建、部署等步骤。

img

总的来说,持续集成、持续交付、持续部署提供了一个优秀的 DevOps 环境。对于整个开发团队来说,能很大地提升开发效率,好处与挑战并行。无论如何,频繁部署、快速交付以及开发测试流程自动化都将成为未来软件工程的重要组成部分。

Jenkins介绍

Jenkins概念

Jenkins是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)的基于web界面的平台。允许持续集成和持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成。

官网:https://jenkins.io/

官方文档:https://jenkins.io/doc/

清华源下载(推荐):https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/

Jenkins特性:

开源的java语言开发持续集成工具,支持CI,CD;

易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理;

消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告;

分布式构建:支持Jenkins能够让多台计算机一起构建/测试;

文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等;

丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等。

Jenkins安装

安装最低配置:不少于256M内存,不低于1G磁盘,JDK版本>=8(openjdk也可以)。

根据公司需求,安装合适的稳定版jenkins。安装方式有很多种,yum、rpm、war等

环境:

role:jenkins服务器

hostname:jinkai01 ip:192.168.186.140

role:部署机器

hostname:jinkai02 ip:192.168.186.141

安装jenkins:

jenkins家目录,存放所以数据``

/var/lib/jenkins  

jenkins的安装目录,war包存放在这里``

/usr/lib/jenkins

主配置文件``

/etc/sysconfig/jenkins 

日志文件``

/var/`log`/jenkins/jenkins.log

安装openjdk,jenkins基于java开发

img

[root@jinkai01 ~]# yum install -y java-1.8.0-openjdk

wget -O 下载文件并以指定的文件名保存

[root@jinkai01 ~]# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo

[root@jinkai01 ~]# cat /etc/yum.repos.d/jenkins.repo

[jenkins]

name=Jenkins

baseurl=http://pkg.jenkins.io/redhat

gpgcheck=1 //1会检测,所以下面安装了key

安装jenkins key

rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key

[root@jinkai01 ~]# yum install -y jenkins

启动jenkins:

[root@jinkai01 ~]#systemctl start jenkins

查看启动后jenkins进程是否存在

[root@jinkai01 ~]#ps aux |grep jenkins

查看jenkins日志,截取部分

[root@jinkai01 ~]#less /var/log/jenkins/jenkins.log

Jenkins initial setup is required. An admin user has been created and a password generated.

Please use the following password to proceed to installation:

5efd1d813a5a44de96d4abb8b062e0b6 // admin密码,初始化安装时会用到

This may also be found at:

/var/lib/jenkins/secrets/initialAdminPassword #admin密码也可以在这里查到

[root@jinkai01 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword

5efd1d813a5a44de96d4abb8b062e0b6

访问安装

打开浏览器,访问ip:8080进行安装,ip为服务器ip

提示需要输入管理员密码,输入5efd1d813a5a44de96d4abb8b062e0b6(上面查到的admin密码),点击继续,会初始化一小段时间

img

这里我选择安装推荐的插件

img

这里就已经开始在安装插件,我们等它安装完就好了。

img

上面等插件安装完后,就进入到下面界面,提示要创建第一个albert用户,并设置用户名密码

img

点击保存并完成

img

提示配置jenkins URL,这里保持默认即可,继续点击保存并完成

img

提示jenkins已经就绪,开始使用jenkins

img

查看jenkins的配置文件:

[root@jinkai01 ~]# cat /etc/sysconfig/jenkins

查看jenkins的配置文件,定义了home、JAVA_CMD、user、port等基础配置,保持默认即可

## Path: Development/Jenkins

## Description: Jenkins Automation Server

## Type: string

## Default: "/var/lib/jenkins"

## ServiceRestart: jenkins

#

# Directory where Jenkins store its configuration and working

# files (checkouts, build reports, artifacts, ...).

#

JENKINS_HOME="/var/lib/jenkins"

## Type: string

## Default: ""

## ServiceRestart: jenkins

#

# Java executable to run Jenkins

# When left empty, we'll try to find the suitable Java.

#

JENKINS_JAVA_CMD=""

## Type: string

## Default: "jenkins"

## ServiceRestart: jenkins

#

# Unix user account that runs the Jenkins daemon

# Be careful when you change this, as you need to update

# permissions of $JENKINS_HOME and /var/log/jenkins.

#

JENKINS_USER="jenkins"

## Type: string

## Default: "false"

## ServiceRestart: jenkins

#

# Whether to skip potentially long-running chown at the

# $JENKINS_HOME location. Do not enable this, "true", unless

# you know what you're doing. See JENKINS-23273.

#

#JENKINS_INSTALL_SKIP_CHOWN="false"

## Type: string

## Default: "-Djava.awt.headless=true"

## ServiceRestart: jenkins

#

# Options to pass to java when running Jenkins.

#

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"

## Type: integer(0:65535)

## Default: 8080

## ServiceRestart: jenkins

#

# Port Jenkins is listening on.

# Set to -1 to disable

#

JENKINS_PORT="8080"

## Type: string

## Default: ""

## ServiceRestart: jenkins

#

# IP address Jenkins listens on for HTTP requests.

# Default is all interfaces (0.0.0.0).

#

JENKINS_LISTEN_ADDRESS=""

## Type: integer(0:65535)

## Default: ""

## ServiceRestart: jenkins

#

# HTTPS port Jenkins is listening on.

# Default is disabled.

#

JENKINS_HTTPS_PORT=""

## Type: string

## Default: ""

## ServiceRestart: jenkins

#

# Path to the keystore in JKS format (as created by the JDK 'keytool').

# Default is disabled.

#

JENKINS_HTTPS_KEYSTORE=""

## Type: string

## Default: ""

## ServiceRestart: jenkins

#

# Password to access the keystore defined in JENKINS_HTTPS_KEYSTORE.

# Default is disabled.

#

JENKINS_HTTPS_KEYSTORE_PASSWORD=""

## Type: string

## Default: ""

## ServiceRestart: jenkins

#

# IP address Jenkins listens on for HTTPS requests.

# Default is disabled.

#

JENKINS_HTTPS_LISTEN_ADDRESS=""

## Type: integer(0:65535)

## Default: ""

## ServiceRestart: jenkins

#

# HTTP2 port Jenkins is listening on.

# Default is disabled.

#

# Notice: HTTP2 support may require additional configuration, see Winstone

# documentation for more information.

#

JENKINS_HTTP2_PORT=""

## Type: string

## Default: ""

## ServiceRestart: jenkins

#

# IP address Jenkins listens on for HTTP2 requests.

# Default is disabled.

#

# Notice: HTTP2 support may require additional configuration, see Winstone

# documentation for more information.

#

JENKINS_HTTP2_LISTEN_ADDRESS=""

## Type: integer(1:9)

## Default: 5

## ServiceRestart: jenkins

#

# Debug level for logs -- the higher the value, the more verbose.

# 5 is INFO.

#

JENKINS_DEBUG_LEVEL="5"

## Type: yesno

## Default: no

## ServiceRestart: jenkins

#

# Whether to enable access logging or not.

#

JENKINS_ENABLE_ACCESS_LOG="no"

## Type: integer

## Default: 100

## ServiceRestart: jenkins

#

# Maximum number of HTTP worker threads.

#

JENKINS_HANDLER_MAX="100"

## Type: integer

## Default: 20

## ServiceRestart: jenkins

#

# Maximum number of idle HTTP worker threads.

#

JENKINS_HANDLER_IDLE="20"

## Type: string

## Default: ""

## ServiceRestart: jenkins

#

# Folder for additional jar files to add to the Jetty class loader.

# See Winstone documentation for more information.

# Default is disabled.

#

JENKINS_EXTRA_LIB_FOLDER=""

## Type: string

## Default: ""

## ServiceRestart: jenkins

#

# Pass arbitrary arguments to Jenkins.

# Full option list: java -jar jenkins.war --help

#

JENKINS_ARGS=""

查看程序主目录:

[root@jinkai01 ~]# ls /var/lib/jenkins/

config.xml nodeMonitors.xml

hudson.model.UpdateCenter.xml nodes

hudson.plugins.git.GitTool.xml plugins

identity.key.enc secret.key

jenkins.install.InstallUtil.installingPlugins secret.key.not-so-secret

jenkins.install.InstallUtil.lastExecVersion secrets

jenkins.install.UpgradeWizard.state updates

jenkins.model.JenkinsLocationConfiguration.xml userContent

jenkins.telemetry.Correlator.xml users

jobs workflow-libs

Logs

上面,

jobs 浏览器上面创建的任务都会存放在这里

logs 存放jenkins相关的日志

nodes 多节点时用到

plugins 插件所在目录

secrets 密码秘钥所在目录 #jobs和plugins目录比较重要

jenkins存放数据不依靠数据库,所以在移植时只需要拷贝整个程序主目录即可。

发布PHP代码

查看插件:

系统管理–>插件管理,“可选插件”是未安装的插件,“已安装”是已经安装的插件,其中勾选为灰色的是不可卸载的插件。

检查是否有“Git plugin”和“Publish over SSH”两个插件,如果没有,在“可选插件”中安装。发现“Publish over SSH”没有,安装它

imgimgimgimg

安装完插件后,直接在linux机器上重启jenkins服务,而不是勾选空闲时重启

[root@jinkai01 ~]# systemctl restart jenkins

重新在浏览器上登录jenkins,并在linux机器上生成一对秘钥

[root@jinkai01 ~]# ssh-keygen -f ~/.ssh/jenkins

Generating public/private rsa key pair.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/jenkins.

Your public key has been saved in /root/.ssh/jenkins.pub.

The key fingerprint is:

SHA256:/RMwhSYwDkCyRq+8N2EsmIt2nWPtbAIyZhKNviGReUk root@jinkai01

The key's randomart image is:

+---[RSA 2048]----+

|.oo.. o. .. |

|.oE o .. o. |

|.B o . oo |

|X.* . o |

|+B + S . . |

|+O+.o o . . |

|Bo=+.= . o |

|..o o.+. . |

| oo |

+----[SHA256]-----+

[root@jinkai01 ~]#

[root@jinkai01 ~]# ls /root/.ssh/

authorized_keys jenkins jenkins.pub

[root@jinkai01 ~]# cat /root/.ssh/jenkins //查看私钥

-----BEGIN RSA PRIVATE KEY-----

MIIEowIBAAKCAQEAqQRAj90eqFfP/Fq66IgH9DpUaNaomRhXYlLcpxDQ0ZZk4swG

unmLpfYOrfuD6iIgWMLw4E0QUUNH/ETRl9x1aOsTJltowWmu/+4dcxpGB4ECZFT+

V1rIrGhcpvGVoGbGzPXR33L6NYRNAeJAHy37ZhJMU8uy86UKYYayPeu/3FhcvK2M

fRtvHfvU92NRYFQ1s9WAc0k5mQn2j+oLTOaF+fjmeAt8ZQznIK2k33EuK79PSRYg

d8rp1vKUXUy1bAhi5hfi5+whXXy1c/gn/4ZUohKRnUlxp3PoVt3MHe0O4p6e6Lm+

lrREqNtkjFtrtpsj5xMoDbP3wBzAj2Z9C4IIAQIDAQABAoIBAE8ik4wIbxtJCjPQ

02SelILQcMcpgoUz9W4u9+stH2iSbygVeS0ETdNl0te5RLlyQwzsMVYEHxi9VM4T

9sKQ0VRPhIbYE8NDVVG1ToqfCZzn1ZPei7ug4QaAUqlDwdf5Zyl+C0cBEY/PIzM3

mOhAYk4XUS+G14Hmi2bAZ2JAqHNlFR3OX3cNgH+Qh2zSAbbfPjzvXgKqhy2OJPFr

06eX++UrOFX/S7KC42ZN3jm5hYKp77W6En0ZbTBH2TnYWB2S/JBRO+2+yaU+Z3Ax

ci5/C48Rj5cI5w8z18CayT5XGihVjs1OXmWQoqNdMdvbQtgS7GchQmzL9vtTLo72

pX14LIUCgYEA1neL1H9No72T6HZe6ylKEuiwBipQ6GN/8OWYY+ADiYwj467oZQrb

fXlbxgXRElQF10MJvQ8X4jHNt3uB9Yhgdd5WbAKT2ThHgePX5y+C1sPebGIBmUg/

3XiTVRpDJEMKf3UZa3BsDK8Ko6ERM+lC0Vc8X2Rmna6fvB7sNMSNFosCgYEAyb9z

SM2IUauzKN6turqdZxyPIcAkmA5Kr/8PIKjzJF1rtjJVwoP+fR/JxPUTUkc0w7iU

H99NRRWOGn8VRsbn2x2dmthoUEEbGW2hGu2e19x5yTSAjPoON2YOyBBd82eb30m8

Rpo7CQfbmxNXxxADuwFjSg7sSwg31MaIRx/5OSMCgYEAwIxN7zdoJkTzQTbdGzZT

ucxNFQvy3eFPIaGQgsLBikFWi3kiTm1ECE/ntE7OmSz0nYIjgSjG4Z6jOkNZt258

Y/Z9ErXxtYkQsi40TexbBKSP0jDfjJXQOO+jHznX4/uItkwUyWACshSJccUO49Nd

2QMAQgirFJCN+uCsYufAX+cCgYAytQPs0HvqyxUEuLNBs5XMTMlM2lZYQX9ULO9I

bi5ufWyNJqmXckWMfWjhMBfjHjKM3t+cAywQqRJGZpqaZ3PvBsqOGMZfJX4CLiPH

+OFrr+aMQ73rsQ3Rrr0YW8TBYNE0lfvUYv9jja4MlBgD2GqXngmum4GYekBOIngu

KEMjsQKBgESIkvYkQdfznp+K8bbg4ZK7C6YA9H84c+E7g381F7aytZpH98Eoab94

0KyFKkP5Lt5UAwIx/iCXlLkNoxNtxA9s6S0FJrfirZLwRCVAiGx1eULrJ1XWFadU

QRNV6PlQpQc4bSFi388NPzg+fEKvvtO4c8Sq/j36SKV49tIoL1/v

-----END RSA PRIVATE KEY-----

管理jenkins–>配置系统,找到之前安装的Publish over SSH插件,Passphrase填写之前生成秘钥时设置的密码,没有则留空,Path to key留空,Key粘贴/root/.ssh/jenkins文件内容。

imgimg

然后新增SSH Servers,填入对应的hostname,这就是PHP代码要发布的机器

img

接下来还需要把公钥拷贝到对应的hostname机器(jinkai02)上

[root@jinkai01 ~]# cat /root/.ssh/jenkins.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCpBECP3R6oV8/8WrroiAf0OlRo1qiZGFdiUtynENDRlmTizAa6eYul9g6t+4PqIiBYwvDgTRBRQ0f8RNGX3HVo6xMmW2jBaa7/7h1zGkYHgQJkVP5XWsisaFym8ZWgZsbM9dHfcvo1hE0B4kAfLftmEkxTy7LzpQphhrI967/cWFy8rYx9G28d+9T3Y1FgVDWz1YBzSTmZCfaP6gtM5oX5+OZ4C3xlDOcgraTfcS4rv09JFiB3yunW8pRdTLVsCGLmF+Ln7CFdfLVz+Cf/hlSiEpGdSXGnc+hW3cwd7Q7inp7oub6WtESo22SMW2u2myPnEygNs/fAHMCPZn0LgggB root@jinkai01

到jinkai02上粘贴jenkins.pub

[root@jinkai02 ~]# vim /root/.ssh/authorized_keys

#####jinkai01 pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCpBECP3R6oV8/8WrroiAf0OlRo1qiZGFdiUtynENDRlmTizAa6eYul9g6t+4PqIiBYwvDgTRBRQ0f8RNGX3HVo6xMmW2jBaa7/7h1zGkYHgQJkVP5XWsisaFym8ZWgZsbM9dHfcvo1hE0B4kAfLftmEkxTy7LzpQphhrI967/cWFy8rYx9G28d+9T3Y1FgVDWz1YBzSTmZCfaP6gtM5oX5+OZ4C3xlDOcgraTfcS4rv09JFiB3yunW8pRdTLVsCGLmF+Ln7CFdfLVz+Cf/hlSiEpGdSXGnc+hW3cwd7Q7inp7oub6WtESo22SMW2u2myPnEygNs/fAHMCPZn0LgggB root@jinkai01

Jinkai01上登录jinkai02测试

[root@jinkai01 .ssh]# ssh 192.168.186.141

[email protected]'s password:

会出现需要输入密码的情况

需要把jinkai01的/root/.ssh目录下的Jenkins和jenkins.pub改成:

[root@jinkai01 .ssh]# mv jenkins.pub id_rsa.pub

[root@jinkai01 .ssh]# mv jenkins id_rsa

再重新登录就不需要输入密码:

[root@jinkai01 .ssh]# ssh 192.168.186.141

Last login: Wed Dec 16 15:45:48 2020 from 192.168.186.140

浏览器上测试连接有没有问题,点击Test Configuration,如果没问题,左侧会显示Success,如下图

img

这就说明我们前面的配置是没问题的。点击应用,出现“已保存”

img

如果有多台web server ,可以继续新增,重复以上操作,最后点击保存。

新建任务:

回到首页,点击创建一个新任务,自定义任务名称,选择构建一个自由风格的软件项目

imgimg

点击确定

描述自定义;源码管理选择Git(如果使用SVN就选择Subversion);Repository URL选择自己公共仓库的地址;Branches to build默认为*/master,意思是发布代码的分支为master分支;构建触发器和构建环境留空;构建选择Send files or execute commands over SSH,Name选择对应的服务器,Source files填入/,表示要发布的代码为全部文件,Remote directory填入/tmp/jenkins_test(自定义一个存放PHP代码的文件夹名),Remove prefix和Exec command可以留空

img

img img

点击Add Server可以增加更多台服务器,在生产环境下通常也是多台服务器一起发布代码。点击保存

img

点击左侧立即构建,会出现构建历史,其中#1表示第一次构建

img

点击#1,点击控制台输出

img

构建失败

解决办法:

img

原先这个地方默认为/master,现在设置为空或者/main,然后应用保存,再重新构建。

img

用自己的github仓库构建失败,通常构建完,不管是成功还是失败都会有邮件通知。这里因为没有配置邮件,所以没办法接收到邮件。

如果构建正常到jinkai02上查看/tmp/jenkins_test应该有发布的代码,因为我用的是自己搭建的github上面只有两个自建的文件。

[root@localhost jenkins_test]# ls

a.txt README.md

如果在源上面做了变更,继续点击立即构建,如果构建成功,那么在目标机器上也可以看到变更的内容,下面在github上创建一个新文件

img

在jenkins上重新构建

img

构建完成后,jinkai02上重新查看文件下多了一个文件

[root@localhost jenkins_test]# ls

a.txt README.md wowowowowo

猜你喜欢

转载自blog.51cto.com/11451960/2640807