Skip to content

Commit

Permalink
readme: doc change to revamp
Browse files Browse the repository at this point in the history
  • Loading branch information
rotemtam committed Sep 28, 2023
1 parent 70f1a6b commit f5c4738
Show file tree
Hide file tree
Showing 2 changed files with 262 additions and 73 deletions.
198 changes: 125 additions & 73 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,61 +1,57 @@
# atlas-action
# GitHub Actions for Atlas

A GitHub Action for [Atlas](https://github.com/ariga/atlas).
This repository contains GitHub Actions for working with [Atlas](https://atlasgo.io).

This action is used for [linting migration directories](https://atlasgo.io/versioned/lint)
using the `atlas migrate lint` command. This command validates and analyzes the contents
of migration directories and generates insights and diagnostics on the selected changes:
If you are looking for the old TypeScript-based action, please see the old [README](doc/typescript-action.md).

* Ensure the migration history can be replayed from any point at time.
* Protect from unexpected history changes when concurrent migrations are written to the migration directory by
multiple team members.
* Detect whether destructive or irreversible changes have been made or whether they are dependent on tables'
contents and can cause a migration failure.
To learn more about the recommended way to build workflows, read our guide on
[Modern CI/CD for Databases](https://atlasgo.io/guides/modern-database-ci-cd).

### Supported directory formats
## Actions

This action supports analyzing migration directories in formats
accepted by different schema migration tools:
* [Atlas](https://atlasgo.io)
* [golang-migrate](https://github.com/golang-migrate/migrate)
* [goose](https://github.com/pressly/goose)
* [dbmate](https://github.com/amacneil/dbmate)
* [Flyway](https://flywaydb.org/)
* [Liquibase](https://www.liquibase.org/)
| Action | Description |
|----------------------------------------------------|---------------------------------------------------------|
| [ariga/setup-atlas](#setup-atlas) | Setup the Atlas CLI and optionally login to Atlas Cloud |
| [ariga/atlas-action/migrate/push](#migrate-push) | Push migrations to Atlas Cloud |
| [ariga/atlas-action/migrate/lint](#migrate-lint) | Lint migrations |
| [ariga/atlas-action/migrate/apply](#migrate-apply) | Apply migrations to a database |

### Usage
## Example

Add `.github/workflows/atlas-ci.yaml` to your repo with the following contents:
The Atlas GitHub Actions can be composed into workflows to create CI/CD pipelines for your database schema.
Workflows will normally begin with the `setup-atlas` action, which will install the Atlas CLI and optionally
login to Atlas Cloud. Followed by whatever actions you need to run, such as `migrate lint` or `migrate apply`.

### Continuous Integration and Delivery

This example workflow shows how to configure a CI/CD pipeline for your database schema. The workflow will
verify the safety of your schema changes when in a pull request and push migrations to Atlas Cloud when
merged into the main branch.

```yaml
name: Atlas CI
name: Atlas CI/CD
on:
# Run whenever code is changed in the master branch,
# change this to your root branch.
push:
branches:
- master
# Run on PRs where something changed under the `path/to/migration/dir/` directory.
pull_request:
paths:
- 'path/to/migration/dir/*'
- 'migrations/*'
# Permissions to write comments on the pull request.
permissions:
contents: read
pull-requests: write
jobs:
lint:
atlas:
services:
# Spin up a mysql:8.0.29 container to be used as the dev-database for analysis.
# If you use a different database, change the image configuration and update
# the `dev-url` configuration below.
# Spin up a mysql:8 container to be used as the dev-database for analysis.
mysql:
image: mysql:8.0.29
image: mysql:8
env:
MYSQL_DATABASE: dev
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: test
ports:
- "3306:3306"
- 3306:3306
options: >-
--health-cmd "mysqladmin ping -ppass"
--health-interval 10s
Expand All @@ -64,72 +60,128 @@ jobs:
--health-retries 10
runs-on: ubuntu-latest
steps:
- uses: actions/[email protected]
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: ariga/setup-atlas@v0
with:
cloud-token: ${{ secrets.ATLAS_CLOUD_TOKEN }}
- uses: ariga/atlas-action/migrate/lint@v1
with:
dir: 'file://migrations'
dir-name: 'my-project' # The name of the project in Atlas Cloud
dev-url: "mysql://root:pass@localhost:3306/dev"
- uses: ariga/atlas-action/migrate/push@v1
if: github.ref == 'refs/heads/master'
with:
dir: 'file://migrations'
dir-name: 'my-project'
dev-url: 'mysql://root:pass@mysql:3306/dev' # Use the service name "mysql" as the hostname
cloud-token: ${{ secrets.ATLAS_CLOUD_TOKEN }}
```
This example uses a MySQL database, but you can use any database supported by Atlas.
For more examples, see the [documentation](https://atlasgo.io/integrations/github-actions).
### Continuous Deployment
This example workflow shows how to configure a continuous deployment pipeline for your database schema. The workflow will
apply migrations on the target database whenever a new commit is pushed to the main branch.
```yaml
name: Atlas Continuous Deployment
on:
push:
branches:
- master
jobs:
apply:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: ariga/setup-atlas@v0
with:
fetch-depth: 0 # Mandatory unless "latest" is set below.
- uses: ariga/atlas-action@v0
cloud-token: ${{ secrets.ATLAS_CLOUD_TOKEN }}
- uses: ariga/atlas-action/migrate/apply@v1
with:
dir: path/to/migrations
dir-format: atlas
dev-url: mysql://root:pass@localhost:3306/test
url: 'mysql://user:${{ secrets.DB_PASSWORD }}@db.hostname.io:3306/db'
dir: 'atlas://my-project:latest' # A directory stored in Atlas Cloud
```
### Configuration
This example workflow shows how to configure a deployment pipeline for your database schema.
This workflow will pull the most recent version of your migration directory from Atlas Cloud
and apply it to the target database.
Configure the action by passing input parameters in the `with:` block.
For more examples, see the [documentation](https://atlasgo.io/integrations/github-actions).
#### `config-path`
## API
Sets the path to the Atlas configuration file. By default, Atlas will
look for a file named `atlas.hcl` in the current directory.
### `ariga/setup-atlas`

#### `config-env`
Setup the Atlas CLI and optionally login to Atlas Cloud.

Sets the environment to use from the Atlas configuration file.
#### Inputs
* `cloud-token` - (Optional) The Atlas Cloud token to use for authentication. To create
a cloud token see the [docs](https://atlasgo.io/cloud/bots).
* `version` - (Optional) The version of the Atlas CLI to install. Defaults to the latest
version.

#### `dir`
### `ariga/atlas-action/migrate/push`

Sets the directory that contains the migration scripts to analyze.
Push the current version of your migration directory to Atlas Cloud.

#### `dir-format`
#### Inputs

Sets the format of the migration directory. Options: `atlas` (default),
`golang-migrate`, `goose`, `dbmate`, `flyway`, or `liquibase`.
All inputs are optional as they may be specified in the Atlas configuration file.

#### `dev-url`
* `dir` - The URL of the migration directory to push. For example: `file://migrations`.
Read more about [Atlas URLs](https://atlasgo.io/concepts/url).
* `dir-name` - The name of the project in Atlas Cloud.
* `dev-url` - The URL of the dev-database to use for analysis. For example: `mysql://root:pass@localhost:3306/dev`.
Read more about [dev-databases](https://atlasgo.io/concepts/dev-database).
* `tag` - The tag to apply to the migration directory. By default the current git commit hash is used.
* `config` The path to the Atlas configuration file. By default, Atlas will look for a file
named `atlas.hcl` in the current directory. For example, `file://config/atlas.hcl`.
Learn more about [Atlas configuration files](https://atlasgo.io/atlas-schema/projects).
* `env` The environment to use from the Atlas configuration file. For example, `dev`.

The URL of the dev-database to use for analysis.
#### Outputs

* Read about [Atlas URL formats](https://atlasgo.io/concepts/url)
* Read about [dev-databases](https://atlasgo.io/concepts/dev-database)
* `url` - The URL of the migration directory in Atlas Cloud, containing an ERD visualization of the schema.

#### `latest`
### `ariga/atlas-action/migrate/lint`

Use the `latest` mode to decide which files to analyze. By default,
Atlas will use `git-base` to analyze any files that are present in the
diff between the base branch and the current.
TODO

Unless this option is set, the base branch (`master`/`main`/etc) must
be checked out locally or you will see an error such as:
```
Atlas failed with code 1: Error: git diff: exit status 128
```
### `ariga/atlas-action/migrate/apply`

Apply migrations to a database.

#### Inputs

### `cloud-token`
All inputs are optional as they may be specified in the Atlas configuration file.

Connect the action to [Atlas Cloud](https://atlasgo.cloud/) to get access to more analyzers,
entity relationship diagrams (ERDs) of your schema, and full CI reports.
Generate the token from within Atlas Cloud by creating a CI Bot. Read the full tutorial
[here](https://atlasgo.io/cloud/getting-started#connecting-to-the-atlas-github-action).
* `url` - The URL of the target database. For example: `mysql://root:pass@localhost:3306/dev`.
* `dir` - The URL of the migration directory to apply. For example: `atlas://dir-name` for cloud
based directories or `file://migrations` for local ones.
* `config` The URL of the Atlas configuration file. By default, Atlas will look for a file
named `atlas.hcl` in the current directory. For example, `file://config/atlas.hcl`.
Learn more about [Atlas configuration files](https://atlasgo.io/atlas-schema/projects).
* `env` The environment to use from the Atlas configuration file. For example, `dev`.

![atlas-cloud](https://atlasgo.io/uploads/images/issues-found-ci.png)
#### Outputs

The full list of input options can be found in [action.yml](action.yml).
* `current` - The current version of the database.
* `target` - The target version of the database.
* `pending_count` - The number of migrations that will be applied.
* `applied_count` - The number of migrations that have been applied.

### Legal
### Legal

The source code for this GitHub Action is released under the Apache 2.0
License, see [LICENSE](LICENSE).

This action downloads a binary version of [Atlas](https://atlasgo.io) which
is distributed under the [Ariga EULA](https://ariga.io/legal/atlas/eula).
is distributed under the [Ariga EULA](https://ariga.io/legal/atlas/eula).
137 changes: 137 additions & 0 deletions doc/typescript-action.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
# atlas-action (deprecated TypeScript action)

Note: This action is deprecated. Please use the latest version of the [Atlas Actions](../README.md).

A GitHub Action for [Atlas](https://github.com/ariga/atlas).

This action is used for [linting migration directories](https://atlasgo.io/versioned/lint)
using the `atlas migrate lint` command. This command validates and analyzes the contents
of migration directories and generates insights and diagnostics on the selected changes:

* Ensure the migration history can be replayed from any point at time.
* Protect from unexpected history changes when concurrent migrations are written to the migration directory by
multiple team members.
* Detect whether destructive or irreversible changes have been made or whether they are dependent on tables'
contents and can cause a migration failure.

### Supported directory formats

This action supports analyzing migration directories in formats
accepted by different schema migration tools:
* [Atlas](https://atlasgo.io)
* [golang-migrate](https://github.com/golang-migrate/migrate)
* [goose](https://github.com/pressly/goose)
* [dbmate](https://github.com/amacneil/dbmate)
* [Flyway](https://flywaydb.org/)
* [Liquibase](https://www.liquibase.org/)

### Usage

Add `.github/workflows/atlas-ci.yaml` to your repo with the following contents:

```yaml
name: Atlas CI
on:
# Run whenever code is changed in the master branch,
# change this to your root branch.
push:
branches:
- master
# Run on PRs where something changed under the `path/to/migration/dir/` directory.
pull_request:
paths:
- 'path/to/migration/dir/*'
# Permissions to write comments on the pull request.
permissions:
contents: read
pull-requests: write
jobs:
lint:
services:
# Spin up a mysql:8.0.29 container to be used as the dev-database for analysis.
# If you use a different database, change the image configuration and update
# the `dev-url` configuration below.
mysql:
image: mysql:8.0.29
env:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: test
ports:
- "3306:3306"
options: >-
--health-cmd "mysqladmin ping -ppass"
--health-interval 10s
--health-start-period 10s
--health-timeout 5s
--health-retries 10
runs-on: ubuntu-latest
steps:
- uses: actions/[email protected]
with:
fetch-depth: 0 # Mandatory unless "latest" is set below.
- uses: ariga/atlas-action@v0
with:
dir: path/to/migrations
dir-format: atlas
dev-url: mysql://root:pass@localhost:3306/test
```
### Configuration
Configure the action by passing input parameters in the `with:` block.

#### `config-path`

Sets the path to the Atlas configuration file. By default, Atlas will
look for a file named `atlas.hcl` in the current directory.

#### `config-env`

Sets the environment to use from the Atlas configuration file.

#### `dir`

Sets the directory that contains the migration scripts to analyze.

#### `dir-format`

Sets the format of the migration directory. Options: `atlas` (default),
`golang-migrate`, `goose`, `dbmate`, `flyway`, or `liquibase`.

#### `dev-url`

The URL of the dev-database to use for analysis.

* Read about [Atlas URL formats](https://atlasgo.io/concepts/url)
* Read about [dev-databases](https://atlasgo.io/concepts/dev-database)

#### `latest`

Use the `latest` mode to decide which files to analyze. By default,
Atlas will use `git-base` to analyze any files that are present in the
diff between the base branch and the current.

Unless this option is set, the base branch (`master`/`main`/etc) must
be checked out locally or you will see an error such as:
```
Atlas failed with code 1: Error: git diff: exit status 128
```

### `cloud-token`

Connect the action to [Atlas Cloud](https://atlasgo.cloud/) to get access to more analyzers,
entity relationship diagrams (ERDs) of your schema, and full CI reports.
Generate the token from within Atlas Cloud by creating a CI Bot. Read the full tutorial
[here](https://atlasgo.io/cloud/getting-started#connecting-to-the-atlas-github-action).

![atlas-cloud](https://atlasgo.io/uploads/images/issues-found-ci.png)

The full list of input options can be found in [action.yml](action.yml).

### Legal

The source code for this GitHub Action is released under the Apache 2.0
License, see [LICENSE](LICENSE).

This action downloads a binary version of [Atlas](https://atlasgo.io) which
is distributed under the [Ariga EULA](https://ariga.io/legal/atlas/eula).

0 comments on commit f5c4738

Please sign in to comment.