准备Web应用和CircleCI来练习部署Django项目的第三次
在这里做的事情。
在这里,我们将创建一个在容器中运行的Web应用程序,并进行应用程序的CI配置。在CI中,我们将执行测试、构建Docker镜像和将镜像推送到ECR,以确保准备工作完成。
建立镜像
docker build -t djangoproject:ver1 .
在8000端口启动容器
使用docker run -itd –name djangoproject –mount type=bind,source=”$(pwd)”/code/,target=/code/ djangoproject:ver1命令
使用docker exec命令,在/code/project路径下,运行djang-admin命令,创建名为djangoproject的Django项目。
启动helloapp应用程序,请运行以下命令:docker exec djangoproject python3 /code/project/manage.py startapp helloapp /code/project/hello
Docker相关文件用于任务。
这个用于工作的 Docker 主要是用于在 Terraform 中构建 AWS 环境。因为我的环境是 Windows,所以只是使用 Docker,如果没有必要的话,不必特意创建它。
Dockerfile 可以进行本地运行的适应性翻译。
From python:3.7
ENV PYTHONUNBUFFERED 1
RUN apt-get update && apt-get install -y \
vim
RUN mkdir /terraform
WORKDIR /terraform
RUN mkdir .aws
ADD .aws .aws
RUN pip install awscli
RUN wget https://releases.hashicorp.com/terraform/0.12.24/terraform_0.12.24_linux_amd64.zip && \
unzip ./terraform_0.12.24_linux_amd64.zip -d /usr/local/bin/
RUN cp -r .aws ~
构建镜像
docker build -t work:ver1 .
启动容器
docker run -itd –name work –mount type=bind,source=”$(pwd)”/terraform/,target=/terraform/ work:ver1
准备GitHub
在GitHub上创建两个仓库(一个用于djangoproject,一个用于terraform)。
在途中,.gitignore文件没有排除terraform插件,导致100MB以上的文件被拒绝上传。下面的命令可以解决这个问题。参考文章的链接在这里:
https://www.walbrix.com/jp/blog/2013-10-github-large-files.html
$ git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch でかいファイル.tar.gz' \
--prune-empty --tag-name-filter cat -- --all
$ git commit --amend -CHEAD
$ git push
在CircleCI上进行CI的配置。
在CircleCI上,执行Django项目的构建,并将构建的Docker镜像推送到ECR。
流程如下:
1. 创建Django项目并推送到GitHub。
2. 使用CircleCI执行持续集成,CircleCI检出GitHub中的项目并构建Docker镜像。
3. 构建完成后,Docker镜像将被推送到ECR。
因此,我做了以下准备工作:
– 创建了适用于 Terraform 和 Django 项目的 Git 仓库
– 使用 Terraform 创建了 ECR 仓库
– 创建了 CircleCI 用户,用于将 Docker 镜像推送到 ECR
– 针对 Django 项目的 CI,配置了 CircleCI
创建ECR仓库
我创建了一个如下所示的文件夹结构来存放ECR仓库。
terraform/
|-ecr/
|-.terraform/
|-aws_ecr_repository.tf
|-config.tf
terraform/
|-ecr/
|-.terraform/
|-aws_ecr_repository.tf
|-config.tf
resource "aws_ecr_repository" "sample-image" {
name = "sample-image"
}
terraform {
backend "s3" {
bucket = "保管するS3バケットの名前"
key = "ecr/terraform.tfstate"
region = "ap-northeast-1"
}
}
provider "aws" {
region = "ap-northeast-1"
}
创建用于CircleCI的IAM用户
我为IAM使用的Terraform目录结构是这样的。
土壤改造/
|-身份和访问管理/
|-.terraform/
|-aws_身份和访问管理策略/
|-ecr策略.json
|-aws_身份和访问管理策略.tf
|-aws_用户策略附加.tf
|-aws_用户.tf
|-配置.tf
resource "aws_iam_user" "deploy-user" {
name = "deploy-user"
}
resource "aws_iam_policy" "deploy" {
name = "deploy"
path = "/"
description = "deploy policy"
policy = file("aws_iam_policies/ecr_policy.json")
}
resource "aws_iam_user_policy_attachment" "deploy-attach" {
user = aws_iam_user.deploy-user.name
policy_arn = aws_iam_policy.deploy.arn
}
terraform {
backend "s3" {
bucket = "保管するS3のバケットの名前"
key = "iam/terraform.tfstate"
region = "ap-northeast-1"
}
}
provider "aws" {
region = "ap-northeast-1"
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:DescribeRepositories",
"ecr:ListImages",
"ecr:BatchGetImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
"ecr:PutImage"
],
"Resource": "*"
}
]
}
根据上述的tf文件,通过执行terraform init、terraform plan、terraform apply命令来创建IAM用户。另外,从创建的用户的认证信息中获取访问密钥相关信息。这些信息在设置CircleCI的环境变量时需要事先准备好。
在中国当地人高手部署CircleCI
为Django项目进行设置。circleci/config.yml文件如下所示。
version: 2.1
orbs:
python: circleci/python@0.2.1
jobs:
build-and-test:
executor: python/default
steps:
- checkout
- python/load-cache
- python/install-deps
- python/save-cache
- run: sudo chmod u+x manage.py
- run:
command: ./manage.py test
name: Test
build-image:
docker:
- image: docker:18.09.0
steps:
- checkout
- setup_remote_docker
- run:
name: install aws cli
command: |
apk add --no-cache --update py-pip
pip install awscli
- run:
name: login ecr
command: |
$(aws ecr get-login --no-include-email --region ap-northeast-1)
- run:
name: build image
command: |
docker build -t ${ECR_DOMAIN}:$CIRCLE_SHA1 -t ${ECR_DOMAIN}:latest .
- run:
name: Push docker image
command: |
docker push ${ECR_DOMAIN}:$CIRCLE_SHA1
docker push ${ECR_DOMAIN}:latest
workflows:
main:
jobs:
- build-and-test
- build-image:
requires:
- build-and-test
filters:
branches:
only: master

当将包含此.circleci/config.yml的Django项目推送到GitHub时,CircleCI的流程将进入“RUN”状态,并将Docker镜像推送到ECR。