feat: add ability to initialize a git repository out of band

This is useful in contexts where the repository directory may be created and interacted with via git-http-backend or other methods of updating a repository.
This commit is contained in:
Jose Diaz-Gonzalez
2018-04-01 23:13:11 -04:00
parent 72674e5c6c
commit 83f320ac8e
9 changed files with 120 additions and 12 deletions

View File

@@ -3,14 +3,30 @@
> Subcommands new as of 0.12.0
```
git:initialize <app> # Initialize a git repository for an app
git:report [<app>] [<flag>] # Displays a git report for one or more apps
git:set <app> <key> (<value>) # Set or clear a git property for an app
```
GIT-based deployment has been the traditional method of deploying applications in Dokku. As of v0.12.0, Dokku introduces a few ways to customize the experience of deploying via `git push`.
GIT-based deployment has been the traditional method of deploying applications in Dokku. As of v0.12.0, Dokku introduces a few ways to customize the experience of deploying via `git push`. A GIT-based deployment currently supports building applications via both [Buildpack](/docs/deployment/methods/buildpacks.md) and [Dockerfile](/docs/deployment/methods/dockerfiles.md).
## Usage
### Initializing an Application
When an application is created via `git push`, Dokku will create the proper `pre-receive` hook in order to execute the build pipeline. In certain cases - such as when fronting deploys with the [`git-http-backend`](https://git-scm.com/docs/git-http-backend) - this may not be correctly created. As an alternative, the `git:initialize` subcommand can be used to trigger this creation:
```shell
# on the Dokku host
# overrides any existing pre-receive hook
dokku git:initialize node-js-app
```
In order for the above command to succeed, the application _must_ already exist.
> Warning: If the pre-receive hook was customized in any way, this will overwrite that hook with the current defaults for Dokku.
### Changing the Deploy Branch
By default, Dokku will deploy code pushed to the `master` branch. In order to quickly deploy a different local branch, the following GIT command can be used:

View File

@@ -131,6 +131,7 @@
<a href="/{{NAME}}/deployment/methods/buildpacks/" class="list-group-item">Buildpack Deployment</a>
<a href="/{{NAME}}/deployment/methods/dockerfiles/" class="list-group-item">Dockerfile Deployment</a>
<a href="/{{NAME}}/deployment/methods/images/" class="list-group-item">Docker Image Deployment</a>
<a href="/{{NAME}}/deployment/methods/git/" class="list-group-item">Git Deployment</a>
<a href="/{{NAME}}/deployment/methods/tar/" class="list-group-item">Tarfile Deployment</a>
<a href="#" class="list-group-item disabled">Configuration</a>

View File

@@ -1,6 +1,7 @@
#!/usr/bin/env bash
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_AVAILABLE_PATH/git/functions"
source "$PLUGIN_AVAILABLE_PATH/git/internal-functions"
case "$1" in
git-hook)
@@ -16,7 +17,7 @@ case "$1" in
;;
help | git:help)
echo -n ""
cmd-git-help "$@"
;;
*)

View File

@@ -211,15 +211,7 @@ git_glob_cmd() {
if [[ $1 == "git-receive-pack" && ! -d "$APP_PATH/refs" ]]; then
[[ ! -d "$DOKKU_ROOT/$APP" ]] && apps_maybe_create "$APP"
git init --bare "$APP_PATH" > /dev/null
local PRERECEIVE_HOOK="$APP_PATH/hooks/pre-receive"
cat > "$PRERECEIVE_HOOK" <<EOF
#!/usr/bin/env bash
set -e; set -o pipefail;
cat | DOKKU_ROOT="$DOKKU_ROOT" dokku git-hook $APP
EOF
chmod +x "$PRERECEIVE_HOOK"
fn-git-create-hook "$APP"
fi
if [[ $1 == "git-receive-pack" ]]; then
@@ -229,3 +221,22 @@ EOF
fi
git-shell -c "$args"
}
fn-git-create-hook() {
declare APP="$1"
local APP_PATH="$DOKKU_ROOT/$APP"
local PRERECEIVE_HOOK="$APP_PATH/hooks/pre-receive"
verify_app_name "$APP"
if [[ ! -d "$APP_PATH/refs" ]]; then
git init --bare "$APP_PATH" > /dev/null
fi
cat > "$PRERECEIVE_HOOK" <<EOF
#!/usr/bin/env bash
set -e; set -o pipefail;
cat | DOKKU_ROOT="$DOKKU_ROOT" dokku git-hook $APP
EOF
chmod +x "$PRERECEIVE_HOOK"
}

View File

@@ -40,3 +40,30 @@ cmd-git-report() {
[[ "$value_exists" == "true" ]] || dokku_log_fail "not deployed"
fi
}
git_help_content_func() {
declare desc="return git plugin help content"
cat<<help_content
git:initialize <app>, Initialize a git repository for an app
git:report [<app>] [<flag>], Displays a git report for one or more apps
git:set <app> <property> (<value>), Set or clear a git property for an app
help_content
}
cmd-git-help() {
if [[ $1 = "git:help" ]] ; then
echo -e 'Usage: dokku git[:COMMAND]'
echo ''
echo 'Manages the git integration for an app.'
echo ''
echo 'Additional commands:'
git_help_content_func | sort | column -c2 -t -s,
echo ''
elif [[ $(ps -o command= $PPID) == *"--all"* ]]; then
git_help_content_func
else
cat<<help_desc
git, Manages the git integration for an app
help_desc
fi
}

View File

@@ -0,0 +1,5 @@
#!/usr/bin/env bash
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_AVAILABLE_PATH/git/internal-functions"
cmd-git-help "git:help"

View File

@@ -0,0 +1,16 @@
#!/usr/bin/env bash
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_AVAILABLE_PATH/git/functions"
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
git-initialize-cmd() {
declare desc="initialize a git repository for an app"
local cmd="git:initialize" argv=("$@"); [[ ${argv[0]} == "$cmd" ]] && shift 1
declare APP="$1"
is_valid_app_name "$APP"
dokku_log_info1_quiet "Initializing git repository for $APP"
fn-git-create-hook "$APP"
}
git-initialize-cmd "$@"

View File

@@ -14,7 +14,7 @@ fn-in-array() {
}
git-set-cmd() {
declare desc="sets a git configuration value for an app"
declare desc="set or clear a git property for an app"
local cmd="git:set" argv=("$@"); [[ ${argv[0]} == "$cmd" ]] && shift 1
declare APP="$1" KEY="$2" VALUE="$3"
local VALID_KEYS=("deploy-branch" "rev-env-var")

View File

@@ -86,4 +86,35 @@ teardown() {
echo "output: "$output
echo "status: "$status
assert_output_exists
}
@test "(git) git:initialize" {
run bash -c "test -d $DOKKU_ROOT/$TEST_APP/refs"
echo "output: "$output
echo "status: "$status
assert_failure
run bash -c "dokku git:initialize $TEST_APP"
echo "output: "$output
echo "status: "$status
assert_success
run bash -c "test -d $DOKKU_ROOT/$TEST_APP/refs"
echo "output: "$output
echo "status: "$status
assert_success
}
@test "(git) git:initialize via deploy" {
run bash -c "test -d $DOKKU_ROOT/$TEST_APP/refs"
echo "output: "$output
echo "status: "$status
assert_failure
deploy_app
run bash -c "test -d $DOKKU_ROOT/$TEST_APP/refs"
echo "output: "$output
echo "status: "$status
assert_success
}