1. 首先,因爲EC2上面需要安裝到Codedeploy服務,可以參考這裏:AWS Codedeploy安裝與使用文檔
從文檔可以知道,我們Codedeploy會幫我們發佈應用到指定的EC2並且在發佈前後都可以執行一些自定義的操作。詳細見下面。AWS CodeDeploy涉及到很多東西,以下是對於AWS 的幾個工具的一些使用小結。
2. 假設有一臺EC2 Name (Tag)爲 aws_ec2_test。在deploy之前,要先順序執行幾個操作。
1) 先說說需要在這裏創建一個application,如圖:
2) 創建deploy group,如圖:
Deployment type選擇 In-place,Environment configuration 選擇Amazon EC2 instances。
輸入 key : Name , Value : aws_ec2_test 。 (也就是你的EC2名稱,能唯一標示就可以了,輸入框自動補全)如圖:
注:
service role 指的是我們創建的IAM role,具體文檔參考:IAM說明文檔。Load Balancer 就不需要了。
3) 假設創建了一個名爲test的group。點擊那個test。然後右上角有個create deployment就可以發佈了。
4) 然後,需要設置Revision location。這裏就需要用到Jenkins Job打包上傳到S3的zip包了。
3. 查看codedeploy結果:deployment history
假設Failed了,我們可以點進這個deploment,裏面有詳細的deployment信息,包括最重要的日誌,如圖:
裏面可以看到,我們是在下載Jenkins打包的zip這一步出問題了。
再點進去這個UnknownError就可以知道具體問題了。
或者在發佈的EC2上輸入:
tail -1000f /opt/codedeploy-agent/deployment-root/deployment-logs/codedeploy-agent-deployments.log
假設BeforeInstall failed了。查看到的日誌如圖:
4. 如上圖,deploy app前後都可以執行一些腳本,BeforeInstall和AfterInstall,如圖:
其實這些操作定義在程序yml文件(appspec.yml)。
version: 0.0
os: linux
files:
- source: /
destination: /app/jars/
hooks:
BeforeInstall:
- location: /deployment/before_install.sh
timeout: 300
runas: root
AfterInstall:
- location: /deployment/after_install.sh
timeout: 300
runas: root
當我們的zip從S3被deploy解壓到指定的ec2後,yml描述文件在程序install之前執行before_install.sh,install之後執行after_install.sh。這兩個shell腳本我們可以根據實際情況來自定義。另外,這裏檢測yml文件是否可用。
注:
1) shell腳本的變量定義要注意=號兩邊不能有空格。如圖:
2) 當deploy的時候遇到:ERROR: The overall deployment failed because too many individual instances failed deployment,進入上面說的查看log的地方看,鏈接中說的是yml文件錯誤。
3) 當deploy的時候遇到:Script at specified location: /deployment/before_install.sh run as user root failed with exit code 1。
參考:appspec.yml failed to call scripts ,也就是shell腳本沒有權限被執行的問題。在maven打包zip包的package.xml描述文件中,加入:<fileMode>777</fileMode>。詳細的可以看我Jenkins打包Zip這篇文章。
<fileSet>
<directory>${project.basedir}${file.separator}src${file.separator}main${file.separator}resources${file.separator}deployment</directory>
<outputDirectory>/deployment</outputDirectory>
<fileMode>777</fileMode>
<excludes>
<exclude>appspec.yml</exclude>
</excludes>
</fileSet>
附: