一、背景介紹
假定我們有一個 PHP 的應用程序,代碼發佈不需要進行編譯,應用程序在 AWS 的 EC2 上面或者 On-Premises,在實現 CI/CD 的方式上面有很多方法,那我們如何利用 AWS 的 Develop Tooles 去實現呢?
在這裏,我首先介紹一下我們可能會用到的 AWS 服務:
- IAM:配置 CodeDeploy,CodePipeline 相關的權限;
- CodeCommit:應用程序代碼存儲庫;
- CodeDeploy:EC2/On-premises 平臺的應用部署程序;
- S3:CodePipeline 過程中文件的存儲位置,爲整個 pipeline 過程提供文件來源;
- CodePipeline:管理整個 pipeline 過程。
- Amazon EC2:應用程序存放的服務器。
二、配置 EC2
2.1、爲 EC2 創建 Service role
因爲在整個 CI/CD 過程中,EC2 服務器需要從 S3 獲取資源,我們這裏就索性給了AmazonS3FullAccess
。
2.2、爲 EC2 安裝 CodeDeploy Agent
我們的 EC2 系統是 Amazon Linux 2,安裝過程如下:
sudo yum update -y
sudo yum install ruby -y
sudo yum install wget -y
cd /home/ec2-user
wget https://aws-codedeploy-us-east-2.s3.us-east-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
sudo service codedeploy-agent status
如果是其他系統的安裝,大家可以參照官方文檔操作:
2.3、安裝 nginx
yum install nginx -y
三、配置 CodeCommit
3.1、創建倉庫
選擇好我們的區域,打開 CodeCommit 控制檯,點擊創建代碼倉庫,對於 Java 程序,我們可以開啓代碼檢測功能。
關於爲 CodeCommit 配置 IAM User,我這裏就不再說了,大家可以參加官方文檔:
https://docs.aws.amazon.com/zh_cn/codecommit/latest/userguide/setting-up-gc.html
3.2、提交代碼
只是爲了演示,第一步,我們創建一個 index.html 文件,寫上如下內容。
<h1>this is test one</h1>
然後上傳到倉庫中。
$ git add .
$ git commit -m "one"
[master (root-commit) 969e50f] one
1 file changed, 1 insertion(+)
create mode 100644 index.html
$ git push origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 230 bytes | 230.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://git-codecommit.us-east-2.amazonaws.com/v1/repos/www.wzlinux.com
* [new branch] master -> master
四、配置 CodeDeploy
CodeDeploy 是一項部署服務,可以向 Amazon EC2 實例、本地實例、無服務器 Lambda 函數或 Amazon ECS 服務自動執行應用程序部署,在 EC2 平臺上面的部署組件如下:
部署工作流程如下:
4.1、爲 CodeDeploy 創建 Service role
爲 CodeDeploy 創建的服務角色必須授予對您的計算平臺所需的權限,對於 EC2/本地 部署,附加 AWSCodeDeployRole
策略,請看我創建的角色:
關於更新詳細的過程,大家請查看官方文檔:
4.2、創建 Applications
配置實例後,必須先在 CodeDeploy 中創建應用程序,然後才能部署修訂(appspec.yaml)。應用程序 只是一個名稱或容器,CodeDeploy 使用此名稱或容器來確保在部署期間引用正確的修訂、部署配置和部署組。
4.3、創建 Deployment groups
可以爲 CodeDeploy 應用程序指定一個或多個部署組。每個應用程序部署使用其中一個部署組。部署組包含在部署期間使用的設置和配置。大多數部署組設置取決於您的應用程序使用的計算平臺。可以爲任何計算平臺的部署組配置某些設置,例如回滾、觸發器和警報。
我們爲項目www.wzlinux.com
創建一個部署組,我一般都是以訪問的域名進行命名:
部署方式我們選擇就地部署,然後通過 tag 標籤選擇我們的目標服務器,我們這裏是 EC2,如果是 On-premises instances 的機器,我們需要先去註冊。
我們這裏就不是有 ALB了,取消勾選,其他選項默認即可,我們點擊創建。
4.4、創建 Application Revisions
修訂包含 CodeDeploy 將部署到實例的源文件版本或者 CodeDeploy 將在實例上運行的腳本。
您規劃修訂、將 AppSpec file 添加到修訂,然後將修訂推送到 Amazon S3 或 GitHub。在推送修訂之後,您可以部署它,目前不支持從 CodeCommit 獲取修訂,但是我們可以利用 CodePipeline,後面我們再說。
如果沒有 AppSpec file,CodeDeploy 無法將應用程序修訂中的源文件映射到其目標,也無法爲您向 EC2/本地 計算平臺中進行的部署運行腳本。
1、規劃倉庫結構
現在我們要規劃一下倉庫代碼的結構了,結構如下:
├── appspec.yml
├── htdocs
│ └── index.html
└── scripts
└── update.sh
- appspec.yaml:用於部署的修訂文件;
- htdocs:存放網站代碼的文件夾;
- scripts:部署過程中需要的腳本文件存放文件夾。
2、創建 appspec.yml
我這裏簡單寫一個示例文件,如下:
version: 0.0
os: linux
files:
- source: htdocs
destination: /usr/share/nginx/html
hooks:
AfterInstall:
- location: scripts/update.sh
timeout: 60
以遞歸方式將 htdocs
目錄中的所有文件複製到 /usr/share/nginx/html
目錄中。
運行位於 scripts/update.sh
中的腳本,超時時間爲 60 秒。
更多相關配置信息請參照官方文檔:
3、創建 update.sh
腳本我就簡單寫了一個添加時間的記錄:
#!/bin/bash
echo Build time is $(date '+%Y-%m-%d %H:%M:%S') >> /usr/share/nginx/html/index.html
這樣每次頁面上都有部署的時間,大家有什麼需要可以根據自己需求進行填寫。
五、配置 CodePipeline
AWS CodePipeline 是一種持續交付服務,可用於建模、可視化和自動執行發佈軟件所需的步驟。您可以快速對軟件發佈過程的不同階段進行建模和配置。CodePipeline 會自動執行持續發佈軟件更改所需的步驟。
5.1、配置
服務角色我們選擇讓 Codepipeline 創建。
5.2、添加數據源
我們這裏選擇 CodeCommit,pipeline 還支持 ECR、S3、Bitbucket、Github作爲數據源。
5.3、添加部署
因爲我們我們是不需要編譯的文件,所以不需要 CodeBuild 這一階段。
CodePipeline 還支持一下幾種部署程序:
- CodeDeploy
- AWS Elastic Beanstalk
- AWS OpsWorks Stacks
- AWS CloudFormation
- Amazon ECS
- Amazon ECS(藍/綠)
- AWS Service Catalog
- Alexa Skills Kit
- Amazon S3
六、驗證
創建好了,我們就上傳代碼吧