diff --git a/.circleci/config.yml b/.circleci/config.yml index 03baac51d..32e43f043 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,4 +1,4 @@ -version: 2 +version: 2.1 jobs: test: @@ -16,8 +16,28 @@ jobs: name: Run tests command: make test + deploy: + machine: + image: ubuntu-1604:201903-01 # https://circleci.com/docs/2.0/configuration-reference/#available-machine-images with Docker 18.09.3 + steps: + - checkout + - add_ssh_keys: + fingerprints: + - "d3:5f:9d:68:ea:12:9a:42:d3:d3:e1:db:b0:6a:fc:d2" + - run: + name: Generate new data, push to PokeAPI/api-data's staging branch, if master open a Pull Request towards PokeAPI/api-data's master branch + command: bash -x Resources/scripts/updater.sh + workflows: version: 2 - test: + test-and-deploy: jobs: - test + - deploy: + requires: + - test + filters: + branches: + only: + - master + - staging diff --git a/Resources/scripts/updater.sh b/Resources/scripts/updater.sh new file mode 100644 index 000000000..e2d077f62 --- /dev/null +++ b/Resources/scripts/updater.sh @@ -0,0 +1,211 @@ +#!/bin/bash +# Executed when the master branch of PokeAPI/pokeapi gets updated +# Runs in CircleCI +# Generates new data using the latest changes of PokeAPI/pokeapi in order to open a Pull Request towards PokeAPI/api-data + +set -o pipefail + +org='PokeAPI' +data_repo='api-data' +engine_repo='pokeapi' +branch_name='staging' +username='pokeapi-machine-user' +email='pokeapi.co@gmail.com' +staging_environment_url='https://pokeapi-test-b6137.firebaseapp.com/api/v2/' +production_environment_url='https://pokeapi.co/api/v2/' +data_repo_url='https://github.com/PokeAPI/api-data' +engine_circleci_status_url='https://app.circleci.com/pipelines/github/PokeAPI/pokeapi' +deploy_circleci_status_url='https://app.circleci.com/pipelines/github/PokeAPI/deploy' + +# Exit the script notifying the user about its success +cleanexit() { + echo "Exiting" + echo "$2" + if [ "$1" -gt "0" ]; then + notify_engine_pr "end_failed" + else + notify_engine_pr "end_success" + fi + exit $1 +} + +# Create and use a personal folder +prepare() { + mkdir -p ./repositories + cd repositories || cleanexit 1 "Failed to cd" +} + +# Check and return the number of the Pull Request that started this job +get_invokator_pr_number() { + if ! [ -z "$CIRCLE_PULL_REQUEST" ]; then + echo "${CIRCLE_PULL_REQUEST##*/}" + else + echo 'null' + fi +} + +# Clone the repository containing the static JSON files +clone() { + git clone "https://github.com/${org}/${data_repo}.git" "$data_repo" +} + +# Configure git to use the supplied user when committing +configure_git() { + git config --global user.name "$username" + git config --global user.email "$email" +} + +pr_input_updater_start() { + cat <
The staging branch will be deployed in our [staging environment]($staging_environment_url) and you will be able to review the entire API.

A Pull Request ([master](${data_repo_url}/tree/master)<-[staging](${data_repo_url}/tree/staging)) will be also created at [PokeAPI/api-data](${data_repo_url}/pulls) and assigned to the PokeAPI Core team to be reviewed. If approved and merged new data will soon be available worldwide at [pokeapi.co]($production_environment_url)" +} +EOF +} + +pr_input_updater_end_success() { + cat <
You can see the Pull Request deployed at our [staging environment]($staging_environment_url) when [CircleCI deploy]($deploy_circleci_status_url) will be finished (_check the started time of the last build_)" +} +EOF +} + +pr_input_updater_end_failed() { + cat <
The new data was generated using a copy of [${org}/${engine_repo}](https://github.com/${org}/${engine_repo}/commits/master) repository when the \`HEAD\` was pointing to \`${CIRCLE_SHA1}\`.

This Pull Request should have been deployed in our [staging environment]($staging_environment_url), check [here]($deploy_circleci_status_url) for the lastest build timestamp and status code.", + "head": "$branch_name", + "base": "master", + "assignees": [ + "Naramsim" + ], + "labels": [ + "api-data-update" + ] +} +EOF +} + +# Create a Pull Request to merge the branch recently pushed by the updater with the master branch +create_pr() { + engine_repo_pr_number=$(get_invokator_pr_number) + data_repo_pr_number=$(curl -H "Authorization: token $MACHINE_USER_GITHUB_API_TOKEN" -X POST --data "$(pr_input_content "$engine_repo_pr_number")" "https://api.github.com/repos/$org/$data_repo/pulls" | jq '.number') + if [[ "$data_repo_pr_number" = "null" ]]; then + cleanexit 1 "Couldn't create the Pull Request" + fi + echo "$data_repo_pr_number" +} + +pr_input_assignees_and_labels() { + cat <