Skip to content

Commit 48e62ea

Browse files
committed
Build locally and add s3 metadata to response
1 parent 1a82bf4 commit 48e62ea

4 files changed

Lines changed: 89 additions & 29 deletions

File tree

.github/workflows/main.yml

Lines changed: 55 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,61 @@
1-
name: Publish Docker images
1+
name: Build and Publish AWS S3 Proxy
22

33
on:
44
push:
5-
tags:
6-
- "*"
5+
# workflow_dispatch:
76

87
jobs:
9-
docker-image-2-0:
10-
name: v2.0
11-
if: github.event_name == 'push' && contains(github.ref, 'v2.0.')
12-
runs-on: ubuntu-18.04
13-
env:
14-
IMAGE_NAME: docker.pkg.github.com/${{ github.repository }}/linux:2.0
8+
build_and_upload:
9+
runs-on: ubuntu-latest
1510
steps:
16-
- uses: actions/checkout@v1
17-
with:
18-
fetch-depth: 1
19-
- name: Build & Push
20-
run: |
21-
docker login docker.pkg.github.com -u owner -p ${{ secrets.GITHUB_TOKEN }}
22-
docker build -t $IMAGE_NAME docker/linux/2.0/
23-
docker push $IMAGE_NAME
24-
timeout-minutes: 10
11+
- name: Extract branch name
12+
id: branch
13+
uses: actions/github-script@0.9.0
14+
with:
15+
github-token: ${{ secrets.GITHUB_TOKEN }}
16+
script: |
17+
return context.payload.ref.replace(/^refs\/heads\//, '');
18+
continue-on-error: true
19+
- uses: actions/checkout@v2
20+
- name: Docker login
21+
run: |
22+
docker run \
23+
-e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" \
24+
-e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" \
25+
-e "AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}" \
26+
amazon/aws-cli ecr get-login-password |
27+
docker login \
28+
--username AWS \
29+
--password-stdin \
30+
"${AWS_ECR_S3_PROXY}"
31+
env:
32+
AWS_ACCESS_KEY_ID: "${{ secrets.AWS_ACCESS_KEY_ID }}"
33+
AWS_SECRET_ACCESS_KEY: "${{ secrets.AWS_SECRET_ACCESS_KEY }}"
34+
AWS_DEFAULT_REGION: "${{ secrets.AWS_DEFAULT_REGION }}"
35+
AWS_ECR_S3_PROXY: "${{ secrets.AWS_ECR_S3_PROXY }}"
36+
- name: Docker build
37+
working-directory: ./
38+
run: |
39+
set -x
40+
docker build -f docker/linux/2.0/Dockerfile -t aws-s3-proxy .
41+
- name: Docker push
42+
working-directory: ./
43+
run: |
44+
set -eufxo pipefail
45+
image="${AWS_ECR_S3_PROXY}/infrastructure/aws-s3-proxy"
46+
git_hash=$(git reflog --format='%h' -1)
47+
head_ref="${{ github.head_ref }}"
48+
branch_ref="${{ steps.branch.outputs.result }}"
49+
branch=""
50+
[ -z "${head_ref}" ] || branch=${head_ref}
51+
[ -z "${branch_ref}" ] || branch=${branch_ref}
52+
tag_image="${image}:${git_hash}"
53+
docker tag aws-s3-proxy "${tag_image}"
54+
docker push "${tag_image}"
55+
[ -z "${branch}" ] || {
56+
tag_image="${image}:${branch}-${git_hash}"
57+
docker tag aws-s3-proxy "${tag_image}"
58+
docker push "${tag_image}"
59+
}
60+
env:
61+
AWS_ECR_S3_PROXY: "${{ secrets.AWS_ECR_S3_PROXY }}"

docker/linux/2.0/Dockerfile

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,30 @@
11
# AWS S3 Proxy v2.0
22
# docker run -d -p 8080:80 -e AWS_REGION -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_S3_BUCKET pottava/s3-proxy
33

4-
FROM golang:1.13.4-alpine3.10 AS builder
4+
FROM golang:1.13.7-alpine3.11 AS builder
55
RUN apk --no-cache add gcc musl-dev git
6-
RUN go get -u github.com/pottava/aws-s3-proxy
7-
WORKDIR /go/src/github.com/pottava/aws-s3-proxy
8-
ENV APP_VERSION=v2.0.0
9-
RUN git checkout "${APP_VERSION}" > /dev/null 2>&1
10-
RUN go mod download
11-
RUN go mod verify
6+
# RUN go get -u github.com/PreVeil/aws-s3-proxy
7+
# WORKDIR /go/src/github.com/PreVeil/aws-s3-proxy
8+
# ENV APP_VERSION=v2.0.0
9+
# RUN git checkout "${APP_VERSION}" > /dev/null 2>&1
10+
# RUN go mod download
11+
# RUN go mod verify
12+
13+
WORKDIR /build
14+
ARG APP_VERSION=v2.0.0
15+
16+
COPY go.mod go.sum ./
17+
RUN go mod download && go mod verify
18+
19+
COPY . .
20+
1221
RUN githash=$(git rev-parse --short HEAD 2>/dev/null) \
1322
&& today=$(date +%Y-%m-%d --utc) \
1423
&& CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \
15-
-ldflags '-s -w -X main.ver=${APP_VERSION} -X main.commit=${githash} -X main.date=${today}' \
24+
-ldflags "-s -w -X main.ver=${APP_VERSION} -X main.commit=${githash} -X main.date=${today}" \
1625
-o /app
1726

18-
FROM alpine:3.10 AS libs
27+
FROM alpine:3.11 AS libs
1928
RUN apk --no-cache add ca-certificates
2029

2130
FROM scratch

internal/config/config.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type config struct { // nolint
2121
AwsAPIEndpoint string // AWS_API_ENDPOINT
2222
S3Bucket string // AWS_S3_BUCKET
2323
S3KeyPrefix string // AWS_S3_KEY_PREFIX
24+
S3Metadata bool // AWS_S3_METADATA
2425
IndexDocument string // INDEX_DOCUMENT
2526
DirectoryListing bool // DIRECTORY_LISTINGS
2627
DirListingFormat string // DIRECTORY_LISTINGS_FORMAT
@@ -62,6 +63,10 @@ func Setup() {
6263
if len(indexDocument) == 0 {
6364
indexDocument = "index.html"
6465
}
66+
s3Metadata := false
67+
if b, err := strconv.ParseBool(os.Getenv("AWS_S3_METADATA")); err == nil {
68+
s3Metadata = b
69+
}
6570
directoryListings := false
6671
if b, err := strconv.ParseBool(os.Getenv("DIRECTORY_LISTINGS")); err == nil {
6772
directoryListings = b
@@ -103,6 +108,7 @@ func Setup() {
103108
AwsAPIEndpoint: os.Getenv("AWS_API_ENDPOINT"),
104109
S3Bucket: os.Getenv("AWS_S3_BUCKET"),
105110
S3KeyPrefix: os.Getenv("AWS_S3_KEY_PREFIX"),
111+
S3Metadata: s3Metadata,
106112
IndexDocument: indexDocument,
107113
DirectoryListing: directoryListings,
108114
DirListingFormat: os.Getenv("DIRECTORY_LISTINGS_FORMAT"),

internal/controllers/s3.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func AwsS3(w http.ResponseWriter, r *http.Request) {
7070
http.Error(w, message, code)
7171
return
7272
}
73-
setHeadersFromAwsResponse(w, obj, c.HTTPCacheControl, c.HTTPExpires)
73+
setHeadersFromAwsResponse(w, obj, c.HTTPCacheControl, c.HTTPExpires, c.S3Metadata)
7474

7575
io.Copy(w, obj.Body) // nolint
7676
}
@@ -93,7 +93,7 @@ func replacePathWithSymlink(client service.AWS, bucket, symlinkPath string) (*st
9393
return aws.String(link.URL), nil
9494
}
9595

96-
func setHeadersFromAwsResponse(w http.ResponseWriter, obj *s3.GetObjectOutput, httpCacheControl, httpExpires string) {
96+
func setHeadersFromAwsResponse(w http.ResponseWriter, obj *s3.GetObjectOutput, httpCacheControl, httpExpires string, s3Metadata bool) {
9797

9898
// Cache-Control
9999
if len(httpCacheControl) > 0 {
@@ -120,6 +120,14 @@ func setHeadersFromAwsResponse(w http.ResponseWriter, obj *s3.GetObjectOutput, h
120120
setStrHeader(w, "ETag", obj.ETag)
121121
setTimeHeader(w, "Last-Modified", obj.LastModified)
122122

123+
// A map of metadata to store with the object in S3.
124+
// Metadata map[string]*string `location:"headers" locationName:"x-amz-meta-" type:"map"`
125+
if s3Metadata {
126+
for metaKey, metaValue := range obj.Metadata {
127+
setStrHeader(w, metaKey, metaValue)
128+
}
129+
}
130+
123131
w.WriteHeader(determineHTTPStatus(obj))
124132
}
125133

0 commit comments

Comments
 (0)