paint-brush
CI/CD 步骤中的简单数据库迁移脚本by@mindsky
6,573
6,573

CI/CD 步骤中的简单数据库迁移脚本

我在 DevOps 写作竞赛的几份提交作品中看到了许多出色的高水平作品。然而,很少有人考虑如何在每天工作时使常见备用数据库(开发、阶段、生产等)上的数据库保持最新。本文适用于新手开发人员。我以Spring为例演示了一种将数据库迁移系统引入CI/CD流程的简单技术。
featured image - CI/CD 步骤中的简单数据库迁移脚本
Aleksander Tyryshkin HackerNoon profile picture
0-item
1-item

我在DevOps 写作竞赛的几份提交作品中看到了许多出色的高水平作品。然而,很少有人考虑如何在每天工作时使常见备用数据库(开发、阶段、生产等)的数据库保持最新。本文适用于新手开发人员。我以Spring为例演示了一种将数据库迁移系统引入CI/CD流程的简单技术。

我们将需要 Liquibase 和 GitLab CI/CD 工具来进行此部署。目前假设数据库已启动并正在运行。我将使用 PostgreSQL。

亚搏体育appGitLab CI/CD

如果您已经部署了 GitLab,则可以完全跳过此步骤。


为了部署Gitlab,我们将使用Docker方法。需要注意的是,我们需要创建$GITLAB_HOME变量。


 sudo docker run --detach \ --hostname gitlab.devopscontest.com \ --publish 443:443 --publish 80:80 --publish 22:22 \ --name gitlab \ --restart always \ --volume $GITLAB_HOME/config:/etc/gitlab \ --volume $GITLAB_HOME/logs:/var/log/gitlab \ --volume $GITLAB_HOME/data:/var/opt/gitlab \ --shm-size 256m \ gitlab/gitlab-ee:16.4.1-ee.0


下一步是安装和配置运行器。


如果您已经有一个长期运行的项目并且所有内容都已设置很长时间,则可以跳过创建新的运行程序。


亚搏体育appGitLab持续集成


我将使用版本 16.4.1 作为示例来展示跑步者的创建。 17.0 之后的任何内容都会使用RUNNER_AUTHENTICATION_TOKEN进行注册,但该方法接近当前的方法。


GitLab 17.0 之前的流程


GitLab 17.0 之后的流程


首先,您需要安装运行器源。为了通过 bash 在已部署的 GitLab 上安装它,此示例帮助您如何为基于 Apple Silicon 的系统安装运行程序(您可以在此处找到其他操作系统):


 # Download the binary for your system sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64 # Give it permission to execute sudo chmod +x /usr/local/bin/gitlab-runner # Create a GitLab Runner user sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash # Install and run as a service sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner sudo gitlab-runner start


现在,我们可以通过单击New project runner按钮,通过 UI 创建运行程序本身。


创建新的跑步者


每个运行器都可以有一个平台、显示为蓝色的标签以及其他运行时配置。当我们需要设置从程序运行命令的可能性时,标签就派上用场了。目前,我们对其他一切都不感兴趣。


创建跑步者后


单击Create runner后,唯一要做的就是注册您的跑步者。


 # Command to register runner gitlab-runner register --url https://gitlab.devopscontest.com/ --registration-token glrt-bjyfCR5pM5wypQDdfSqU


液体碱

Liquibase是一个用于管理数据库迁移的免费开源平台。总之,Liquibase 允许您使用变更集文件描述汇总和回滚过程。脚本本身可以是传统的 SQL 命令,也可以是独立于数据库的修改描述,这些修改将转换为适合您的数据库的脚本。此处提供了支持的数据库列表。


我将向您展示一种在 Spring 应用程序中执行迁移的方法。这是必要的,以便您可以将所有更改集的执行作为单独的步骤进行控制。

项目

要快速开发 Spring 应用程序,请转到此处


春季初始化


现在让我们快速创建application.yml.应特别注意启用和更改日志选项。第一个选项在应用程序级别启用和禁用 Liquibase,而第二个选项则设置更改日志的路径。


 server: port: 80 spring: datasource: username: ${DB_USERNAME} password: ${DB_PASSWORD} url: ${DB_HOST} liquibase: enabled: true change-log: classpath:db/changelog/db.changelog-master.xml


