帮服务建置布署流程至 EC2

有了建置 Image 的流程,和前後端分离的机制,接着我们就可以设定 CICD 的流水线来进行服务自动建置和布署。话不多说了直接演示如下,

专案的资料夹结构

code
  frontend
  backend

流水线设计内容:

variables:
  API_HOME: "code/backend"
  FRONT_HOME: "code/frontend"
  PROJECT_NAME: "Test"
  DOCKER_REGISTRY: "hub.docker.com"
  DOCKER_WEB_SERVER_BE: "be"
  DOCKER_WEB_SERVER_FE: "fe"
  
.only_fe_rd_template: &only_fe_rd # 前端的一个共用模板
  only:
    refs:
      - deploy # 触发的 branch
    changes:
      - "code/frontend/**/*" # 触发的目录
  except: # 不会触发 CICD 的档案设定
    changes:
      - "code/frontend/**/*.md"
      - "code/frontend/.vscode"

.only_be_rd_template: &only_be_rd # 後端的一个共用模板
  only:
    refs:
      - deploy
    changes:
      - "code/backend/**/*"

.docker_build_template: &docker_build_rd
  image: docker:latest
  services:
    - docker:dind
  variables:
    DOCKER_DRIVER: overlay2

.docker_deploy_template: &docker_deploy_rd
  image: kroniak/ssh-client
  services:
    - docker:dind
  before_script:
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
    - echo "$DEV_SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
    - chmod 600 ~/.ssh/id_rsa  
  
stages:
  - rd:docker-build-fe
  - rd:docker-build-be
  - rd:deploy-fe
  - rd:deploy-be

before_script:
- export GRADLE_USER_HOME=`pwd`/$API_HOME/.gradle

# Docker build
front-end-docker-build-rd:
  stage: rd:docker-build-fe
  <<: *docker_build_rd # 注入模板
  script:
    - echo "build fe"
  <<: *only_fe_rd
  tags:
    - m4-large # gitlab runner 名称

back-end-docker-build-rd:
  stage: rd:docker-build-be
  <<: *docker_build_rd
  script:
    - echo "build be"
  <<: *only_be_rd
  tags:
    - m4-large
 
## Deploy
ap1-deploy-fe-rd:
  stage: rd:deploy-fe
  dependencies: # 触发此流水线前要先完成什麽
    - front-end-docker-build-rd
  <<: *docker_deploy_rd
  script:
    - touch fe.md
  tags:
    - m4-large
  <<: *only_fe_rd

ap1-deploy-be-rd:
  stage: rd:deploy-be
  <<: *docker_deploy_rd
  dependencies:
    - back-end-docker-build-rd
  script:
    - ssh $DEV_AWS_USER@$DEV_SERVER_IP "docker login -u $REPOSITORY_ACCOUNT -p $REPOSITORY_PASSWORD DOCKER_REGISTRY"
    - ssh $DEV_AWS_USER@$DEV_SERVER_IP "touch be.md"
  <<: *only_be_rd
  tags:
    - m4-large
  when: manual # 手动触发

EC2 上 Runner 建立

~$ mkdir -p gitlab-runner/config
~$ docker run -d --name aiot-runner --restart always -v $(pwd)/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest
~$ docker run --rm -it -v $(pwd)/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register

Docker 主版 20 以上碰到 DinD 的问题,解决方式如下链结1986 issues

EC2 与流水线连线建立

在 EC2 建立一个 SSH Key,

ssh-keygen -m PEM -t rsa -b 4096 -C "Some info..."

.pub 档附加至 .ssh/authorized_keys 档案中

再 gitlab 上 setting -> CI/CD -> Variables 设置 SSH private keyIP 以进行连线存取。

下面是触发资料夹下的内容,如果有达到流水线 changes 的规则会有以下结果,

  1. Frontend 触发, Build -> deploy
  2. Backend 触发,Build -> deploy
  3. 都触发,Build(Frontend) -> deploy -> Build(Backend) -> deploy

参考资源

  1. https://docs.gitlab.com/ee/ci/yaml/#onlyexcept-advanced
  2. https://docs.gitlab.com/ee/ci/yaml/#rules

<<:  Day 5 基本 flask 函式 (2)

>>:  [Day01] - 旅途开始前的茶室闲聊

Day 11 : PHP - 如何将HTML的内容传送到PHP?POST和GET又该如何选择?

这篇想和大家介绍如何将HTML的内容传送到PHP 因为HTML呈现的是网页的画面,若想做些运算或储存...

Day16 - 汇出 excel-应用篇

前言 不论是产各式报表,都与 Excel 脱离不了关系,产 Excel 属於必备技能之一,以下示范如...

【Day 26】迁移学习(Transfer Learning)(上)

Transfer Learning的意思是,假设你现在有一些跟你的task没有直接相关的data,那...

Day-14 请说明 Ruby 中的 self 是什麽意思?

我们常常会在程序里看到 self 这个字,但是他到底是什麽?初心者一定困惑的一个字。 我觉得在 R...

DAY 18 『 画面间跳页传值 - Protocol And Delegate 』

昨天介绍完如何跳页,今天将会分享如何跳页传值。 成品: 刚执行模拟器的样子 按下 Button 後会...