This sample Python REST API application was written for a tutorial on implementing Continuous Integration and Delivery pipelines.
It demonstrates how to:
- Write a basic REST API using the Flask microframework
- Basic database operations and migrations using the Flask wrappers around Alembic and SQLAlchemy
- Write automated unit tests with unittest
Also:
- How to use GitHub Actions
Related article: https://medium.com/rockedscience/docker-ci-cd-pipeline-with-github-actions-6d4cd1731030
Python 3.8Pipvirtualenv, orconda, orminiconda
The psycopg2 package does require libpq-dev and gcc.
To install them (with apt), run:
$ sudo apt-get install libpq-dev gccWith virtualenv:
$ python -m venv venv
$ source venv/bin/activate
$ pip install -r requirements.txtWith conda or miniconda:
$ conda env create -n ci-cd-tutorial-sample-app python=3.8
$ source activate ci-cd-tutorial-sample-app
$ pip install -r requirements.txtOptional: set the DATABASE_URL environment variable to a valid SQLAlchemy connection string. Otherwise, a local SQLite database will be created.
Initalize and seed the database:
$ flask db upgrade
$ python seed.pyRun:
$ python -m unittest discoverRun the application using the built-in Flask server:
$ flask runRun the application using gunicorn:
$ pip install -r requirements-server.txt
$ gunicorn app:appTo set the listening address and port, run:
$ gunicorn app:app -b 0.0.0.0:8000
Run:
$ docker build -t ci-cd-tutorial-sample-app:latest .
$ docker run -d -p 8000:8000 ci-cd-tutorial-sample-app:latest
Run:
$ heroku create
$ git push heroku master
$ heroku run flask db upgrade
$ heroku run python seed.py
$ heroku openor use the automated deploy feature:
For more information about using Python on Heroku, see these Dev Center articles:
From Jenkins running on ec2, this repo provides pipeline to manage dev, staging, production environments
- new feature in new branch -> staging -> main (production)
docker compose up -d
- This will start flask and jenkins ccontainers.
- From jenkins-cicd container try to run
docker ps. If permission denied chown to 1000:1000 to the file /var/run/docker.sock on the container executing as a root user. - Go to
localhost:8000and see if you receive{"status":"ok"} - Go '''localhost:8080''' and set up jenkins with multibranch pipeline - https://www.youtube.com/watch?v=aDmeeVDrp0o
- create stack with jenkins-cf-deployment.yaml through CF. This will create EC2, install Jenkins, open specific ports and create Security Groups. Explanation http://beta.awsdocs.com/infrastructure_as_code/cloudformation/applications/jenkins_cf_deployment/
- configure Jenkins multibranch pipeline - https://www.youtube.com/watch?v=B_2FXWI6CWg
https://hevodata.com/learn/jenkins-github-webhook/#steps
use of CloudBees AWS Credentials Plugin - https://www.youtube.com/watch?v=iiF2iQV-3eM
- login to ECR
aws ecr get-login-password --region REGIONHERE!!!! | docker login --username AWS --password-stdin AWS_ACCOUNTID_HERE!!!!.dkr.ecr.REGIONHERE!!!.amazonaws.com - create registries for storing previously created images and push images to aws ecr
Execute Jenkins pipeline manualy or by pushing branch to repo and create or update ecs stack through cloudformation
see Jenkinsfile for relevant code