Skip to content

Commit

Permalink
implemented git lfs
Browse files Browse the repository at this point in the history
  • Loading branch information
cooperspencer committed Jul 13, 2023
1 parent 616e2d6 commit 479dd8a
Show file tree
Hide file tree
Showing 7 changed files with 263 additions and 17 deletions.
66 changes: 66 additions & 0 deletions .github/workflows/docker_main_ubuntu.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: Build and Publish

on:
# run it on push to the default repository branch
push:
branches:
- main
# run it during pull request
pull_request:

jobs:
# define job to build and publish docker image
build-and-push-docker-image:
name: Build Docker image and push to repositories
# run only when code is compiling and tests are passing
runs-on: ubuntu-latest
# steps to perform in job
steps:
- name: Checkout code
uses: actions/checkout@v2

- name: Docker meta
id: meta
uses: docker/metadata-action@v3
with:
# list of Docker images to use as base name for tags
images: |
buddyspencer/gickup
ghcr.io/${{ github.actor }}/gickup
# generate Docker tags based on the following events/attributes
tags: |
type=raw,value=ubuntu-dev
# setup Docker buld action
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1

- name: Login to DockerHub
if: github.event_name != 'pull_request'
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Login to Github Packages
if: github.event_name != 'pull_request'
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GHCR_PAT }}

- name: Build image and push to Docker Hub and GitHub Container Registry
uses: docker/build-push-action@v2
with:
# relative path to the place where source code with Dockerfile is located
context: .
file: Dockerfile.ubuntu
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
# build on feature branches, push only on main branch
push: ${{ github.event_name != 'pull_request' }}
platforms: linux/amd64, linux/arm64/v8, linux/arm/v7, linux/arm/v6

- name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}
71 changes: 71 additions & 0 deletions .github/workflows/docker_ubuntu.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
name: Build and Publish

on:
# run it on push to the default repository branch
push:
tags:
- "v*.*.*"
# run it during pull request
pull_request:

jobs:
# define job to build and publish docker image
build-and-push-docker-image:
name: Build Docker image and push to repositories
# run only when code is compiling and tests are passing
runs-on: ubuntu-latest

# steps to perform in job
steps:
- name: Checkout code
uses: actions/checkout@v2

- name: Docker meta
id: meta
uses: docker/metadata-action@v3
with:
# list of Docker images to use as base name for tags
images: |
buddyspencer/gickup
ghcr.io/${{ github.actor }}/gickup
# generate Docker tags based on the following events/attributes
tags: |
type=schedule
type=ref,event=pr
type=semver,pattern=ubuntu-{{version}}
type=semver,pattern=ubuntu-{{major}}.{{minor}}
type=semver,pattern=ubuntu-{{major}}
type=raw,value=ubuntu-latest
# setup Docker buld action
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1

- name: Login to DockerHub
if: github.event_name != 'pull_request'
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Login to Github Packages
if: github.event_name != 'pull_request'
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GHCR_PAT }}

- name: Build image and push to Docker Hub and GitHub Container Registry
uses: docker/build-push-action@v2
with:
# relative path to the place where source code with Dockerfile is located
context: .
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
# build on feature branches, push only on main branch
push: ${{ github.event_name != 'pull_request' }}
platforms: linux/amd64, linux/arm64/v8, linux/arm/v7, linux/arm/v6

- name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}
6 changes: 3 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ COPY . .

# Fetching dependencies and build the app
RUN go get -d -v ./...
RUN CGO_ENABLED=0 go build -a -installsuffix cgo -o app .
RUN CGO_ENABLED=0 go build -a -installsuffix cgo -o gickup .

# Use scratch as production environment -> Small builds
FROM scratch as production
Expand All @@ -22,7 +22,7 @@ COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
# Copy zoneinfo for getting the right cron timezone
COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo
# Copy the main executable from the builder
COPY --from=builder /go/src/github.com/cooperspencer/gickup/app /gickup/app
COPY --from=builder /go/src/github.com/cooperspencer/gickup/gickup /gickup/gickup

ENTRYPOINT [ "/gickup/app" ]
ENTRYPOINT [ "/gickup/gickup" ]
CMD [ "/gickup/conf.yml" ]
26 changes: 26 additions & 0 deletions Dockerfile.ubuntu
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
FROM golang:1.17-alpine as builder

# Install dependencies for copy
RUN apk add -U --no-cache ca-certificates tzdata git

# Use an valid GOPATH and copy the files
WORKDIR /go/src/github.com/cooperspencer/gickup
COPY go.mod .
COPY go.sum .
RUN go mod tidy
COPY . .

# Fetching dependencies and build the app
RUN go get -d -v ./...
RUN CGO_ENABLED=0 go build -a -installsuffix cgo -o gickup .

