云效公有云如何构建一个基于Composer的PHP项目

简介: 最近在将公司的持续集成架构做一个系统的调整,调整过程中受到了云效公有云团队大量的帮助,分享这篇内容希望能让更多的人了解和用好这个产品。我会把我最近3个月的使用体会分成5个部分:使用云效公有云的动机、PHP项目集成、JS项目集成、JAVA项目集成、Docker类项目集成这5个分支来写。

最近在将公司的持续集成架构做一个系统的调整,调整过程中受到了云效公有云团队大量的帮助,分享这篇内容希望能让更多的人了解和用好这个产品。

我会把我最近3个月的使用体会分成5个部分:使用云效公有云的动机、PHP项目集成、JS项目集成、JAVA项目集成、Docker类项目集成这5个分支来写。

因为近期公有云的迭代比较频繁,所以我的分享会比较的浅,点到为止,仅供参考,目录:

1、云效公有云如何耦合进我们的业务

2、如何构建一个基于Composer的PHP项目

3、如何构建一个基于NodeJS的前后端项目

4、如何构建一个基于Maven的Java项目

5、云效公有云 + 容器服务完成持续集成


一、云效公有云基础操作

在开始一切之前您需要熟悉云效公有云的一些基础操作,创建一个项目,然后在这个项目中创建一个应用,然后让这个应用关联某个代码分支。这样基础工作就完成了,我这里不再赘述了,因为比较简单,只需要注册个阿里云账号,然后去 https://www.aliyun.com/product/yunxiao 创建/加入个企业就行了。

本文所有的体验均基于【自由模式】的应用。

值得一提的是,应用代码源目前支持的是阿里云的代码仓库,基于gitlab,地址是 code.aliyun.com,从我2年的使用经验来看,还算好用,也不收费,较为靠谱。

在创建应用时,我们需要选择对应的配置,如下图:

image

创建完应用后,进入【项目】--》【流水线】,找到刚才创建应用的【同名流水线】

image

点击流水线名称可以看到具体的流水线运行情况和对应节点,如下图:

image

可以看到有4个面板:构建、日常、预发、正式。

分别对应的是:构建打包、发布到日常环境、发布到预发环境、发布到正式环境。

云效公有云在创建应用时自动的为你生成了一个标准模板流水线,但是我们一般用不着,所以需要对流水线进行修改,去除无用的节点,添加我们自己的配置。点击界面上的【编辑流水线】按钮就可以进入修改界面。

image

我们先从构建开始,所以先暂时删除日常、预发、正式这3个部署节点,仅保留构建这一个节点即可。下面的配置暂时不进行调整。删除完毕后保存流水线即可,效果如下:

image

至此我们已经完成了基础的准备工作,下一步就开始进行PHP代码的构建工作了。

在开始下一步工作之前,请重新git pull一下您的代码到本地,会看到一个由公有云服务自动生成的配置文件:==xxx.release== 这个文件相当重要,请注意,下面将会说明如何通过此文件完成个性化构建。


二、基于Composer的PHP项目构建

有人可能会问,PHP不是动态脚本语言吗,为什么需要构建?

这是因为PHP的一些第三方类、开源框架等代码需要通过Composer包管理来进行安装及维护,如果你的代码里没有使用到Composer,请跳过本章节。

因为Composer并不推荐将vendor文件夹上传到代码仓库,所以我们通常只在本地保留vendor文件夹用于开发和调试。

但是这个文件夹里的代码是线上运行必须的,所以我们需要通过一个构建的过程来安装所有PHP项目依赖库,也就是生成vendor文件夹。

这里需要找到我们上一章节中提到的:==xxx.release== 文件,xxx代表你的应用名,所以我这里看到的文件名是:ms-autotags.release

这个文件的配置规范可以参考:==https=//help.aliyun.com/document_detail/59293.html==

打开这个文件可以看到,已经有一些预先定义好的配置:

# 构建源码语言类型
code.language=scripts

# 应用部署脚本
deploy.appctl.path=deploy.sh

# Docker镜像构建之后push的仓库地址
docker.repo=registry.cn-hangzhou.aliyuncs.com/xxx/abced

上面的配置是不能用的,我们需要将其修改为如下内容:

# 语言类型,需要改为PHP,否则无法调用对应的构建环境
code.language=php7.0

# 代码构建基础镜像
build.image=registry.cn-hangzhou.aliyuncs.com/lxepoo/php-autobuild:php7.1

