Search code examples
amazon-web-servicesamazon-ec2aws-code-deployaws-code-deploy-appspec

CodeDeploy hooks running scripts in the agent instalation folder


So, I'm setting up my first application that uses CodeDeploy (EC2 + S3) and I'm having a very hard time to figure out how to run the scripts after instalation.

So I defined an AfterInstall hook in the AppSpec file refering to my bash script file in the project diretory. When the commands in the script run I get the error stating the files could not be found. So I put an ls command before it all and checked the logs.

My script file is running in the CodeDeploy agent folder. There are many files there that I accidentally created when I was testing but I was expecting them to be in my project root folder.

--Root
----init.sh
----requirements.txt
----server.py

appspec.yml

version: 0.0
os: linux
files:
  - source: ./
    destination: /home/ubuntu/myapp
    runas: ubuntu
hooks:
  AfterInstall:
    - location: init.sh
      timeout: 600

init.sh

#!/bin/bash

ls
sudo apt install python3-pip
pip3 install -r ./requirements.txt
python3 ./server.py

So when ls is executed, it doesn't list the files in my project root directory. I also tried ${PWD} instead of ./ and it didn't work. It is copying the script file to the agent folder and running it.

Refer to this https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html

This is written at the end of the above document

The location of scripts you specify in the 'hooks' section is relative to the root of the application revision bundle. In the preceding example, a file named RunResourceTests.sh is in a directory named Scripts. The Scripts directory is at the root level of the bundle.

But apparently it refers to the paths in the appspec file only.

Could someone help? Is it correct? I MUST use absolute paths hard-coded in the script file?


Solution

  • Yes correct. The script doesn't execute in the destination folder, as you might expect. You need to hard code a reference the destination directory /home/ubuntu/myapp to resolve file paths in life cycle scripts.

    Use cd to change the directory first:

    cd  /home/ubuntu/myapp
    ls
    sudo apt install python3-pip
    pip3 install -r ./requirements.txt
    python3 ./server.py