shopsys/deployment

简化了Shopsys平台应用程序在Kubernetes中的部署。它提供了一套直观的工具和配置,使您能够无缝编排和管理部署过程。

安装次数: 29,621

依赖项: 1

建议者: 0

安全: 0

星级: 0

关注者: 6

分支: 0

开放问题: 0

语言:Shell

v3.2.5 2024-09-20 11:53 UTC

README

如何安装

  1. 安装包 composer require shopsys/deployment

  2. deploy-project.sh 复制到您的项目中到 deploy/deploy-project.sh

  3. 创建或复制 带有登录凭证的htpasswd文件到 deploy/basicHttpAuth

    basicHttpAuth的默认登录为 username/password 关于如何更改http认证凭证的信息,请参阅更改HTTP认证

  4. 更新您的 gitlab-ci.yml

    • 创建一个名为deploy的新阶段

      stages:
          - build
          - test
          - review
      +   - deploy
          - service
    • 添加新的部署模板

      .deploy: &deploy
          image:
              name: shopsys/kubernetes-buildpack:0.9
          stage: deploy
          tags:
              - docker
          rules:
              -   if: '$CI_PIPELINE_SOURCE == "schedule"'
                  when: never
          script:
              - docker create -ti --name image ${TAG} bash
              - docker cp image:/var/www/html/var/ ./
              - mkdir -p /root/.kube/ && echo "${KUBE_CONFIG}" > /root/.kube/config
              - chmod +x ./deploy/deploy-project.sh && ./deploy/deploy-project.sh deploy
    • 添加用于部署开发和生产的作业

      deploy:production:
          <<: *deploy
          resource_group: deploy_production
          variables:
              KUBE_CONFIG: ${KUBE_CONFIG_PROD}
          needs:
              - build
          rules:
              -   if: '$CI_PIPELINE_SOURCE == "schedule"'
                  when: never
              -   if: '$CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH =~ /^master-.*$/'
                  when: manual
                  allow_failure: false
          environment:
              name: production
              url: https://${DOMAIN_HOSTNAME_1}
      
      deploy:devel:
          <<: *deploy
          resource_group: deploy_devel
          variables:
              KUBE_CONFIG: ${KUBE_CONFIG_DEVEL}
          needs:
              - build
              - test:standards
              - test:functional
              - test:acceptance
          rules:
              -   if: '$CI_PIPELINE_SOURCE == "schedule"'
                  when: never
              -   if: '$CI_COMMIT_BRANCH == "devel" || $CI_COMMIT_BRANCH =~ /^devel-.*$/'
          environment:
              name: devel
              url: https://${DOMAIN_HOSTNAME_1}
  5. 在Gitlab中设置环境变量(设置 -> CI/CD -> 变量)

  6. 推送更改并享受乐趣

环境变量

环境变量可以在Gitlab(设置 -> CI/CD -> 变量)中设置

如果您想定义自定义变量,请参阅定义自定义变量部分

*1)凭据可以在Gitlab(设置 -> 仓库 -> 部署令牌)中生成,仅具有read_registry作用域

您可以添加自定义变量。不要忘记编辑deploy-project.sh

自定义部署

您可以通过将自定义清单放入项目中orchestration/kubernetes/路径来覆盖Kubernetes清单

您需要镜像文件夹才能覆盖清单

创建新的cron实例

  1. 创建运行cron的新Phing目标

       <target name="cron-customers" description="....">
           <exec executable="${path.php.executable}" passthru="true" checkreturn="true">
               <arg value="${path.bin-console}" />
               <arg value="shopsys:cron" />
               <arg value="--instance-name=customers" />
           </exec>
       </target>
  2. 在部署配置文件deploy-project.sh中声明新的cron

    键使用在步骤1中创建的Phing目标,值表示crontab定时器

        ...
        declare -A CRON_INSTANCES=(
            ["cron"]='*/5 * * * *'
    +       ["cron-customers"]='*/5 * * * *'
        )
        ...

添加更多或更少的域名

此示例将使用3个域名

  1. 为每个域名创建环境变量

  2. 编辑deploy-project.sh

    ...
    function deploy() {
        DOMAINS=(
            DOMAIN_HOSTNAME_1
            DOMAIN_HOSTNAME_2
    +       DOMAIN_HOSTNAME_3
        )
    ...

定义自定义变量

  1. 创建环境变量
  2. 编辑deploy-project.sh
    ...
    declare -A ENVIRONMENT_VARIABLES=(
        ["DATABASE_HOST"]=${POSTGRES_DATABASE_IP_ADDRESS}
        ["DATABASE_NAME"]=${PROJECT_NAME}
        ["DATABASE_PORT"]=${POSTGRES_DATABASE_PORT}
    )
    ...
    左侧是应用程序中变量的名称,右侧是Gitlab中变量的名称。

设置自定义Redis版本

将新变量添加到deploy/deploy-project.sh并指定您的redis版本

  ...
  BASIC_AUTH_PATH="${BASE_PATH}/deploy/basicHttpAuth"
  DEPLOY_TARGET_PATH="${BASE_PATH}/var/deployment/deploy"
+ REDIS_VERSION='redis:4.0-alpine'

  function deploy() {
  ...

启用水平Pod自动扩展

将新变量添加到deploy/deploy-project.sh以启用Pod自动扩展

  • 启用此功能
    ...
    function deploy() {
        DOMAINS=(
            DOMAIN_HOSTNAME_1
            ...
        )
      
    +   ENABLE_AUTOSCALING=true
    ...
  • 如果您需要更多副本,则使用参数MAX_PHP_FPM_REPLICAS指定最大副本数(默认为2个副本)

如何仅启动某些域名

将新数组FORCE_HTTP_AUTH_IN_PRODUCTION添加到deploy/deploy-project.sh,其中包含应无HTTP认证不可访问的域名

...
    )

+   # This setting has no effect when `RUNNING_PRODUCTION` is set to `0`
+   FORCE_HTTP_AUTH_IN_PRODUCTION=(
+       DOMAIN_HOSTNAME_2
+   )

    declare -A ENVIRONMENT_VARIABLES=(
...

更改HTTP认证

  1. 生成新的HTTP认证字符串(例如这里),或通过命令htpasswd -nb username password
  2. 将新的HTTP认证字符串替换或添加到deploy/basicHttpAuth
  3. deploy/deploy-project.sh中将新凭据设置到变量中
...
function deploy() {
    DOMAINS=(
        DOMAIN_HOSTNAME_1
        ...
    )
  
+   HTTP_AUTH_CREDENTIALS="username:password"
...

白名单IP地址

只需将IP地址添加到deploy/deploy-project.sh中的WHITELIST_IPS变量即可

提示:最好将所有IP地址描述如下

#              Some IP   Another IP    Some service
WHITELIST_IPS="8.8.8.8, 217.23.44.23, 93.111.234.111"

在Slack中通知部署

您可以直接在Slack频道中启用部署的自动通知。它有一些功能

  1. 通知部署的开始,并预览功能

Notify about starting of deployment with preview of features

提示

如果您使用Jira,并在提交信息中使用[ABC-123],则它将自动创建一个链接到由JIRA_URL环境变量指定的URL

提示

脚本会排除包含!ignore关键词的提交

  1. 通知部署结束。有两种可能的警报 - 成功和错误

Notify about end of deployment

此脚本仅适用于Gitlab和Slack,但您可以通过覆盖deploy/slack-notification.py来更改行为。对于Slack,您必须创建一个具有权限(chat:writechat:write.public)的Slack应用。

下表中必须设置一些环境变量列表