mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-09 21:21:14 +00:00
Merge pull request #3099 from proppy/git-sync
contrib: add git-sync container
This commit is contained in:
4
contrib/git-sync/Dockerfile
Normal file
4
contrib/git-sync/Dockerfile
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
FROM golang:1.4-onbuild
|
||||||
|
VOLUME ["/git"]
|
||||||
|
ENV GIT_SYNC_DEST /git
|
||||||
|
ENTRYPOINT ["/go/bin/git-sync"]
|
16
contrib/git-sync/README.md
Normal file
16
contrib/git-sync/README.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# git-sync
|
||||||
|
|
||||||
|
git-sync is a command that pull a git repository to a local directory.
|
||||||
|
|
||||||
|
It can be used to source a container volume with the content of a git repo.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```
|
||||||
|
# build the container
|
||||||
|
docker build -t git-sync .
|
||||||
|
# run the git-sync container
|
||||||
|
docker run -d GIT_SYNC_REPO=https://github.com/GoogleCloudPlatform/kubernetes -e GIT_SYNC_BRANCH=gh-pages -r HEAD -v /git-data:/git git-sync
|
||||||
|
# run a nginx container to serve sync'ed content
|
||||||
|
docker run -d -p 8080:80 -v /git-data:/usr/share/nginx/html nginx
|
||||||
|
```
|
30
contrib/git-sync/demo/README.md
Normal file
30
contrib/git-sync/demo/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# git-blog-demo
|
||||||
|
|
||||||
|
This demo shows how to use the `git-sync` sidekick container along side `volumes` and `volumeMounts` to create a markdown powered blog.
|
||||||
|
|
||||||
|
## How it works
|
||||||
|
|
||||||
|
The pod is composed of 3 containers that share directories using 2 volumes:
|
||||||
|
|
||||||
|
- The `git-sync` container clones a git repo into the `markdown` volume
|
||||||
|
- The `hugo` container read from the `markdown` volume and render it into the `html` volume.
|
||||||
|
- The `nginx` container serve the content from the `html` volume.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Build the demo containers, and push them to a registry
|
||||||
|
|
||||||
|
```
|
||||||
|
docker build -t <some-registry>/git-sync ..
|
||||||
|
docker build -t <some-registry>/hugo hugo/
|
||||||
|
docker push <some-registry>/hugo <some-registry>/git-sync
|
||||||
|
```
|
||||||
|
|
||||||
|
Create the pod and the service for the blog
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl pods create config/pod.html
|
||||||
|
kubectl services create config/pod.html
|
||||||
|
```
|
||||||
|
|
||||||
|
Open the service external ip in your browser
|
0
contrib/git-sync/demo/blog/archetypes/.keep
Normal file
0
contrib/git-sync/demo/blog/archetypes/.keep
Normal file
3
contrib/git-sync/demo/blog/config.toml
Normal file
3
contrib/git-sync/demo/blog/config.toml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
baseurl = "http://example.com"
|
||||||
|
languageCode = "en-us"
|
||||||
|
title = "example blog"
|
9
contrib/git-sync/demo/blog/content/about.md
Normal file
9
contrib/git-sync/demo/blog/content/about.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
+++
|
||||||
|
date = "2014-12-19T15:29:48-08:00"
|
||||||
|
draft = true
|
||||||
|
title = "about"
|
||||||
|
+++
|
||||||
|
|
||||||
|
## A headline
|
||||||
|
|
||||||
|
Some content about the blog.
|
9
contrib/git-sync/demo/blog/content/post/first.md
Normal file
9
contrib/git-sync/demo/blog/content/post/first.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
+++
|
||||||
|
date = "2014-12-19T15:30:18-08:00"
|
||||||
|
draft = true
|
||||||
|
title = "first"
|
||||||
|
+++
|
||||||
|
|
||||||
|
## first port
|
||||||
|
|
||||||
|
This is the first post.
|
0
contrib/git-sync/demo/blog/layouts/.keep
Normal file
0
contrib/git-sync/demo/blog/layouts/.keep
Normal file
0
contrib/git-sync/demo/blog/static/.keep
Normal file
0
contrib/git-sync/demo/blog/static/.keep
Normal file
50
contrib/git-sync/demo/config/pod.yaml
Normal file
50
contrib/git-sync/demo/config/pod.yaml
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
id: blog-pod
|
||||||
|
kind: Pod
|
||||||
|
apiVersion: v1beta1
|
||||||
|
desiredState:
|
||||||
|
manifest:
|
||||||
|
version: v1beta1
|
||||||
|
containers:
|
||||||
|
- name: git-sync
|
||||||
|
image: proppy/git-sync
|
||||||
|
imagePullPolicy: PullAlways
|
||||||
|
env::
|
||||||
|
- name: GIT_SYNC_REPO
|
||||||
|
value: https://github.com/proppy/blog.git
|
||||||
|
- name: GIT_SYNC_DEST
|
||||||
|
value: /git
|
||||||
|
volumeMounts:
|
||||||
|
- name: markdown
|
||||||
|
mountPath: /git
|
||||||
|
- name: hugo
|
||||||
|
image: proppy/hugo
|
||||||
|
imagePullPolicy: PullAlways
|
||||||
|
env:
|
||||||
|
- name: SRC
|
||||||
|
value: /src
|
||||||
|
- name: BUILD_DRAFT
|
||||||
|
value: 'true'
|
||||||
|
- name: BASE_URL
|
||||||
|
value: kube.proppy.sh
|
||||||
|
volumeMounts:
|
||||||
|
- name: markdown
|
||||||
|
mountPath: /src
|
||||||
|
- name: html
|
||||||
|
mountPath: /dest
|
||||||
|
- name: nginx
|
||||||
|
image: nginx
|
||||||
|
volumeMounts:
|
||||||
|
- name: html
|
||||||
|
mountPath: /usr/share/nginx/html
|
||||||
|
ports:
|
||||||
|
- name: http-server
|
||||||
|
containerPort: 80
|
||||||
|
volumes:
|
||||||
|
- name: markdown
|
||||||
|
source:
|
||||||
|
emptyDir: {}
|
||||||
|
- name: html
|
||||||
|
source:
|
||||||
|
emptyDir: {}
|
||||||
|
labels:
|
||||||
|
name: blog
|
8
contrib/git-sync/demo/config/service.yaml
Normal file
8
contrib/git-sync/demo/config/service.yaml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
id: blog-service
|
||||||
|
kind: Service
|
||||||
|
apiVersion: v1beta1
|
||||||
|
port: 80
|
||||||
|
containerPort: http-server
|
||||||
|
selector:
|
||||||
|
name: blog
|
||||||
|
createExternalLoadBalancer: true
|
13
contrib/git-sync/demo/hugo/Dockerfile
Normal file
13
contrib/git-sync/demo/hugo/Dockerfile
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
FROM golang
|
||||||
|
RUN go get -v github.com/spf13/hugo
|
||||||
|
RUN git clone --recursive https://github.com/spf13/hugoThemes.git /themes
|
||||||
|
VOLUME ["/src", "/dest"]
|
||||||
|
EXPOSE 1313
|
||||||
|
ENV SRC /src
|
||||||
|
ENV DEST /dest
|
||||||
|
ENV THEME hyde
|
||||||
|
ENV BUILD_DRAFT false
|
||||||
|
ENV BASE_URL ""
|
||||||
|
ADD run-hugo /run-hugo
|
||||||
|
ENTRYPOINT ["/run-hugo"]
|
||||||
|
CMD ["server", "--source=${SRC}", "--theme=${THEME}", "--buildDrafts=${BUILD_DRAFT}", "--baseUrl=${BASE_URL}", "--watch", "--destination=${DEST}", "--appendPort=false"]
|
21
contrib/git-sync/demo/hugo/run-hugo
Executable file
21
contrib/git-sync/demo/hugo/run-hugo
Executable file
@@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright 2014 Google Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
if [ ! -d ${SRC}/themes ]; then
|
||||||
|
ln -s /themes ${SRC}/themes
|
||||||
|
fi
|
||||||
|
hugo $(eval echo $*) # force default CMD env expansion
|
112
contrib/git-sync/main.go
Normal file
112
contrib/git-sync/main.go
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2014 Google Inc. All rights reserved.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// git-sync is a command that pull a git repository to a local directory.
|
||||||
|
|
||||||
|
package main // import "github.com/GoogleCloudPlatform/kubernetes/contrib/git-sync"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var flRepo = flag.String("repo", envString("GIT_SYNC_REPO", ""), "git repo url")
|
||||||
|
var flBranch = flag.String("branch", envString("GIT_SYNC_BRANCH", "master"), "git branch")
|
||||||
|
var flRev = flag.String("rev", envString("GIT_SYNC_BRANCH", "HEAD"), "git rev")
|
||||||
|
var flDest = flag.String("dest", envString("GIT_SYNC_DEST", ""), "destination path")
|
||||||
|
var flWait = flag.Int("wait", envInt("GIT_SYNC_WAIT", 0), "number of seconds to wait before exit")
|
||||||
|
|
||||||
|
func envString(key, def string) string {
|
||||||
|
if env := os.Getenv(key); env != "" {
|
||||||
|
return env
|
||||||
|
}
|
||||||
|
return def
|
||||||
|
}
|
||||||
|
|
||||||
|
func envInt(key string, def int) int {
|
||||||
|
if env := os.Getenv(key); env != "" {
|
||||||
|
val, err := strconv.Atoi(env)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("invalid value for %q: using default: %q", key, def)
|
||||||
|
return def
|
||||||
|
}
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
return def
|
||||||
|
}
|
||||||
|
|
||||||
|
const usage = "usage: GIT_SYNC_REPO= GIT_SYNC_DEST= [GIT_SYNC_BRANCH= GIT_SYNC_WAIT=] git-sync -repo GIT_REPO_URL -dest PATH [-branch -wait]"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
flag.Parse()
|
||||||
|
if *flRepo == "" || *flDest == "" {
|
||||||
|
flag.Usage()
|
||||||
|
log.Fatal(usage)
|
||||||
|
}
|
||||||
|
if _, err := exec.LookPath("git"); err != nil {
|
||||||
|
log.Fatalf("required git executable not found: %v", err)
|
||||||
|
}
|
||||||
|
if err := syncRepo(*flRepo, *flDest, *flBranch, *flRev); err != nil {
|
||||||
|
log.Fatalf("error syncing repo: %v", err)
|
||||||
|
}
|
||||||
|
log.Printf("wait %d seconds", *flWait)
|
||||||
|
time.Sleep(time.Duration(*flWait) * time.Second)
|
||||||
|
log.Println("done")
|
||||||
|
}
|
||||||
|
|
||||||
|
// syncRepo syncs the branch of a given repository to the destination at the given rev.
|
||||||
|
func syncRepo(repo, dest, branch, rev string) error {
|
||||||
|
gitRepoPath := path.Join(dest, ".git")
|
||||||
|
_, err := os.Stat(gitRepoPath)
|
||||||
|
switch {
|
||||||
|
case os.IsNotExist(err):
|
||||||
|
// clone repo
|
||||||
|
cmd := exec.Command("git", "clone", "--no-checkout", "-b", branch, repo, dest)
|
||||||
|
output, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error cloning repo %q: %v: %s", strings.Join(cmd.Args, " "), err, string(output))
|
||||||
|
}
|
||||||
|
log.Printf("clone %q: %s", repo, string(output))
|
||||||
|
case err != nil:
|
||||||
|
return fmt.Errorf("error checking if repo exist %q: %v", gitRepoPath, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// fetch branch
|
||||||
|
cmd := exec.Command("git", "fetch", "origin", branch)
|
||||||
|
cmd.Dir = dest
|
||||||
|
output, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error running command %q: %v: %s", strings.Join(cmd.Args, " "), err, string(output))
|
||||||
|
}
|
||||||
|
log.Printf("fetch %q: %s", branch, string(output))
|
||||||
|
|
||||||
|
// reset working copy
|
||||||
|
cmd = exec.Command("git", "reset", "--hard", rev)
|
||||||
|
cmd.Dir = dest
|
||||||
|
output, err = cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error running command %q : %v: %s", strings.Join(cmd.Args, " "), err, string(output))
|
||||||
|
}
|
||||||
|
log.Printf("reset %q: %v", rev, string(output))
|
||||||
|
return nil
|
||||||
|
}
|
Reference in New Issue
Block a user