#构建命令
build.command=sh build.sh

# 应用部署脚本,先注释掉,暂时用不上
# deploy.appctl.path=deploy.sh

↓↓↓↓ 配置说明:

code.language=php7.0

代表使用的是php7作为代码语言类型。支持以下枚举:

php5.6,php7.0,node6.x,node7.x,node8.x,oracle-jdk1.7,oracle-jdk1.8, oracle-jdk1.9,scripts

如果有使用过jenkins的同学,那么应该比较好理解,公有云的构建是通过Docker容器技术实现的,类似于配置好环境的jenkins构建机,公有云团队针对各种语言准备了不同的镜像作为构建宿主。


build.image=registry.cn-hangzhou.aliyuncs.com/lxepoo/php-autobuild:php7.1

# 可根据你的需要切换使用下面这个构建环境

# build.image=registry.cn-hangzhou.aliyuncs.com/lxepoo/php-autobuild:php5.6

代表使用一个特定的镜像作为构建环境,用户暂时无法自定义镜像并在公有云中使用。目前你看到的这个配置值是因为公有云团队在迭代更重要的功能没有精力维护PHP版本的打包环境,所以我代为生成并提交了2个PHP版本作为临时构建环境,相对官方的构建环境我的更全面些,支持git、php的大部分扩展、mongo扩展、composer、phpunit等。

因为有些第三方库安装时,需要检测php扩展的,所以必须开启,否则没办法安装第三方库。


build.command=sh build.sh

这一行的意思是,使用一个特定的脚本来进行自定义构建,因为构建有时候需要处理的东西很多,一行命令解决不了,所以需要一个自定义构建脚本,此处我设置的脚本在代码根目录下,创建一个build.sh脚本。如果你的构建只有1句话,可以直接写在“=”号后面,使用自定义脚本是为了更清晰和更灵活。

↓↓↓↓ build.sh脚本内容:

echo "##### delete vendor dir"
rm -rf ./vendor

echo "##### composer to china"
composer config -g repo.packagist composer https://packagist.phpcomposer.com

echo "##### php composr install"
composer install --no-dev

逐句解释:

rm -rf ./vendor

先删除掉目录中已有的vendor文件夹,主要原因是:

1.防止你不小心向git提交了这个文件夹,先删掉防止冲突和污染。

2.防止云效公有云的构建有缓存,强行删除后每次构建重新生成。

composer config -g repo.packagist composer https://packagist.phpcomposer.com

让composer使用中国区镜像,目的就是为了构建快一些,按个人喜好,你用美国和日本镜像也没事,就是会很慢,因为公有云目前暂时不支持海外构建。

composer install

最核心的一句话,安装所有php第三方库依赖,这一句执行后如果正确,就会生成vendor文件夹了。也意味着如果你使用开源PHP框架,你的tp5、yii2、lumen、laravel等框架就安装成功了。

提一下,如果你需要构建更快,可以尝试使用 composer install --no-dev,不安装开发依赖。


我们已经完成了应用的创建+流水线的修改,那么我们运行一次构建试一下,只需要点击【运行流水线】按钮即可,运行后等几秒刷新一下页面,效果如下:

image

可以看到执行时间、版本号、日志、操作人等信息。

如果构建失败了,可以通过构建流程----日志详情面板看到具体的错误原因,有日志排查起来不太难,但是公有云的构建还是偏向黑盒,所以尽量熟练或在本地先把相关命令跑通后再上传到==xxx.release==文件里去进行公有云构建。

可以看到初始的版本号是:v0.0.1-1,如果你的构建一直失败,版本号会变成v0.0.1-3、v0.0.1-8、v0.0.1-18、v0.0.1-N。

如果你的流水线全流程跑完了,则会自动叠加一个小版本号变为v0.0.2-1,所以这种构建方式清晰明了,还算好用。


三、如何输出为一个Docker镜像

我们已经完成了PHP依赖的安装,下一步我们需要把完整的代码封装成一个Docker镜像,我们需要对==xxx.release==文件做如下改动:

# 语言类型,需要改为PHP,否则无法调用对应的构建环境
code.language=php7.0

# 代码构建基础镜像
build.image=registry.cn-hangzhou.aliyuncs.com/lxepoo/php-autobuild:php7.1

#构建命令
build.command=sh build.sh

# Docker 构建配置
docker.file=Dockerfile

# Docker镜像构建之后push的仓库地址
docker.repo=registry.cn-hangzhou.aliyuncs.com/xxx/abced

