Continuous Delivery for a PHP Application Using AWS CodePipeline, AWS Elastic Beanstalk, and Solano Labs
My colleague Joseph Fontes, an AWS Solutions Architect, wrote the guest post below to discuss continuous delivery for a PHP Application Using AWS CodePipeline, AWS Elastic Beanstalk, and Solano Labs.
Solano Labs recently integrated Solano CI with AWS CodePipeline, a continuous delivery service for fast and reliable application updates. Solano Labs provides CI/CD capabilities to a variety of organizations, such as Airbnb, Change.org, and Apptio. Solano CI is an enterprise-grade, scalable continuous integration (CI) and continuous deployment (CD) SaaS solution. CodePipeline builds, tests, and deploys your code every time there is a code change, based on release process models that you define. You can now take advantage of the CI/CD capabilities long enjoyed by Solano Labs customers from within CodePipeline and with all of the ease of using the AWS Management Console.
In this post, we demonstrate how to use Solano CI with CodePipeline to test a PHP application using PHPUnit, and then deploy the application to AWS Elastic Beanstalk (Elastic Beanstalk).
You will learn how to:
- Deploy a sample PHP application to Elastic Beanstalk
- Create a CD tool chain to push your code to Elastic Beanstalk
- Connect your GitHub source repository to CodePipeline
- Set up a Solano CI build stage to build your application and perform integration tests
- Deploy your tested application to Elastic Beanstalk
After you have completed these steps, your code will be continuously tested and delivered safely in an automated fashion.
To follow along, you need to set up an account with Solano Labs and have a GitHub account and a repository for the demo.
1. To create an account with Solano Labs, go to http://docs.solanolabs.com/introduction/.
2. If you don’t already have a GitHub account, create one. Also, create the repository for this demo. For instructions for both, go to
As a part of the deployment process, you will use the PHPUnit testing framework on the demonstration application we’ve posted to our Elastic Beanstalk environment. For more information about PHPUnit and Solano Labs PHPUnit integration, go to https://phpunit.de/ and http://docs.solanolabs.com/ConfiguringLanguage/php/.
Now, let’s start the demo.
1. Clone the application code from the following location into your Git repository: https://github.com/awslabs/aws-demo-php-simple-app.git.
2. Create the destination application in Elastic Beanstalk by following the instructions at http://docs.aws.amazon.com/gettingstarted/latest/deploy/deploying-with-elastic-beanstalk.html.
You need to choose specific options for your configuration. Instead of Node.js for the Predefined configuration, choose PHP.
When asked to provide an archive of an application to get started, download the following .zip file to your local machine and upload into the Elastic Beanstalk application.
3. Finish configuring the Elastic Beanstalk application and environment.
4. Ensure that the configuration is running properly by testing it in a web browser. You should see a page similar to this:
5. Next, create a CodePipeline pipeline to establish the continuous delivery process. From the AWS Management Console, choose Services, and then, choose AWS CodePipeline. If this is the first time you’ve created a pipeline, CodePipeline displays the following page:
6. Choose Get started.
7. Enter a name for your pipeline. For this example, we use “solano-eb-build”. Choose Next step.
8. Now define your source provider. CodePipeline provides direct integration between GitHub repositories and versioned Amazon S3 locations. After you define your source, CodePipeline tracks changes committed to the source and performs actions that you will define.
For Source provider, choose GitHub. You may be requested to login to your Github account to proceed. Under Connect to GitHub, you’ll see a variety of repositories and branches. Choose the repository and branch that you just created, and then choose Next step.
9. For Build provider, choose Solano CI, and then choose Connect. You may be requested to login to your Solano CI account. When you are redirected to the Solano site, confirm the connection between CodePipeline and Solano CI by choosing Connect. Then, choose Next step on the Create pipeline page.
10. For Deployment provider, choose AWS Elastic Beanstalk, and then choose the Application name and the Environment name of the Elastic Beanstalk environment you created earlier. Choose Next step.
An Amazon Identity and Access Management (IAM) role will provide the permissions necessary for CodePipeline to perform the necessary build actions and service calls. If you already have a role that you want to use with the pipeline push, choose it for Role name. Otherwise, choose Create role to create a role with the sufficient permissions to perform the build and push tasks. Please review these predefined permissions and then accept. For information about IAM, see http://docs.aws.amazon.com/codepipeline/latest/userguide/access-permissions.html. Then choose Next step.
11. Review the information and make any necessary changes, and then choose Create pipeline.
You’ll get confirmation that the pipeline’s been created:
12. Now that you have a pipeline and the initial version of the application running, let’s make some changes. In your Git directory, open the www/index.php file with a text editor. Change the value of:
$AppName = “Demo Web App”;
$AppName = “PHP Web App”;
Save the file and check your changes into Git, as follows.
Index.php prior to alteration:
Index.php after alteration:
Outcome of running the git commit command:
You can see that the name of the application rendered in the web browser has been changed:
13. Check on the status of the build process by viewing the CodePipeline console:
You can also see the build status on the Solano Labs dashboard and build details page:
You have leveraged Solano’s built-in capabilities to test the functionality of the updated code.
In the Git repository, there are six tests identified across two files. If you look at the phpunit directory in the Git working directory, you will see two files, indexTest.php and loadGenTest.php. loadGenTest.php tests the load generation feature of the demo application. To test this functionality, you ordinarily need to generate load that would take time to test. We can take advantage of the Solano CI parallel PHPUnit testing to ensure that the load is spread in a parallel fashion.
PHPUnit test definitions:
These are top three tests performed:
In the next screenshots, you can see the file responsible for PHPUnit test configuration and the solano.yml configuration file that invokes the PHPUnit testing:
This walkthrough demonstrates just a few of the many unique capabilities available when you integrate Solano CI into the CodePipeline build process. Using Solano CI expands the portfolio of technologies available for use within your AWS CI/CD implementations. You can expand the capabilities of this one example by pushing unique GitHub branches to different development, testing, and production environments. You can also leverage other CodePipeline integrations to take advantage of AWS CodeDeploy and a collection of specialized testing services.
Now that you have the build process running, make some changes and observe the process flow from within the CodePipeline console, AWS Elastic Beanstalk console, and the Solano Labs’ Solano CI console. After you check changes into the GitHub repository that you used for this demonstration, updates are automatically dispatched to your new Elastic Beanstalk application.