准备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

image.png

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

bannerAds