docker.tag=ci-${PACKAGE_LABEL} 

# 应用部署脚本,先注释掉,暂时用不上
# deploy.appctl.path=deploy.sh

相对于单纯的构建,如果需要生成Docker镜像则需要补充几个配置项,拆解说明如下:

docker.file=Dockerfile

指明dockerfile文件的位置和文件名,默认就是根目录下的Dockerfile文件。


docker.repo=registry.cn-hangzhou.aliyuncs.com/xxx/abced

指定你的docker镜像仓库,建议使用阿里云提供的仓库,免费,速度快,可以加速docker hub的内容,无缝对接公有云服务,地址是 dev.aliyun.com ,此处的**xxx**对应的是你的名称空间,**abced**对应的是你的镜像名称。


docker.tag=ci-${PACKAGE_LABEL}-${TIMESTAMP}

这里指定你的docker镜像的tag名,使用了环境变量进行拼接。

${PACKAGE_LABEL}代表的是包名,这个参数在流水线配置里可以改,默认是default。

${TIMESTAMP}代表的是当前时间戳,格式是:20171008224350 这种样子。

有的项目一份代码可能产生多个docker镜像就需要通过这种方式来动态生成tag名,防止覆盖,也便于回滚。

关于构建传参,可以参考这个文章: https://help.aliyun.com/document_detail/59297.html

那么此处最终生成的tag名是这样的: ci-default-20171008224350

结合仓库名和镜像名,最终会生成镜像tag地址为:

registry.cn-hangzhou.aliyuncs.com/xxx/abced:ci-default-20171008224350


四、后记

PHP构建 + Docker构建就说到这里,因为主要是为了介绍云效公有云,所以Docker部分就挑重点讲了,如何编写Dockerfile文件请自行学习。

输出成Docker镜像后,如何使用云效公有云部署到容器相关问题我会单独开一个文章来分享。



云效产品体验


Work Like Alibaba直播报名






相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
SVN版本控制系统
SVN是现在软件开发之中的主流软件版本控制工具,在工作之中利用SVN可以有效的解决多人开发的代码管理问题,本课程将为读者讲解SVN服务器的配置以及基于MyEclipse的SVN客户端插件的配置与使用,并且在讲解之中着重讲解了冲突的产生于解决。
相关文章
|
1月前
|
域名解析 关系型数据库 MySQL
基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
该文章指导如何使用PHPEnv搭建本地PHP开发环境,并通过一个简单的"Hello World"程序演示从安装到运行的全过程。
基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
|
1月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
1月前
|
设计模式 数据管理 测试技术
PHP中的设计模式:单一职责原则在实战项目中的应用
在软件开发中,设计模式是解决问题的最佳实践。本文通过分析单一职责原则(SRP),探讨了如何运用这一原则来提升PHP项目的可维护性和扩展性。我们将从实际案例出发,展示单一职责原则在业务逻辑分离、代码解耦和提高测试效率方面的应用。无论是新手还是经验丰富的开发者,都能从中获益,进而编写出更健壮、更灵活的PHP代码。
35 5
|
2月前
|
关系型数据库 MySQL 应用服务中间件
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
这篇文章介绍了如何在Windows 7系统上搭建PHP、MySQL和Apache环境,并部署ECShop项目,包括安装配置步骤、解决常见问题以及使用XAMPP集成环境的替代方案。
52 1
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
|
1月前
|
开发框架 前端开发 中间件
开源PHP项目
【9月更文挑战第2天】开源PHP项目
36 4
|
2月前
|
敏捷开发 测试技术 持续交付
阿里云云效产品使用合集之流水线构建出现问题,连接不到nuget,该如何处理
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
2月前
|
缓存 资源调度 Kubernetes
阿里云云效产品使用合集之如何将两个独立的代码仓库构建并部署到同一个容器内
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
2月前
|
存储 关系型数据库 Linux
【Azure 应用服务】App Service For Linux 部署PHP Laravel 项目,如何修改首页路径为 wwwroot\public\index.php
【Azure 应用服务】App Service For Linux 部署PHP Laravel 项目,如何修改首页路径为 wwwroot\public\index.php
|
2月前
|
敏捷开发 缓存 前端开发
阿里云云效产品使用合集之前端打包时npm安装卡住一般是什么导致的
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
2月前
|
敏捷开发 弹性计算 持续交付
阿里云云效产品使用合集之同一个主机部署是否支持下载多个制品
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。