diff --git a/.dockerignore b/.dockerignore index 75ea5de6ca2..664eefdb4ee 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,4 @@ +.git/ *.iml out/ *.ipr @@ -13,35 +14,13 @@ generated-sources/* generated-code/* *.swp *.swo - -/target -/generated-files -/nbactions.xml -*.pyc -__pycache__ -samples/server-generator/scalatra/output -samples/server-generator/node/output/node_modules -samples/server-generator/scalatra/target -samples/server-generator/scalatra/output/.history -samples/client/petstore/qt5cpp/PetStore/moc_* -samples/client/petstore/qt5cpp/PetStore/*.o -samples/client/petstore/objc/PetstoreClient.xcworkspace/xcuserdata -samples/client/petstore/qt5cpp/build-* -samples/client/petstore/qt5cpp/PetStore/PetStore -samples/client/petstore/qt5cpp/PetStore/Makefile -samples/client/petstore/java/hello.txt -samples/client/petstore/android/default/hello.txt -samples/client/petstore/objc/Build -samples/client/petstore/objc/Pods -samples/server/petstore/nodejs/node_modules -target -.idea -.lib -atlassian-ide-plugin.xml +*.bak +project/ +samples/* +target/ +.idea/ +.lib/ .DS_Store -samples/client/petstore/php/SwaggerClient-php/composer.lock -samples/client/petstore/php/SwaggerClient-php/vendor/ - -samples/client/petstore/silex/SwaggerServer/composer.lock -samples/client/petstore/silex/SwaggerServer/venodr/ +# Not needed in a linux container +bin/windows/* diff --git a/Dockerfile b/Dockerfile index 1976e1aedd6..ec291fef4af 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,22 @@ +FROM jimschubert/8-jdk-alpine-mvn:1.0 -FROM maven:3-jdk-7-alpine +ENV GEN_DIR /opt/swagger-codegen -WORKDIR /src -VOLUME /src -VOLUME /root/.m2/repository +RUN set -x && \ + apk add --no-cache bash -ADD . /opt/swagger-codegen +RUN mkdir /opt -RUN cd /opt/swagger-codegen && mvn package +ADD . ${GEN_DIR} -ENTRYPOINT ["java", "-jar", "/opt/swagger-codegen/modules/swagger-codegen-cli/target/swagger-codegen-cli.jar"] +VOLUME ${MAVEN_HOME}/.m2/repository -CMD ["help"] +WORKDIR ${GEN_DIR} + +RUN mvn -am -pl "modules/swagger-codegen-cli" package + +COPY docker-entrypoint.sh /usr/local/bin/ + +ENTRYPOINT ["docker-entrypoint.sh"] + +CMD ["build"] diff --git a/README.md b/README.md index f629f5589ff..a9a4b63a596 100644 --- a/README.md +++ b/README.md @@ -110,16 +110,41 @@ After cloning the project, you can build it from source with this command: mvn clean package ``` +### Homebrew + +To install, run `brew install swagger-codegen` + +Here is an example usage: +``` +swagger-codegen generate -i http://petstore.swagger.io/v2/swagger.json -l ruby -o /tmp/test/ +``` + ### Docker -#### Build and run using docker + +#### Development in docker + +You can use `run-in-docker.sh` to do all development. This script maps your local repository to `/gen` +in the docker container. It also maps `~/.m2/repository` to the appropriate container location. + +To execute `mvn package`: ``` git clone https://github.com/swagger-api/swagger-codegen cd swagger-codegen ./run-in-docker.sh mvn package - ``` +``` +Build artifacts are now accessible in your working directory. +Once built, `run-in-docker.sh` will act as an executable for swagger-codegen-cli. To generate code, you'll need to output to a directory under `/gen` (e.g. `/gen/out`). For example: + +``` +./run-in-docker.sh help # Executes 'help' command for swagger-codegen-cli +./run-in-docker.sh langs # Executes 'langs' command for swagger-codegen-cli +./run-in-docker.sh /gen/bin/go-petstore.sh # Builds the Go client +./run-in-docker.sh generate -i modules/swagger-codegen/src/test/resources/2_0/petstore.yaml \ + -l go -o /gen/out/go-petstore -DpackageName=petstore # generates go client, outputs locally to ./out/go-petstore +``` #### Run Docker in Vagrant Prerequisite: install [Vagrant](https://www.vagrantup.com/downloads.html) and [VirtualBox](https://www.virtualbox.org/wiki/Downloads). @@ -132,18 +157,54 @@ cd /vagrant ./run-in-docker.sh mvn package ``` -#### Public Docker image +#### Public Pre-built Docker images - - https://hub.docker.com/r/swaggerapi/swagger-generator/ (official) - - https://hub.docker.com/r/jimschubert/swagger-codegen-cli/ (unofficial) + - https://hub.docker.com/r/swaggerapi/swagger-generator/ (official web service) + - https://hub.docker.com/r/swaggerapi/swagger-codegen-cli/ (official CLI) +======= -### Homebrew -To install, run `brew install swagger-codegen` +##### Swagger Generator Docker Image + +The Swagger Generator image can act as a self-hosted web application and API for generating code. This container can be incorporated into a CI pipeline, and requires at least two HTTP requests and some docker orchestration to access generated code. + +Example usage (note this assumes `jq` is installed for command line processing of JSON): -Here is an example usage: ``` -swagger-codegen generate -i http://petstore.swagger.io/v2/swagger.json -l ruby -o /tmp/test/ +# Start container and save the container id +CID=$(docker run -d swaggerapi/swagger-generator) +# allow for startup +sleep 5 +# Get the IP of the running container +GEN_IP=$(docker inspect --format '{{.NetworkSettings.IPAddress}}' $CID) +# Execute an HTTP request and store the download link +RESULT=$(curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{ + "swaggerUrl": "http://petstore.swagger.io/v2/swagger.json" +}' 'http://localhost:8188/api/gen/clients/javascript' | jq '.link' | tr -d '"') +# Download the generated zip and redirect to a file +curl $RESULT > result.zip +# Shutdown the swagger generator image +docker stop $CID && docker rm $CID ``` + +In the example above, `result.zip` will contain the generated client. + +##### Swagger Codegen Docker Image + +The Swagger Codegen image acts as a standalone executable. It can be used as an alternative to installing via homebrew, or for developers who are unable to install Java or upgrade the installed version. + +To generate code with this image, you'll need to mount a local location as a volume. + +Example: + +``` +docker run --rm -v ${PWD}:/local swagger-api/swagger-codegen generate \ + -i http://petstore.swagger.io/v2/swagger.json \ + -l go \ + -o /local/out/go +``` + +The generated code will be located under `./out/go` in the current directory. + ## Getting Started To generate a PHP client for http://petstore.swagger.io/v2/swagger.json, please run the following diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100755 index 00000000000..943ae1a2927 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# GEN_DIR allows to share the entrypoint between Dockerfile and run-in-docker.sh (backward compatible) +GEN_DIR=${GEN_DIR:-/opt/swagger-codegen} +JAVA_OPTS=${JAVA_OPTS:-"-Xmx1024M -DloggerPath=conf/log4j.properties"} + +codegen="${GEN_DIR}/modules/swagger-codegen-cli/target/swagger-codegen-cli.jar" + +case "$1" in + generate|help|langs|meta|config-help) + # If ${GEN_DIR} has been mapped elsewhere from default, and that location has not been built + if [[ ! -f "${codegen}" ]]; then + (cd ${GEN_DIR} && exec mvn -am -pl "modules/swagger-codegen-cli" package) + fi + command=$1 + shift + exec java ${JAVA_OPTS} -jar ${codegen} ${command} "$@" + ;; + *) # Any other commands, e.g. docker run imagename ls -la or docker run -it imagename /bin/bash + exec "$@" + ;; +esac diff --git a/modules/swagger-codegen-cli/Dockerfile b/modules/swagger-codegen-cli/Dockerfile new file mode 100644 index 00000000000..1068581cbc7 --- /dev/null +++ b/modules/swagger-codegen-cli/Dockerfile @@ -0,0 +1,7 @@ +FROM java:8-jre-alpine + +ADD target/swagger-codegen-cli.jar /opt/swagger-codegen-cli/swagger-codegen-cli.jar + +ENTRYPOINT ["java", "-jar", "/opt/swagger-codegen-cli/swagger-codegen-cli.jar"] + +CMD ["help"] \ No newline at end of file diff --git a/modules/swagger-generator/Dockerfile b/modules/swagger-generator/Dockerfile index dc31cbd965e..0360aa66ce0 100644 --- a/modules/swagger-generator/Dockerfile +++ b/modules/swagger-generator/Dockerfile @@ -1,12 +1,13 @@ -FROM java:8-jdk +FROM java:8-jre-alpine WORKDIR /generator + COPY target/lib/jetty-runner* /generator/jetty-runner.jar COPY target/*.war /generator/swagger-generator.war ENV GENERATOR_HOST=https://generator.swaggerhub.com/api/swagger.json -RUN apt-get update EXPOSE 8080 + CMD ["java", "-jar", "/generator/jetty-runner.jar", "/generator/swagger-generator.war"] diff --git a/run-in-docker.sh b/run-in-docker.sh index 39a7601dd03..99581115871 100755 --- a/run-in-docker.sh +++ b/run-in-docker.sh @@ -1,34 +1,16 @@ #!/bin/bash -set -e -cd "$(dirname $BASH_SOURCE)" +set -exo pipefail -maven_cache_repo="$HOME/.m2/repository" -myname="$(basename $BASH_SOURCE)" +cd "$(dirname ${BASH_SOURCE})" -if [ "$1" = "mvn" ]; then - cmd="$1" - shift - args="$@" -else - jar="modules/swagger-codegen-cli/target/swagger-codegen-cli.jar" - - # Check if project is built - if [ ! -f "$jar" ]; then - echo "ERROR File not found: $jar" - echo "ERROR Did you forget to './$myname mvn package'?" - exit 1 - fi - - cmd="java -jar /gen/$jar" - args="$@" -fi +maven_cache_repo="${HOME}/.m2/repository" -mkdir -p "$maven_cache_repo" +mkdir -p "${maven_cache_repo}" -set -x - -docker run -it \ +docker run --rm -it \ -w /gen \ + -e GEN_DIR=/gen \ -v "${PWD}:/gen" \ -v "${maven_cache_repo}:/root/.m2/repository" \ - maven:3-jdk-7 $cmd $args + --entrypoint /gen/docker-entrypoint.sh \ + maven:3-jdk-7 "$@"