# Use ubuntu as production environment
FROM ubuntu as production
WORKDIR /
RUN apt update && DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt install -y git git-lfs ssl-cert tzdata && rm -rf /var/lib/apt/lists/*
RUN git lfs install
# Copy the main executable from the builder
COPY --from=builder /go/src/github.com/cooperspencer/gickup/gickup /gickup/gickup

ENTRYPOINT [ "/gickup/gickup" ]
CMD [ "/gickup/conf.yml" ]
47 changes: 47 additions & 0 deletions gitcmd/gitcmd.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package gitcmd

import (
"errors"
"os/exec"
)

type GitCmd struct {
CMD string
}

func New() (GitCmd, error) {
cmd := exec.Command("git", "lfs")
err := cmd.Run()
if err != nil {
return GitCmd{}, errors.New("git lfs is not installed")
}

return GitCmd{CMD: "git"}, nil
}

func (g GitCmd) Clone(url, path string, bare bool) error {
cmd := exec.Command(g.CMD, "clone", url, path)
if bare {
cmd.Args = append(cmd.Args, "--bare")
}
err := cmd.Run()
if err != nil {
return err
}
return nil
}

func (g GitCmd) Pull(bare bool) error {
var args = []string{}
if bare {
args = []string{"fetch", "--all"}
} else {
args = []string{"pull"}
}
cmd := exec.Command(g.CMD, args...)
err := cmd.Run()
if err != nil {
return err
}
return nil
}
63 changes: 49 additions & 14 deletions local/local.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"strings"
"time"

"github.com/cooperspencer/gickup/gitcmd"
"github.com/cooperspencer/gickup/types"
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/config"
Expand All @@ -23,8 +24,22 @@ import (
gossh "golang.org/x/crypto/ssh"
)

var (
gitc = gitcmd.GitCmd{}
)

// Locally TODO.
func Locally(repo types.Repo, l types.Local, dry bool) bool {
if l.LFS {
g, err := gitcmd.New()
if err != nil {
log.Error().
Str("stage", "locally").
Str("path", l.Path).
Msg(err.Error())
}
gitc = g
}
date := time.Now()

if l.Structured {
Expand Down Expand Up @@ -101,7 +116,7 @@ func Locally(repo types.Repo, l types.Local, dry bool) bool {
Str("path", l.Path).
Msgf("cloning %s", types.Green(repo.Name))

err := cloneRepository(repo, auth, dry, l.Bare)
err := cloneRepository(repo, auth, dry, l)
if err != nil {
if err.Error() == "repository not found" {
log.Warn().
Expand Down Expand Up @@ -163,7 +178,7 @@ func Locally(repo types.Repo, l types.Local, dry bool) bool {
Str("path", l.Path).
Msgf("opening %s locally", types.Green(repo.Name))

err := updateRepository(repo.Name, auth, dry, l.Bare)
err := updateRepository(repo.Name, auth, dry, l)
if err != nil {
if strings.Contains(err.Error(), "already up-to-date") {
log.Info().
Expand Down Expand Up @@ -271,17 +286,15 @@ func Locally(repo types.Repo, l types.Local, dry bool) bool {
return true
}

func updateRepository(repoPath string, auth transport.AuthMethod, dry bool, bare bool) error {
func updateRepository(repoPath string, auth transport.AuthMethod, dry bool, l types.Local) error {
r, err := git.PlainOpen(repoPath)
if err != nil {
return err
}

if !dry {
if bare {
err = r.Fetch(&git.FetchOptions{Auth: auth, RemoteName: "origin", RefSpecs: []config.RefSpec{"+refs/*:refs/*"}})
} else {
w, err := r.Worktree()
if l.LFS {
err = os.Chdir(repoPath)
if err != nil {
return err
}
Expand All @@ -290,13 +303,31 @@ func updateRepository(repoPath string, auth transport.AuthMethod, dry bool, bare
Str("stage", "locally").
Msgf("pulling %s", types.Green(repoPath))

err = w.Pull(&git.PullOptions{Auth: auth, RemoteName: "origin", SingleBranch: false})
err = gitc.Pull(l.Bare)
if err != nil {
return err
}
} else {
if l.Bare {
err = r.Fetch(&git.FetchOptions{Auth: auth, RemoteName: "origin", RefSpecs: []config.RefSpec{"+refs/*:refs/*"}})
} else {
w, err := r.Worktree()
if err != nil {
return err
}

log.Info().
Str("stage", "locally").
Msgf("pulling %s", types.Green(repoPath))

err = w.Pull(&git.PullOptions{Auth: auth, RemoteName: "origin", SingleBranch: false})
}
}
}
return err
}

func cloneRepository(repo types.Repo, auth transport.AuthMethod, dry bool, bare bool) error {
func cloneRepository(repo types.Repo, auth transport.AuthMethod, dry bool, l types.Local) error {
if dry {
return nil
}
Expand Down Expand Up @@ -334,11 +365,15 @@ func cloneRepository(repo types.Repo, auth transport.AuthMethod, dry bool, bare
return err
}

_, err = git.PlainClone(repo.Name, bare, &git.CloneOptions{
URL: url,
Auth: auth,
SingleBranch: false,
})
if l.LFS {
err = gitc.Clone(url, repo.Name, l.Bare)
} else {
_, err = git.PlainClone(repo.Name, l.Bare, &git.CloneOptions{
URL: url,
Auth: auth,
SingleBranch: false,
})
}

return err
}
Expand Down
1 change: 1 addition & 0 deletions types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ type Local struct {
Structured bool `yaml:"structured"`
Zip bool `yaml:"zip"`
Keep int `yaml:"keep"`
LFS bool `yaml:"lfs"`
}

// Conf TODO.
Expand Down

0 comments on commit 479dd8a

Please sign in to comment.