diff --git a/.dockerignore b/.dockerignore index dcb0d9e355..256a36839e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -15,3 +15,5 @@ Dockerfile.archive docker-compose.yml Gemfile Gemfile.lock +_website*.json + diff --git a/.github/actions/update-website-config/.dockerignore b/.github/actions/update-website-config/.dockerignore new file mode 100644 index 0000000000..6d676e4738 --- /dev/null +++ b/.github/actions/update-website-config/.dockerignore @@ -0,0 +1,2 @@ +Dockerfile +action.yml diff --git a/.github/actions/update-website-config/Dockerfile b/.github/actions/update-website-config/Dockerfile new file mode 100644 index 0000000000..251a5e2654 --- /dev/null +++ b/.github/actions/update-website-config/Dockerfile @@ -0,0 +1,11 @@ +FROM golang:1.14 + +WORKDIR /src +COPY go.mod go.sum ./ +RUN go mod download + +COPY . . + +RUN go build -o /bin/action + +ENTRYPOINT ["/bin/action"] diff --git a/.github/actions/update-website-config/action.yml b/.github/actions/update-website-config/action.yml new file mode 100644 index 0000000000..cabacd7b7b --- /dev/null +++ b/.github/actions/update-website-config/action.yml @@ -0,0 +1,16 @@ +name: update website config +description: update the S3 website configuration +inputs: + bucketName: + description: Name of the S3 bucket + required: true + regionName: + description: Name of the AWS region of the S3 bucket + required: true + websiteConfig: + description: Name of the website config JSON file + required: true + +runs: + using: docker + image: Dockerfile diff --git a/.github/actions/update-website-config/go.mod b/.github/actions/update-website-config/go.mod new file mode 100644 index 0000000000..cb7ef2a776 --- /dev/null +++ b/.github/actions/update-website-config/go.mod @@ -0,0 +1,8 @@ +module github.com/docker/docker.github.io/upload-website-config + +go 1.14 + +require ( + github.com/aws/aws-sdk-go v1.29.24 + github.com/sethvargo/go-githubactions v0.1.1 +) diff --git a/.github/actions/update-website-config/go.sum b/.github/actions/update-website-config/go.sum new file mode 100644 index 0000000000..b6db098d55 --- /dev/null +++ b/.github/actions/update-website-config/go.sum @@ -0,0 +1,18 @@ +github.com/aws/aws-sdk-go v1.29.24 h1:KOnds/LwADMDBaALL4UB98ZR+TUR1A1mYmAYbdLixLA= +github.com/aws/aws-sdk-go v1.29.24/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTgahTma5Xg= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sethvargo/go-githubactions v0.1.1 h1:u75rV0C+AvNjEUE4maSN844/U5eiy9Rlc3ahOU4EAfE= +github.com/sethvargo/go-githubactions v0.1.1/go.mod h1:ugCoIFQjs7HxIwwYiY7ty6H9T+7Z4ey481HxqA3VRKE= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/.github/actions/update-website-config/main.go b/.github/actions/update-website-config/main.go new file mode 100644 index 0000000000..997c079584 --- /dev/null +++ b/.github/actions/update-website-config/main.go @@ -0,0 +1,70 @@ +package main + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/s3" + + "github.com/sethvargo/go-githubactions" +) + +// Upload a bucket's website configuration. +func main() { + bucketName := githubactions.GetInput("bucketName") + if bucketName == "" { + githubactions.Fatalf("missing input 'bucketName'") + } + + regionName := githubactions.GetInput("regionName") + if regionName == "" { + githubactions.Fatalf("missing input 'regionName'") + } + + websiteConfig := githubactions.GetInput("websiteConfig") + if websiteConfig == "" { + githubactions.Fatalf("missing input 'websiteConfig'") + } + + file, err := ioutil.ReadFile(websiteConfig) + if err != nil { + exitErrorf("Error reading json file %s, %v", websiteConfig, err) + } + + data := s3.WebsiteConfiguration{} + err = json.Unmarshal([]byte(file), &data) + if err != nil { + exitErrorf("Error parsing JSON from file %s, %v", websiteConfig, err) + } + + sess, err := session.NewSession(&aws.Config{ + Region: aws.String(regionName)}, + ) + + svc := s3.New(sess) + + // Create SetBucketWebsite parameters based on the JSON file input + params := s3.PutBucketWebsiteInput{ + Bucket: aws.String(bucketName), + WebsiteConfiguration: &data, + } + + // Set the website configuration on the bucket. Replacing any existing + // configuration. + _, err = svc.PutBucketWebsite(¶ms) + if err != nil { + exitErrorf("Unable to set bucket %q website configuration, %v", + bucketName, err) + } + + fmt.Printf("Successfully set bucket %q website configuration\n", bucketName) +} + +func exitErrorf(msg string, args ...interface{}) { + fmt.Fprintf(os.Stderr, msg+"\n", args...) + os.Exit(1) +} diff --git a/.github/workflows/build-master.yml b/.github/workflows/build-master.yml index 8d8f27d1c6..a0a4de9a48 100644 --- a/.github/workflows/build-master.yml +++ b/.github/workflows/build-master.yml @@ -24,6 +24,16 @@ jobs: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} if: github.repository == 'docker/docker.github.io' && github.event_name == 'push' + - name: update S3 website config + uses: ./.github/actions/update-website-config + with: + bucketName: docs.docker.com-stage-us-east-1 + regionName: us-east-1 + websiteConfig: _website-config-docs-stage.json + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + if: github.repository == 'docker/docker.github.io' && github.event_name == 'push' - name: invalidate docs website cache run: aws --region us-east-1 lambda invoke --function-name arn:aws:lambda:us-east-1:710015040892:function:docs-stage-cache-invalidator response.json env: diff --git a/.github/workflows/build-published.yml b/.github/workflows/build-published.yml index fa7687e44f..0446523d51 100644 --- a/.github/workflows/build-published.yml +++ b/.github/workflows/build-published.yml @@ -24,6 +24,16 @@ jobs: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} if: github.repository == 'docker/docker.github.io' && github.event_name == 'push' + - name: update S3 website config + uses: ./.github/actions/update-website-config + with: + bucketName: docs.docker.com-us-east-1 + regionName: us-east-1 + websiteConfig: _website-config-docs.json + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + if: github.repository == 'docker/docker.github.io' && github.event_name == 'push' - name: invalidate docs website cache run: aws --region us-east-1 lambda invoke --function-name arn:aws:lambda:us-east-1:710015040892:function:docs-cache-invalidator response.json env: diff --git a/_website-config-docs-stage.json b/_website-config-docs-stage.json new file mode 100644 index 0000000000..12e8a3aed6 --- /dev/null +++ b/_website-config-docs-stage.json @@ -0,0 +1,180 @@ +{ + "ErrorDocument": { + "Key": "404.html" + }, + "IndexDocument": { + "Suffix": "index.html" + }, + "RedirectAllRequestsTo": null, + "RoutingRules": [ + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.4/" + }, + "Redirect": { + "HostName": "docs-stage.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.5/" + }, + "Redirect": { + "HostName": "docs-stage.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.6/" + }, + "Redirect": { + "HostName": "docs-stage.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.7/" + }, + "Redirect": { + "HostName": "docs-stage.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.8/" + }, + "Redirect": { + "HostName": "docs-stage.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.9/" + }, + "Redirect": { + "HostName": "docs-stage.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.10/" + }, + "Redirect": { + "HostName": "docs-stage.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.11/" + }, + "Redirect": { + "HostName": "docs-stage.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.12/" + }, + "Redirect": { + "HostName": "docs-stage.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.13/" + }, + "Redirect": { + "HostName": "docs-stage.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v17.03/" + }, + "Redirect": { + "HostName": "docs-stage.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v17.09/" + }, + "Redirect": { + "HostName": "docs-stage.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v17.12/" + }, + "Redirect": { + "HostName": "docs-stage.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + } + ] +} \ No newline at end of file diff --git a/_website-config-docs.json b/_website-config-docs.json new file mode 100644 index 0000000000..427037089a --- /dev/null +++ b/_website-config-docs.json @@ -0,0 +1,180 @@ +{ + "ErrorDocument": { + "Key": "404.html" + }, + "IndexDocument": { + "Suffix": "index.html" + }, + "RedirectAllRequestsTo": null, + "RoutingRules": [ + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.4/" + }, + "Redirect": { + "HostName": "docs.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.5/" + }, + "Redirect": { + "HostName": "docs.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.6/" + }, + "Redirect": { + "HostName": "docs.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.7/" + }, + "Redirect": { + "HostName": "docs.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.8/" + }, + "Redirect": { + "HostName": "docs.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.9/" + }, + "Redirect": { + "HostName": "docs.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.10/" + }, + "Redirect": { + "HostName": "docs.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.11/" + }, + "Redirect": { + "HostName": "docs.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.12/" + }, + "Redirect": { + "HostName": "docs.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v1.13/" + }, + "Redirect": { + "HostName": "docs.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v17.03/" + }, + "Redirect": { + "HostName": "docs.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v17.09/" + }, + "Redirect": { + "HostName": "docs.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + }, + { + "Condition": { + "HttpErrorCodeReturnedEquals": null, + "KeyPrefixEquals": "v17.12/" + }, + "Redirect": { + "HostName": "docs.docker.com", + "HttpRedirectCode": null, + "Protocol": "https", + "ReplaceKeyPrefixWith": "", + "ReplaceKeyWith": null + } + } + ] +} \ No newline at end of file