如何处理变量?

将它们放入 GitLab 是一个很好的做法,这将有助于在开发/生产站之间灵活定制应用程序。


GitLab 中的变量


我们在项目中使用 Kubernetes,这些参数必须由团队在使用针对各种方案预先配置的值文件构建应用程序时自行设置



 env: - name: SPRING_PROFILES_ACTIVE value: "dev" - name: DB_HOST value: "jdbc:postgresql://127.0.0.1:5436/your_db" - name: DB_USERNAME value: "user" - name: DB_PASSWORD value: "pass"



让我们回到定制。在我看来,创建完全自给自足并准备立即部署的应用程序是一种明智的做法。为了进一步在 CI/CD 中构建一个独特的阶段,让我们构建一个迁移文件。我们可以针对不同的团队使用不同的工具,并且我们不限于使用此文件的迁移系统。


 #!/bin/sh cd /opt/app /opt/app/liquibase \ --changeLogFile=./db/changelog/changelog-master.xml \ --url="$DB_HOST" \ --username="$DB_USERNAME" \ --password="$DB_PASSWORD" \ --logLevel=info \ --headless=true \ update



所有可能的命令都可以在Liquibase 文档中找到。现在我们只需要update ,它允许我们从changelog-master.xml 文件更新到当前版本。

下一步是在项目根目录创建一个 .gitlab-ci.yml 文件,其中包含有关如何继续 CI/CD 过程的说明。


首先,我想提请注意gitlab-ci.yml文件的内置链接器,该文件可以在项目中的相对路径ci/lint中找到。在修改配置之前,我建议使用它。它还假设您知道如何使用 YAML 文件。

阶段和工作

stages: - publish - dev .migrate: stage: publish allow_failure: true script: - ./migrate.sh Migrate: tags: - migration extends: .migrate environment: name: dev

migration标签指示我们之前生成的运行器对此任务做出反应并运行script部分中的脚本。 stage字符串标识该作业所属的阶段。如有必要,同一个跑步者可以同时处理多个项目。环境块指的是环境。这是一种仪表板,您可以在其中查看站的状态(开发、预生产、生产等)并采取手动部署等操作。此外,还可以配置环境绑定变量;但是,我还没有机会测试这个高级功能。


拒绝有错误的措施

设置合并请求


如果部署过程出现问题,您可以停止相应的合并。特别是,如果测试作为独立阶段集成到 CI/CD 中,这会很有帮助。尽管 Liquibase 在我们的示例中没有进行测试,但如果输入不正确的文件路径,它可能会出现故障。


如果在配置 CI/CD 后未勾选该复选框,则所有合并将不会被允许。


最后的润色

项目


让我们创建一个迁移文件并启用它。为此,我们需要创建changelog-master.xml文件作为输入点。


为了更灵活的管理,最好有多个changelog.xml。您可以根据它们构建变更日志层次结构。然而,在我们的示例中,我们将使用一种更简单的方法。


 <?xml version="1.1" encoding="UTF-8" standalone="no"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-4.1.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd"> <include file="db/changelog/changeset-202310151300-create-table.sql"/> </databaseChangeLog>


使用日期和时间命名迁移是一个很好的做法。这将避免在大型开发团队同时工作时破坏迁移的排序。


 --liquibase formatted sql --changeset a.tyryshkin:create-table create table if not exists table ( id bigserial primary key, name varchar(255) ); create sequence if not exists table_id_seq;


您可以使用不同的 XML、YAML 或 JSON 格式来描述迁移,但根据我的口味,SQL 是最容易阅读的。


管道


我们努力去执行,一切都会成功。检查我们的数据库并查看数据库更改日志中的条目。



数据库中的行


结论

在本文中,我们讨论了如何自行部署 GitLab、下载和配置运行程序,以及最重要的是将数据库迁移系统集成到 CI/CD 流程中。我希望本指南能够帮助您将本指南付诸实践。