首页 > 编程问答 >哪些是实现生产部署自动化的最佳方法?

哪些是实现生产部署自动化的最佳方法?

时间:2024-05-31 23:32:49浏览次数:28  
标签:docker continuous-integration github-actions continuous-deployment cicd

我希望自动部署我的生产前端。我的前端部署在一个 docker 容器上,该容器在 Digital Ocean Droplet VPS(Ubuntu 24.04 (LTS) x64)上运行。目前,我按照以下步骤手动管理部署:

    在我的 PC 上,在我的项目根目录(Docker 文件所在位置),我通过运行以下命令在本地重建我的 docker 镜像: docker build -t ghcr.io/my-github-username/my-image-name:my-image-version .

    然后,我必须使用用户名和密码登录 GitHub 容器注册中心(密码是 GitHub 上生成的令牌,并非我在 GitHub 上的实际密码)。我通过运行 docker登录ghcr.io

如果你已经通过了身份验证,这一步可以省略(也不知道这一步是否可以自动化,因为运行该命令后,CLI会提示我输入用户名和密码)
  • 然后,我通过运行以下命令将更改推送到已经发布在 GitHub 容器注册表上的 docker 镜像中: docker push ghcr.io/my-github-username/my-image-name:my-image-version

  • 通过 SSH 登录我的 Digital Ocean Droplet VPS

  • 通过 SSH 登录我的 Digital Ocean Droplet VPS。

  • 由于映像在 GiHub 上是私有的,因此我需要在 VPS 上重做步骤 2,以便提取对映像所做的更改。

  • 登录成功后,运行以下命令从 GHCR 提取更改: docker pull ghcr.io/my-github-username/my-image-name:my-image-version

    运行以下命令,停止并删除使用过时旧镜像运行的容器: docker container rm -f <container id> (不知道是否有必要,但我就是这么做的)

  • 停止并删除使用旧的过时镜像运行的容器。

  • 再次创建容器,并在 VPS 的 3000 端口上公开它,方法是运行 docker run -p 3000:3000 ghcr.io/my-github-username/my-image-name:my-image-version

    运行所有步骤后,所有更改都将成功部署到生产中。

    我的问题是: Which are the best possible ways to automate this process? Any help is appreciated, sorry if this is kind of a noob question, but I really want to know multiple alternatives.

    如果您发布了可供选择的方法,请联系我们。

    如果您发布了替代方案,请强调其优缺点。


    想要自动化的前端部署流程,这很棒!手动进行操作既容易出错又耗时。以下是一些可以实现自动化的方法,以及每种方法的优缺点:

    1. GitHub Actions

    优点:

    • 与 GitHub 集成: 由于的代码已经在 GitHub 上,因此触发构建和部署管道的事件(例如,推送新的代码或创建新的标签)非常容易。
    • 易于使用: GitHub Actions 使用 YAML 文件进行配置,这些文件相对容易理解和编写,即使不熟悉 CI/CD。
    • 具有成本效益: GitHub Actions 为公共存储库提供免费层级,对于小型项目来说通常已经足够。

    缺点:

    • 有限的控制: 与在自己的服务器上运行的自托管解决方案相比,对底层基础设施的控制较少。
    • 供应商锁定: 将的部署流程绑定到 GitHub。

    实施:

    1. 创建一个 GitHub Actions 工作流: 在的存储库中,创建一个 .github/workflows 文件夹(如果它尚不存在),并在其中创建一个 YAML 文件(例如, deploy.yml )。
    2. 配置工作流: 在的 YAML 文件中,定义的工作流。这将包括:
      • 触发器: 何时运行工作流(例如,在 main 分支上推送)。
      • 作业: 需要执行的一系列步骤。
      • 步骤: 每个作业中的单个操作,例如,签出的代码、构建 Docker 映像、登录到 GHCR、推送映像以及将映像部署到的 Droplet。

    示例 deploy.yml 文件:

    name: Deploy to DigitalOcean
    
    on:
      push:
        branches: [ main ]
    
    jobs:
      deploy:
        runs-on: ubuntu-latest
    
        steps:
        - uses: actions/checkout@v2
    
        - name: Login to GitHub Container Registry
          uses: docker/login-action@v1
          with:
            username: ${{ secrets.GITHUB_USERNAME }}
            password: ${{ secrets.GITHUB_TOKEN }}
    
        - name: Build and push Docker image
          uses: docker/build-push-action@v2
          with:
            context: .
            push: true
            tags: ghcr.io/${{ secrets.GITHUB_USERNAME }}/my-image-name:latest
    
        - name: SSH into production server and update
          uses: appleboy/ssh-action@master
          with:
            host: ${{ secrets.DO_HOST }}
            username: ${{ secrets.DO_USERNAME }}
            key: ${{ secrets.DO_SSH_KEY }}
            script: |
              docker pull ghcr.io/${{ secrets.GITHUB_USERNAME }}/my-image-name:latest
              docker container rm -f <container id> || true
              docker run -p 3000:3000 ghcr.io/${{ secrets.GITHUB_USERNAME }}/my-image-name:latest
    
    1. 将秘密添加到的存储库设置中: 需要存储敏感信息,例如的 GHCR 用户名、GitHub 个人访问令牌 (PAT)、Droplet 的 IP 地址、用户名和 SSH 密钥。可以通过转到存储库设置 > 秘密来完成此操作。

    2. DigitalOcean App Platform

    优点:

    • 易于使用: DigitalOcean App Platform 非常人性化,即使对于没有太多 DevOps 经验的人来说也是如此。
    • 与 DigitalOcean 集成: 如果已经在使用 DigitalOcean,那么这将是一个很好的选择,因为它可以轻松地与其他 DigitalOcean 服务集成。
    • 自动扩展: App Platform 可以根据需要自动扩展的应用程序,从而确保最佳性能和成本效率。

    缺点:

    • 控制更少: 与其他解决方案相比,对部署环境的控制更少。
    • 供应商锁定: 将的部署流程绑定到 DigitalOcean。

    实施:

    1. 创建 DigitalOcean 帐户并连接的 GitHub 存储库。
    2. 配置的应用程序: 选择 "Docker from GitHub" 作为部署方法,并指定要部署的分支以及任何环境变量。
    3. 部署的应用程序: DigitalOcean 将处理构建和部署的 Docker 映像的过程。

    3. 其他 CI/CD 工具

    还有许多其他 CI/CD 工具可用于自动化的部署流程,例如:

    • Travis CI
    • CircleCI
    • GitLab CI/CD
    • Jenkins

    这些工具提供了更大的灵活性和控制力,但也可能需要更多配置。

    建议

    对于的用例,如果正在寻找与 GitHub 紧密集成的易于使用的解决方案,我建议使用 GitHub Actions 。如果更喜欢托管解决方案并希望充分利用 DigitalOcean 的生态系统,那么 DigitalOcean App Platform 是一个不错的选择。如果需要更大的灵活性和控制力,或者有一个更复杂的部署流程,那么可以考虑使用其他 CI/CD 工具之一。

    标签:docker,continuous-integration,github-actions,continuous-deployment,cicd
    From: 78560964

    相关文章

    • docker 镜像
      docker的镜像获取方式1通过开源的hubdocker仓库取拉去镜像2通过dockerfile文件取生产镜像3通过save命令去复制别的环境上的镜像,用于离线镜像操作1到仓库中获取镜像以下是一些常见的Docker国内镜像源:网易云Docker镜像:http://hub-mirror.c.163.com......
    • TDengine docker安装方法
      dockerrun-d--privileged=true\--restart=always--name=tdengine\-v/opt/taos/data:/var/lib/taos\-v/opt/taos/log:/var/log/taos\-v/usr/local/taos/driver/libtaos.so.3.2.0.0:/usr/lib/libtaos.so\-v/usr/share/zoneinfo:/usr/share/zoneinfo\-eTZ=A......
    • docker使用镜像jms_all部署jumpserver
      创建容器需要挂载出来的服务器对应目录mkdir-p/data/redis/datamkdir-p/opt/mysql/{data,conf,logs}docker安装redisdockerrun-d-it--nameredis-p6379:6379-v/data/redis/data:/data--restart=always......
    • Raven:一款功能强大的CICD安全分析工具
      关于RavenRaven是一款功能强大的CI/CD安全分析工具,该工具旨在帮助广大研究人员对GitHubActionsCI工作流执行大规模安全扫描,并将发现的数据解析并存储到Neo4j数据库中。Raven,全称为RiskAnalysisandVulnerabilityEnumerationforCI/CD,即针对CI/CD的风险分析和漏洞枚举......
    • docker-compose 安装 yapi
      docker-compose安装yapidocker-compose.yamlversion:'3'services:yapi-web:image:liuqingzheng/yapi:latestcontainer_name:yapi-webports:-3000:3000environment:[email protected]_ADMI......
    • linux 离线安装docker
      docker-ce下载地址很多情况下我们不能对docker进行在线安装,这时可以参照本篇博客尝试进行离线安装docker-ce1.下载对应版本的安装包2.解压安装包tar-zxvfdocker-XXX.tgz3.将解压的文件复制到指定位置cp./docker/*/usr/bin4.配置docker服务的文件如下cd/etc/syste......
    • Docker + maven build problem — unix://localhost:80: Permission denied
      使用docker-maven-plugin进行构建镜像报错如下:com.spotify.docker.client.shaded.org.apache.http.impl.execchain.RetryExecexecuteINFO:I/Oexception(java.io.IOException)caughtwhenprocessingrequestto{}->unix://localhost:80:Permissiondenied解决方案:Ad......
    • 面试专区|【DevOps-96道Docker 容器高频题整理(附答案背诵版)】
      简述什么是Docker容器?Docker容器是一个开源的应用容器引擎,它让开发者可以将他们的应用以及依赖包打包到一个可移植的容器中,然后发布到任何安装了Docker引擎的服务器上,包括流行的Linux机器、Windows机器等。Docker容器利用沙箱机制,使容器之间相互独立,互不影响。Docker容......
    • gitlab之cicd的gitlab-runner集成-dockerfile构建环境
      目录概述离线资源docker-compose问题docker-compose问题1问题2gitlab-runner集成gitlab概述  cicd引文目录是想通过dockerfile构建maven、jdk、docker环境的gitlab-runner运行环境。但docker最后测试的时候有点问题,且最后使用kubectl时有麻烦,所以放弃。但有......
    • 【docker】docker 下 MySQL偶然无法访问
      1.概述我有一个环境遇到了docker下MySQL偶然无法访问,具体情况如下可以被看到可以telnet通畅,这个jar是我自己研发的,主要这台机器是别人的没有装telnet但是任务还是报错所在机器telnet通但是无法登录,同事说遇到过比如网络卡或者不稳定,需要重启一下mysql我先去......