利用持续集成和持续交付实现快速构建、测试和部署
立即解锁
发布时间: 2025-08-25 01:27:56 阅读量: 1 订阅数: 2 

### 利用持续集成和持续交付实现快速构建、测试和部署
在软件开发中,持续集成(CI)和持续交付(CD)是非常重要的实践,它们能够帮助我们更快地将代码从开发环境推向生产环境。下面将详细介绍如何在AWS上实现持续集成和持续交付。
#### 1. 编写演示应用
在配置CI管道之前,我们需要一个简单的应用来进行集成操作。这里使用一个基本的PHP “Hello World” 类型的代码作为演示应用。
**示例代码**:
```php
// src/index.php
<?php
function greet($name) {
return "Hello $name!";
}
$full_name = "Bobby D";
greet ($full_name);
```
同时,为其编写单元测试:
```php
// tests/indexTest.php
<?php
require_once "src/index.php";
class IndexTest extends PHPUnit_Framework_TestCase
{
public function testGreet() {
global $full_name;
$expected = "Hello $full_name!";
$actual = greet($full_name);
$this->assertEquals($expected, $actual);
}
}
```
在 `demo-app` 文件夹中还有一个名为 `Jenkinsfile` 的文件,后续会详细讨论。
#### 2. 将代码存入仓库
首先,使用AWS CodeCommit创建一个仓库:
```bash
$ aws codecommit create-repository --repository-name demo-app --repository-description "Demo app"
```
然后,将仓库克隆到本地:
```bash
$ git clone ssh://[email protected]/v1/repos/demo-app
```
最后,将演示应用代码放入空仓库,提交并推送到CodeCommit。
#### 3. 定义管道
CI管道需要完成一系列任务,以下是一些有用的步骤:
1. 从Git检出应用源代码。
2. 在Jenkins主机的Docker容器中运行PHPUnit进行测试。
3. 在Jenkins主机的容器中执行FPM构建应用工件。
4. 将工件上传到外部存储(如Yum仓库)。
对应的Jenkins管道代码如下:
```groovy
#!groovy
node {
stage "Checkout Git repo"
checkout scm
stage "Run tests"
sh "docker run -v \$(pwd):/app --rm phpunit/phpunit tests/"
stage "Build RPM"
sh "[ -d ./rpm ] || mkdir ./rpm"
sh "docker run -v \$(pwd)/src:/data/demo-app -v \$(pwd)/rpm:/data/rpm -rm tenzer/fpm fpm -s dir -t rpm -n demo-app -v \$(git rev-parse --short HEAD) --description \"Demo PHP app\" --directories /var/www/demo-app --package /data/rpm/demo-app-\$(git rev-parse --short HEAD).rpm /data/demo-app=/var/www/"
stage "Update YUM repo"
sh "[ -d ~/repo/rpm/demo-app/ ] || mkdir -p ~/repo/rpm/demo-app/"
sh "mv ./rpm/*.rpm ~/repo/rpm/demo-app/"
sh "createrepo ~/repo/"
sh "aws s3 sync ~/repo s3://MY_BUCKET_NAME/ --region us-east-1 --delete"
stage "Check YUM repo"
sh "yum clean all"
sh "yum info demo-app-\$(git rev-parse --short HEAD)"
}
```
下面对每个阶段进行详细解释:
- **Checkout Git repo**:从Git仓库检出演示应用代码,仓库地址假设为 `Jenkinsfile` 所在的地址。
- **Run tests**:利用Docker的隔离性,启动一个包含PHPUnit所需环境的容器,对演示应用源代码进行测试。
- **Build RPM**:如果测试通过,使用FPM工具在Docker容器中构建RPM工件,并使用短的Git提交哈希作为版本标识符。
- **Update YUM repo**:将RPM工件移动到指定的仓库文件夹,使用 `createrepo` 创建YUM仓库,并将数据同步到Amazon S3存储桶。
- **Check YUM repo**:检查刚刚同步的包是否可以通过YUM检索。
在运行管道之前,我们需要创建一个S3存储桶来存储RPM工件,并更新Jenkins和SaltStack代码中相关的S3存储桶地址。
```bash
$ aws s3 mb s3://MY_BUCKET_NAME
```
同时,更新 `Jenkinsfile` 中的相关行:
```bash
sh "aws s3 sync ~/repo s3://MY_BUCKET_NAME/ --region us-east-1 --delete"
```
以及SaltStack中的 `s3.repo` 文件:
```ini
[s3-repo]
name=S3-repo
baseurl=https://s3.amazonaws.com/MY_BUCKET_NAME
enabled=1
gpgcheck=0
```
完成这些更改后,提交并推送 `Jenkinsfile` 到演示应用仓库,`s3.repo` 文件到SaltStack仓库,然后SSH进入Jenkins节点,拉取并应用Salt更改。
#### 4. 设置管道
登录Jenkins界面,点击欢迎页面上的 “创建新任务” 链接,选择 “Pipeline” 作为任务类型并命名。
在任务配置详细信息中,选择 “丢弃旧版本” 以保持Jenkins工作区的紧凑,只保留最近五次执行的详细信息。
在 “Build Triggers” 中,选择每5分钟轮询一次Git仓库以检测更改。选择 “Pipeline script from SCM”,将SCM设置为Git,并添加演示应用仓库的URL。
由于可以通过EC2 IAM角色获取凭证,因此不需要额外的凭证。注意脚本路径引用了之前提到的 `Jenkinsfile`,这是一个很棒的新功能,它实现了 “管道即代码” 的功能。
保存管道任务后,Jenkins将开始轮询Git仓库,每当检测到更改时触发执行(也可以点击 “立即构建” 强制运行)。每次成功构建都会将一个RPM包上传到YUM仓库。
#### 5. 持续交付
在完成持续集成后,我们的目标是将管道升级为持续集成加持续交付。持续交付阶段将在成功的集成运行后触发,完成以下任务:
1. 启动一个全新的EC2实例。
2. 对其应用配置管理:
- 安装我们生成的演示应用RPM。
- 安装其他所需的软件包,将其转换为Web服务器。
- 使用Serverspec测试应用的配置。
3. 使用Packer从配置好的实例生成AMI。
4. 从生成的AMI启动一个EC2实例。
5. 对新的EC2实例运行额外的测试。
为了完成这些任务,我们将引入两个新工具:Packer和Serverspec。
#### 6. 准备Terraform模板
除了Jenkins所需的VPC、IGW和子网外,我们还需要为演示应用Web服务器部署NAT和ELB。
**资源配置示例**:
```h
```
0
0
复制全文
相关推荐










