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:
@@ -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:
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 "$@"
|
||||
;;
|
||||
|
||||
*)
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
5
plugins/git/subcommands/default
Executable file
5
plugins/git/subcommands/default
Executable 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"
|
||||
16
plugins/git/subcommands/initialize
Executable file
16
plugins/git/subcommands/initialize
Executable 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 "$@"
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user