commit e1ee4ea0ddff4e1252367cafa85fa0a7fd770ee5 Author: Tomer Doron Date: Wed Mar 25 15:58:57 2020 -0700 initial commit diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..24e5b0a1 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +.build diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c4f353cd --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +Package.pins +*.pem +/docs +Package.resolved +.podspecs +function.zip +.swiftpm diff --git a/.mailmap b/.mailmap new file mode 100644 index 00000000..c8ad743d --- /dev/null +++ b/.mailmap @@ -0,0 +1,3 @@ +Tomer Doron +Tomer Doron +Tomer Doron diff --git a/.swiftformat b/.swiftformat new file mode 100644 index 00000000..19ee383f --- /dev/null +++ b/.swiftformat @@ -0,0 +1,14 @@ +# file options + +--swiftversion 5.1 +--exclude .build + +# format options + +--self insert +--patternlet inline +--stripunusedargs unnamed-only +--comments ignore +--ifdef no-indent + +# rules diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..ebdb302e --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,55 @@ +# Code of Conduct +To be a truly great community, SwiftAWSLambdaRuntime needs to welcome developers from all walks of life, +with different backgrounds, and with a wide range of experience. A diverse and friendly +community will have more great ideas, more unique perspectives, and produce more great +code. We will work diligently to make the SwiftAWSLambdaRuntime community welcoming to everyone. + +To give clarity of what is expected of our members, SwiftAWSLambdaRuntime has adopted the code of conduct +defined by [contributor-covenant.org](https://www.contributor-covenant.org). This document is used across many open source +communities, and we think it articulates our values well. The full text is copied below: + +### Contributor Code of Conduct v1.3 +As contributors and maintainers of this project, and in the interest of fostering an open and +welcoming community, we pledge to respect all people who contribute through reporting +issues, posting feature requests, updating documentation, submitting pull requests or patches, +and other activities. + +We are committed to making participation in this project a harassment-free experience for +everyone, regardless of level of experience, gender, gender identity and expression, sexual +orientation, disability, personal appearance, body size, race, ethnicity, age, religion, or +nationality. + +Examples of unacceptable behavior by participants include: +- The use of sexualized language or imagery +- Personal attacks +- Trolling or insulting/derogatory comments +- Public or private harassment +- Publishing other’s private information, such as physical or electronic addresses, without explicit permission +- Other unethical or unprofessional conduct + +Project maintainers have the right and responsibility to remove, edit, or reject comments, +commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of +Conduct, or to ban temporarily or permanently any contributor for other behaviors that they +deem inappropriate, threatening, offensive, or harmful. + +By adopting this Code of Conduct, project maintainers commit themselves to fairly and +consistently applying these principles to every aspect of managing this project. Project +maintainers who do not follow or enforce the Code of Conduct may be permanently removed +from the project team. + +This code of conduct applies both within project spaces and in public spaces when an +individual is representing the project or its community. + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by +contacting a project maintainer at [swift-server-conduct@group.apple.com](mailto:swift-server-conduct@group.apple.com). All complaints will be reviewed and +investigated and will result in a response that is deemed necessary and appropriate to the +circumstances. Maintainers are obligated to maintain confidentiality with regard to the reporter +of an incident. + +*This policy is adapted from the Contributor Code of Conduct [version 1.3.0](https://contributor-covenant.org/version/1/3/0/).* + +### Reporting +A working group of community members is committed to promptly addressing any [reported issues](mailto:swift-server-conduct@group.apple.com). +Working group members are volunteers appointed by the project lead, with a +preference for individuals with varied backgrounds and perspectives. Membership is expected +to change regularly, and may grow or shrink. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..c9062d0e --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,68 @@ +## Legal + +By submitting a pull request, you represent that you have the right to license +your contribution to Apple and the community, and agree by submitting the patch +that your contributions are licensed under the Apache 2.0 license (see +`LICENSE.txt`). + + +## How to submit a bug report + +Please ensure to specify the following: + +* SwiftAWSLambdaRuntime commit hash +* Contextual information (e.g. what you were trying to achieve with SwiftAWSLambdaRuntime) +* Simplest possible steps to reproduce + * More complex the steps are, lower the priority will be. + * A pull request with failing test case is preferred, but it's just fine to paste the test case into the issue description. +* Anything that might be relevant in your opinion, such as: + * Swift version or the output of `swift --version` + * OS version and the output of `uname -a` + * Network configuration + + +### Example + +``` +SwiftAWSLambdaRuntime commit hash: 22ec043dc9d24bb011b47ece4f9ee97ee5be2757 + +Context: +While load testing my Lambda written with SwiftAWSLambdaRuntime, I noticed +that one file descriptor is leaked per request. + +Steps to reproduce: +1. ... +2. ... +3. ... +4. ... + +$ swift --version +Swift version 4.0.2 (swift-4.0.2-RELEASE) +Target: x86_64-unknown-linux-gnu + +Operating system: Ubuntu Linux 16.04 64-bit + +$ uname -a +Linux beefy.machine 4.4.0-101-generic #124-Ubuntu SMP Fri Nov 10 18:29:59 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux + +My system has IPv6 disabled. +``` + +## Writing a Patch + +A good SwiftAWSLambdaRuntime patch is: + +1. Concise, and contains as few changes as needed to achieve the end result. +2. Tested, ensuring that any tests provided failed before the patch and pass after it. +3. Documented, adding API documentation as needed to cover new functions and properties. +4. Accompanied by a great commit message, using our commit message template. + +### Commit Message Template + +We require that your commit messages match our template. The easiest way to do that is to get git to help you by explicitly using the template. To do that, `cd` to the root of our repository and run: + + git config commit.template dev/git.commit.template + +## How to contribute your work + +Please open a pull request at https://github.com/apple/swift-nio. Make sure the CI passes, and then wait for code review. diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt new file mode 100644 index 00000000..8668e4d4 --- /dev/null +++ b/CONTRIBUTORS.txt @@ -0,0 +1,18 @@ +For the purpose of tracking copyright, this is the list of individuals and +organizations who have contributed source code to SwiftAWSLambdaRuntime. + +For employees of an organization/company where the copyright of work done +by employees of that company is held by the company itself, only the company +needs to be listed here. + +## COPYRIGHT HOLDERS + +- Apple Inc. (all contributors with '@apple.com') + +### Contributors + +- Tomer Doron + +**Updating this list** + +Please do not edit this file manually. It is generated using `./scripts/generate_contributors_list.sh`. If a name is misspelled or appearing multiple times: add an entry in `./.mailmap` diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..638fb33b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM fabianfett/amazonlinux-swift:5.2-branch-amazonlinux2 + +RUN yum -y install \ + git \ + libuuid-devel \ + libicu-devel \ + libedit-devel \ + libxml2-devel \ + sqlite-devel \ + python-devel \ + ncurses-devel \ + curl-devel \ + tzdata \ + libtool \ + libatomic\ + gcc-c++ \ + jq \ + tar \ + zip diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/Package.swift b/Package.swift new file mode 100644 index 00000000..a1159497 --- /dev/null +++ b/Package.swift @@ -0,0 +1,22 @@ +// swift-tools-version:5.2 + +import PackageDescription + +let package = Package( + name: "my-lambda", + platforms: [ + .macOS(.v10_13), + ], + products: [ + .executable(name: "MyLambda", targets: ["MyLambda"]), + ], + dependencies: [ + .package(url: "git@github.com:swift-server/swift-aws-lambda-runtime.git", .branch("master")), + ], + targets: [ + // lambda code is abstracted into a library since we cant have a test target depend on an executable + .target(name: "MyLambda", dependencies: [ + .product(name: "AWSLambdaRuntime", package: "swift-aws-lambda-runtime"), + ]), + ] +) diff --git a/README.md b/README.md new file mode 100644 index 00000000..0c33c7e3 --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +# SwiftAWSLambdaRuntimeSample + +This repository is a deployable example demonstrating how to package and deploy +a Swift based Lambda to AWS. + +Steps to deploy this sample to ASW: + +* Login to AWS Console and create an AWS Lambda with the following settings: + * Runtime: Custom runtime + * Handler: Can be any string, does not matter in this case + + +* Build, package and deploy the Lambda + + ``` + ./scripts/deploy.sh + ``` + + This script assumes you have AWS CLI installed and credentials setup in `~/.aws/credentials` + +* Test it with the following example payloads: + + `` + { + "requestId": "1", + "error": "none" + } + `` + + or + + `` + { + "requestId": "2", + "error": "managed" + } + `` + + or + + `` + { + "requestId": "3", + "error": "boom" + } + `` + + or + + `` + { + "requestId": "4", + "error": "fatal" + } + `` diff --git a/Sources/MyLambda/main.swift b/Sources/MyLambda/main.swift new file mode 100644 index 00000000..fec72fa1 --- /dev/null +++ b/Sources/MyLambda/main.swift @@ -0,0 +1,182 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the SwiftAWSLambdaRuntime open source project +// +// Copyright (c) 2017-2018 Apple Inc. and the SwiftAWSLambdaRuntime project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of SwiftAWSLambdaRuntime project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +import AWSLambdaRuntime +import NIO + +// Lambda.run(StringLambda) +Lambda.run(CodableLambda) +// Lambda.run(APIGatewayProxyLambda()) +// Lambda.run(FakeAPIGatewayProxyLambda()) + +// MARK: - Lambda Samples + +func StringLambda(context: Lambda.Context, request: String, callback: (Result) -> Void) { + context.logger.debug("hello, string!") + callback(.success("hello, world!")) +} + +func CodableLambda(context: Lambda.Context, request: Request, callback: (Result) -> Void) { + context.logger.info("hello, json!") + switch request.error { + case .none: + callback(.success(Response(awsRequestId: context.requestId, requestId: request.requestId, status: .ok))) + case .managed: + callback(.success(Response(awsRequestId: context.requestId, requestId: request.requestId, status: .error))) + case .unmanaged(let error): + callback(.failure(UnmanagedError(description: error))) + case .fatal: + fatalError("crash!") + } +} + +struct APIGatewayProxyLambda: EventLoopLambdaHandler { + public typealias In = APIGatewayRequest + public typealias Out = APIGatewayResponse + + public init() {} + + public func handle(context: Lambda.Context, payload: APIGatewayRequest) -> EventLoopFuture { + context.logger.debug("hello, api gateway!") + return context.eventLoop.makeSucceededFuture(APIGatewayResponse(statusCode: 200, + headers: nil, + multiValueHeaders: nil, + body: "hello, world!", + isBase64Encoded: false)) + } +} + +struct FakeAPIGatewayProxyLambda: EventLoopLambdaHandler { + public typealias In = String + public typealias Out = String + + public init() {} + + public func handle(context: Lambda.Context, payload: String) -> EventLoopFuture { + context.logger.debug("hello, string!") + return context.eventLoop.makeSucceededFuture("{ \"statusCode\": 200, \"body\": \"hello, world!\" }") + } +} + +struct Request: Codable { + let requestId: String + let error: Error + + public init(requestId: String, error: Error? = nil) { + self.requestId = requestId + self.error = error ?? .none + } + + public enum Error: Codable, RawRepresentable { + case none + case managed + case unmanaged(String) + case fatal + + public init?(rawValue: String) { + switch rawValue { + case "none": + self = .none + case "managed": + self = .managed + case "fatal": + self = .fatal + default: + self = .unmanaged(rawValue) + } + } + + public var rawValue: String { + switch self { + case .none: + return "none" + case .managed: + return "managed" + case .fatal: + return "fatal" + case .unmanaged(let error): + return error + } + } + } +} + +struct Response: Codable { + let awsRequestId: String + let requestId: String + let status: Status + + public init(awsRequestId: String, requestId: String, status: Status) { + self.awsRequestId = awsRequestId + self.requestId = requestId + self.status = status + } + + public enum Status: Int, Codable { + case ok + case error + } +} + +struct UnmanagedError: Error { + let description: String +} + +struct APIGatewayRequest: Codable { + let resource: String + let path: String + let httpMethod: String? + let headers: [String: String]? + let multiValueHeaders: [String: [String]]? + let queryStringParameters: [String: String]? + let multiValueQueryStringParameters: [String: [String]]? + let pathParameters: [String: String]? + let stageVariables: [String: String]? + let requestContext: Context? + let body: String? + let isBase64Encoded: Bool? + + struct Context: Codable { + let accountId: String? + let resourceId: String? + let stage: String? + let requestId: String? + let identity: Identity? + let resourcePath: String? + let httpMethod: String? + let apiId: String + } + + struct Identity: Codable { + let cognitoIdentityPoolId: String? + let accountId: String? + let cognitoIdentityId: String? + let caller: String? + let apiKey: String? + let sourceIp: String? + let cognitoAuthenticationType: String? + let cognitoAuthenticationProvider: String? + let userArn: String? + let userAgent: String? + let user: String? + } +} + +struct APIGatewayResponse: Codable { + let statusCode: Int + let headers: [String: String]? + let multiValueHeaders: [String: [String]]? + let body: String? + let isBase64Encoded: Bool? +} diff --git a/scripts/deploy.sh b/scripts/deploy.sh new file mode 100755 index 00000000..625ab760 --- /dev/null +++ b/scripts/deploy.sh @@ -0,0 +1,48 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +## +## This source file is part of the SwiftAWSLambdaRuntime open source project +## +## Copyright (c) 2017-2018 Apple Inc. and the SwiftAWSLambdaRuntime project authors +## Licensed under Apache License v2.0 +## +## See LICENSE.txt for license information +## See CONTRIBUTORS.txt for the list of SwiftAWSLambdaRuntime project authors +## +## SPDX-License-Identifier: Apache-2.0 +## +##===----------------------------------------------------------------------===## + +lambda_name=SwiftSample +s3_bucket=swift-lambda-test +executable=$(swift package dump-package | sed -e 's|: null|: ""|g' | jq '.products[] | (select(.type.executable)) | .name' | sed -e 's|"||g') + +set -eu + +echo "-------------------------------------------------------------------------" +echo "preparing docker build image" +echo "-------------------------------------------------------------------------" +docker build . -t builder + +echo "-------------------------------------------------------------------------" +echo "updating code" +echo "-------------------------------------------------------------------------" +swift package update + +echo "-------------------------------------------------------------------------" +echo "building lambda executable" +echo "-------------------------------------------------------------------------" +docker run --rm -v `pwd`:/workspace -w /workspace builder bash -cl "swift build -c release -Xswiftc -g" +echo "done" + +echo "-------------------------------------------------------------------------" +echo "packaging lambda" +echo "-------------------------------------------------------------------------" +docker run --rm -v `pwd`:/workspace -w /workspace builder bash -cl "./scripts/package.sh $executable" + +echo "-------------------------------------------------------------------------" +echo "uploading to s3" +echo "-------------------------------------------------------------------------" + +aws s3 cp .build/lambda/lambda.zip s3://$s3_bucket/ +aws lambda update-function-code --function $lambda_name --s3-bucket $s3_bucket --s3-key lambda.zip diff --git a/scripts/generate_contributors_list.sh b/scripts/generate_contributors_list.sh new file mode 100755 index 00000000..d745e21e --- /dev/null +++ b/scripts/generate_contributors_list.sh @@ -0,0 +1,39 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +## +## This source file is part of the SwiftAWSLambdaRuntime open source project +## +## Copyright (c) 2017-2018 Apple Inc. and the SwiftAWSLambdaRuntime project authors +## Licensed under Apache License v2.0 +## +## See LICENSE.txt for license information +## See CONTRIBUTORS.txt for the list of SwiftAWSLambdaRuntime project authors +## +## SPDX-License-Identifier: Apache-2.0 +## +##===----------------------------------------------------------------------===## + +set -eu +here="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +contributors=$( cd "$here"/.. && git shortlog -es | cut -f2 | sed 's/^/- /' ) + +cat > "$here/../CONTRIBUTORS.txt" <<- EOF + For the purpose of tracking copyright, this is the list of individuals and + organizations who have contributed source code to SwiftAWSLambdaRuntime. + + For employees of an organization/company where the copyright of work done + by employees of that company is held by the company itself, only the company + needs to be listed here. + + ## COPYRIGHT HOLDERS + + - Apple Inc. (all contributors with '@apple.com') + + ### Contributors + + $contributors + + **Updating this list** + + Please do not edit this file manually. It is generated using \`./scripts/generate_contributors_list.sh\`. If a name is misspelled or appearing multiple times: add an entry in \`./.mailmap\` +EOF diff --git a/scripts/package.sh b/scripts/package.sh new file mode 100755 index 00000000..ed9ac6b7 --- /dev/null +++ b/scripts/package.sh @@ -0,0 +1,28 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +## +## This source file is part of the SwiftAWSLambdaRuntime open source project +## +## Copyright (c) 2017-2018 Apple Inc. and the SwiftAWSLambdaRuntime project authors +## Licensed under Apache License v2.0 +## +## See LICENSE.txt for license information +## See CONTRIBUTORS.txt for the list of SwiftAWSLambdaRuntime project authors +## +## SPDX-License-Identifier: Apache-2.0 +## +##===----------------------------------------------------------------------===## + + +set -eu + +executable=$1 + +target=.build/lambda +rm -rf "$target" +mkdir -p "$target" +cp ".build/release/$executable" "$target/" +cp -Pv /usr/lib/swift/linux/lib*so* /usr/lib64/libatomic.so.1* "$target" +cd "$target" +ln -s "$executable" "bootstrap" +zip --symlinks lambda.zip * diff --git a/scripts/sanity.sh b/scripts/sanity.sh new file mode 100755 index 00000000..d5f9d4f6 --- /dev/null +++ b/scripts/sanity.sh @@ -0,0 +1,128 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +## +## This source file is part of the SwiftAWSLambdaRuntime open source project +## +## Copyright (c) 2017-2018 Apple Inc. and the SwiftAWSLambdaRuntime project authors +## Licensed under Apache License v2.0 +## +## See LICENSE.txt for license information +## See CONTRIBUTORS.txt for the list of SwiftAWSLambdaRuntime project authors +## +## SPDX-License-Identifier: Apache-2.0 +## +##===----------------------------------------------------------------------===## + +set -eu + +here="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +function replace_acceptable_years() { + # this needs to replace all acceptable forms with 'YEARS' + sed -e 's/2017-2018/YEARS/' -e 's/2017-2020/YEARS/' -e 's/2019/YEARS/' -e 's/2020/YEARS/' +} + +printf "=> Checking format... " +FIRST_OUT="$(git status --porcelain)" +swiftformat . > /dev/null 2>&1 +SECOND_OUT="$(git status --porcelain)" +if [[ "$FIRST_OUT" != "$SECOND_OUT" ]]; then + printf "\033[0;31mformatting issues!\033[0m\n" + git --no-pager diff + exit 1 +else + printf "\033[0;32mokay.\033[0m\n" +fi + +printf "=> Checking license headers\n" +tmp=$(mktemp /tmp/.swift-aws-lambda-sanity_XXXXXX) + +for language in swift-or-c bash dtrace; do + printf " * $language... " + declare -a matching_files + declare -a exceptions + expections=( ) + matching_files=( -name '*' ) + case "$language" in + swift-or-c) + exceptions=( -name Package.swift ) + matching_files=( -name '*.swift' -o -name '*.c' -o -name '*.h' ) + cat > "$tmp" <<"EOF" +//===----------------------------------------------------------------------===// +// +// This source file is part of the SwiftAWSLambdaRuntime open source project +// +// Copyright (c) YEARS Apple Inc. and the SwiftAWSLambdaRuntime project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of SwiftAWSLambdaRuntime project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// +EOF + ;; + bash) + matching_files=( -name '*.sh' ) + cat > "$tmp" <<"EOF" +#!/bin/bash +##===----------------------------------------------------------------------===## +## +## This source file is part of the SwiftAWSLambdaRuntime open source project +## +## Copyright (c) YEARS Apple Inc. and the SwiftAWSLambdaRuntime project authors +## Licensed under Apache License v2.0 +## +## See LICENSE.txt for license information +## See CONTRIBUTORS.txt for the list of SwiftAWSLambdaRuntime project authors +## +## SPDX-License-Identifier: Apache-2.0 +## +##===----------------------------------------------------------------------===## +EOF + ;; + dtrace) + matching_files=( -name '*.d' ) + cat > "$tmp" <<"EOF" +#!/usr/sbin/dtrace -q -s +/*===----------------------------------------------------------------------===* + * + * This source file is part of the SwiftAWSLambdaRuntime open source project + * + * Copyright (c) YEARS Apple Inc. and the SwiftAWSLambdaRuntime project authors + * Licensed under Apache License v2.0 + * + * See LICENSE.txt for license information + * See CONTRIBUTORS.txt for the list of SwiftAWSLambdaRuntime project authors + * + * SPDX-License-Identifier: Apache-2.0 + * + *===----------------------------------------------------------------------===*/ +EOF + ;; + *) + echo >&2 "ERROR: unknown language '$language'" + ;; + esac + + expected_lines=$(cat "$tmp" | wc -l) + expected_sha=$(cat "$tmp" | shasum) + + ( + cd "$here/.." + find . \ + \( \! -path './.build/*' -a \ + \( "${matching_files[@]}" \) -a \ + \( \! \( "${exceptions[@]}" \) \) \) | while read line; do + if [[ "$(cat "$line" | replace_acceptable_years | head -n $expected_lines | shasum)" != "$expected_sha" ]]; then + printf "\033[0;31mmissing headers in file '$line'!\033[0m\n" + diff -u <(cat "$line" | replace_acceptable_years | head -n $expected_lines) "$tmp" + exit 1 + fi + done + printf "\033[0;32mokay.\033[0m\n" + ) +done + +rm "$tmp"