Git Product home page Git Product logo

git-lambda-layer's Introduction

Note: This repo is in maintenance mode as we assess whether Serverless GitHub Actions might provide a better experience going forward

LambCI

Serverless continuous integration

Launch CloudFormation Stack Serverless App Repository LambCI Build Status Gitter


Automate your testing and deployments with:

  • 1000 concurrent builds out of the box (can request more)
  • No maintenance of web servers, build servers or databases
  • Zero cost when not in use (ie, 100% utilization)
  • Easy to integrate with the rest of your AWS resources

Contents


What is it?

LambCI is a package you can upload to AWS Lambda that gets triggered when you push new code or open pull requests on GitHub and runs your tests (in the Lambda environment itself) – in the same vein as Jenkins, Travis or CircleCI.

It integrates with Slack, and updates your Pull Request and other commit statuses on GitHub to let you know if you can merge safely.

LambCI in action

It can be easily launched and kept up-to-date as a CloudFormation Stack, or you can manually create the different resources yourself.

Installed languages

  • Node.js 12.x (including npm/npx)
  • Python 3.6 (including pip)
  • Gcc 7.2 (including c++)

Supported languages

Prerequisites

Current Limitations (due to the Lambda environment itself)

  • No root access
  • 500MB disk space
  • 15 min max build time
  • Bring-your-own-binaries – Lambda has a limited selection of installed software
  • 3.0GB max memory
  • Linux only

You can get around many of these limitations by configuring LambCI to send tasks to an ECS cluster where you can run your builds in Docker.

Installation

You don't need to clone this repository – the easiest way to install LambCI is to deploy it from the Serverless Application Repository or directly spin up a CloudFormation stack. This will create a collection of related AWS resources, including the main LambCI Lambda function and DynamoDB tables, that you can update or remove together – it should take around 3 minutes to spin up.

You can use multiple repositories from the one stack, and you can run multiple stacks with different names side-by-side too (eg, lambci-private and lambci-public).

If you'd prefer to run your stack after cloning this repository, you can use npm run deploy – this depends on AWS SAM CLI being installed.

1. Create a GitHub token

You can create a token in the Personal access tokens section of your GitHub settings. If you're setting up LambCI for an organization, it might be a good idea to create a separate GitHub user dedicated to running automated builds (GitHub calls these "machine users") – that way you have more control over which repositories this user has access to.

Click the Generate new token button and then select the appropriate access levels.

LambCI only needs read access to your code, but unfortunately GitHub webhooks have rather crude access mechanisms and don't have a readonly scope for private repositories – the only options is to choose repo ("Full control").

Private GitHub access

If you're only using LambCI for public repositories, then you just need access to commit statuses:

Public GitHub access

Then click the "Generate token" button and GitHub will generate a 40 character hex OAuth token.

2. Create a Slack token (optional)

You can obtain a Slack API token by creating a bot user (or you can use the token from an existing bot user if you have one) – this direct link should take you there, but you can navigate from the App Directory via Browse Apps > Custom Integrations > Bots.

Pick any name, and when you click "Add integration" Slack will generate an API token that looks something like xoxb-<numbers>-<letters>

Add Slack bot

3. Launch the LambCI CloudFormation stack

You can either deploy it from the Serverless Application Repository or use this direct CloudFormation link or navigate in your AWS Console to Services > CloudFormation, choose "Create Stack" and use the S3 link:

CloudFormation Step 1

Then click Next where you can enter a stack name (lambci is a good default), API tokens and a Slack channel – you'll also need to make up a secret to secure your webhook and enter it as the GithubSecret – any randomly generated value is good here, but make sure you still have it handy to enter when you setup your webhooks in GitHub later on.

CloudFormation Step 2

Click Next, and then Next again on the Options step (leaving the default options selected), to get to the final Review step:

CloudFormation Step 3

Check the acknowledgments, click Create Change Set and then Execute to start the resource creation process:

CloudFormation Step 4

Once your stack is created (should be done in a few minutes) you're ready to add the webhook to any repository you like!

You can get the WebhookUrl from the Outputs of the CloudFormation stack:

CloudFormation Step 5

Then create a new Webhook in any GitHub repo you want to trigger under Settings > Webhooks (https://github.com/<user>/<repo>/settings/hooks/new) and enter the WebhookUrl from above as the Payload URL, ensure Content type is application/json and enter the GithubSecret you generated in the first step as the Secret:

GitHub Webhook Step 1

Assuming you want to respond to Pull Requests as well as Pushes, you'll need to choose "Let me select individual events", and check Pushes and Pull requests.

GitHub Webhook Step 2

Then "Add webhook" and you're good to go!

By default LambCI only responds to pushes on the master branch and pull requests (you can configure this), so try either of those – if nothing happens, then check Services > CloudWatch > Logs in the AWS Console and see the Questions section below.

Installing as a nested stack in another CloudFormation stack

You can also embed LambCI in your own stack, using a AWS::Serverless::Application resource:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:
  LambCI:
    Type: AWS::Serverless::Application
    Properties:
      Location:
        ApplicationId: arn:aws:serverlessrepo:us-east-1:553035198032:applications/lambci
        SemanticVersion: 0.11.2
      Parameters:
        GithubToken: '123456789abcdef123456789abcdef123456789'
        GithubSecret: 'my-web-secret'
        SlackChannel: '#general'
        SlackToken: 'xoxb-123456789-abcdefABCDEFabcdef'

Outputs:
  S3Bucket:
    Description: Name of the build results S3 bucket
    Value: !GetAtt LambCI.Outputs.S3Bucket
  WebhookUrl:
    Description: GitHub webhook URL
    Value: !GetAtt LambCI.Outputs.WebhookUrl

If you save the above as template.yml, then you can use the AWS SAM CLI to deploy from the same directory:

sam deploy --stack-name lambci --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND

Configuration

Many configuration values can be specified in a .lambci.js, .lambci.json or package.json file in the root of your repository – and all values can be set in the DynamoDB configuration table (named <stack>-config, eg, lambci-config)

For example, the default command that LambCI will try to run is npm ci && npm test, but let's say you have a python project – you could put the following in .lambci.json in your repository root:

{
  "cmd": "pip install --user tox && tox"
}

(LambCI bundles pip and adds $HOME/.local/bin to PATH)

If you have a more complicated build setup, then you could specify make or create a bash script in your repository root:

{
  "cmd": "./lambci-test.sh"
}

Overriding default properties

LambCI resolves configuration by overriding properties in a cascading manner in the following order:

  1. Default config (see below)
  2. global project key in lambci-config DynamoDB table
  3. gh/<user>/<repo> project key in lambci-config DynamoDB table
  4. lambci property in package.json file in repository root
  5. .lambci.js or .lambci.json file in repository root

You can use the command line to edit the DynamoDB config values:

lambci config secretEnv.GITHUB_TOKEN abcdef01234
lambci config --project gh/mhart/kinesalite secretEnv.SLACK_TOKEN abcdef01234

Or the AWS console:

Global config in DynamoDB

So if you wanted to use a different Slack token and channel for a particular project, you could create an item in the config table with the project key gh/<user>/<repo> that looks similar to the global config above, but with different values:

{
  project: 'gh/mhart/kinesalite',
  secretEnv: {
    SLACK_TOKEN: 'xoxb-1234243432-vnjcnioeiurn'
  },
  notifications: {
    slack: {
      channel: '#someotherchannel'
    }
  }
}

Using the command line:

lambci config --project gh/mhart/kinesalite secretEnv.SLACK_TOKEN xoxb-1234243432-vnjcnioeiurn
lambci config --project gh/mhart/kinesalite notifications.slack.channel '#someotherchannel'

Config file overrides

Here's an example package.json overriding the cmd property:

{
  "name": "some-project",
  "scripts": {
    "lambci-build": "eslint . && mocha"
  },
  "lambci": {
    "cmd": "npm ci && npm run lambci-build"
  }
}

And the same example using .lambci.js:

module.exports = {
  cmd: 'npm ci && npm run lambci-build'
}

The ability to override config properties using repository files depends on the allowConfigOverrides property (see the default config below).

Branch and pull request properties

Depending on whether LambCI is building a branch from a push or a pull request, config properties can also be specified to override in these cases.

For example, to determine whether a build should even take place, LambCI looks at the top-level build property of the configuration. By default this is actually false, but if the branch is master, then LambCI checks for a branches.master property and if it's set, uses that instead:

{
  build: false,
  branches: {
    master: true
  }
}

If a branch just has a true value, this is the equivalent of {build: true}, so you can override other properties too – ie, the above snippet is just shorthand for:

{
  build: false,
  branches: {
    master: {
      build: true
    }
  }
}

So if you wanted Slack notifications to go to a different channel to the default for the develop branch, you could specify:

{
  branches: {
    master: true,
    develop: {
      build: true,
      notifications: {
        slack: {
          channel: '#dev'
        }
      }
    }
  }
}

You can also use regular expression syntax to specify config for branches that match, or don't match (if there is a leading !). Exact branch names are checked first, then the first matching regex (or negative regex) will be used:

// 1. Don't build gh-pages branch
// 2. Don't build branches starting with 'dev'
// 3. Build any branch that doesn't start with 'test-'
{
  build: false,
  branches: {
    '/^dev/': false,
    '!/^test-/': true,
    'gh-pages': false,
  }
}

Default configuration

This configuration is hardcoded in utils/config.js and overridden by any config from the DB (and config files)

{
  cmd: 'npm ci && npm test',
  env: { // env values exposed to build commands
  },
  secretEnv: { // secret env values, exposure depends on inheritSecrets config below
    GITHUB_TOKEN: '',
    GITHUB_SECRET: '',
    SLACK_TOKEN: '',
  },
  s3Bucket: '', // bucket to store build artifacts
  notifications: {
    slack: {
      channel: '#general',
      username: 'LambCI',
      iconUrl: 'https://lambci.s3.amazonaws.com/assets/logo-48x48.png',
      asUser: false,
    },
  },
  build: false, // Build nothing by default except master and PRs
  branches: {
    master: true,
  },
  pullRequests: {
    fromSelfPublicRepo: true, // Pull requests from same (private) repo will build
    fromSelfPrivateRepo: true, // Pull requests from same (public) repo will build
    fromForkPublicRepo: { // Restrictions for pull requests from forks on public repos
      build: true,
      inheritSecrets: false, // Don't expose secretEnv values in the build command environment
      allowConfigOverrides: ['cmd', 'env'], // Only allow file config to override cmd and env properties
    },
    fromForkPrivateRepo: false, // Pull requests from forked private repos won't run at all
  },
  s3PublicSecretNames: true, // Use obscured names for build HTML files and make them public. Has no effect in public repositories
  inheritSecrets: true, // Expose secretEnv values in the build command environment by default
  allowConfigOverrides: true, // Allow files to override config values
  clearTmp: true, // Delete /tmp each time for safety
  git: {
    depth: 5, // --depth parameter for git clone
  },
}

SNS Notifications (for email, SMS, etc)

By default, the CloudFormation template doesn't create an SNS topic to publish build statuses (ie, success, failure) to – but if you want to receive build notifications via email or SMS, or some other custom SNS subscriber, you can specify an SNS topic and LambCI will push notifications to it:

notifications: {
  sns: {
    topicArn: 'arn:aws:sns:us-east-1:1234:lambci-StatusTopic-1WF8BT36'
  }
}

The Lambda function needs to have permissions to publish to this topic, which you can either add manually, or by modifying the CloudFormation template.yaml and updating your stack.

Add a top-level SNS topic resource (a commented-out example of this exists in template.yaml):

  StatusTopic:
    Type: AWS::SNS::Topic
    Properties:
      DisplayName: LambCI

And ensure the Lambda function has permissions to publish to it:

  BuildLambda:
    Type: AWS::Serverless::Function
    Properties:
      # ...
      Policies:
        # ...
        - SNSPublishMessagePolicy:
            TopicName: !Ref StatusTopic

Build status badges

Each branch has a build status image showing whether the last build was successful or not. For example, here is LambCI's latest master status (yes, LambCI dogfoods!):

LambCI Build Status

You can see the URLs for the branch log and badge image near the start of the output of your build logs (so you'll need to run at least one build on your branch to get these):

Branch log: https://<bucket>/<project>/branches/master/<somehash>.html
Branch status img: https://<bucket>/<project>/branches/master/<somehash>.svg

Updating

You can update your CloudFormation stack at any time to change, add or remove the parameters – or even upgrade to a new version of LambCI.

In the AWS Console, go to Services > CloudFormation, select your LambCI stack in the list and then choose Actions > Update Stack. You can keep the same template selected (unless you're updating LambCI), and then when you click Next you can modify parameters like your GitHub token, Slack channel, etc.

LambCI will do its best to update these parameters correctly, but if it fails or you run into trouble, just try setting them all to blank, updating, and then update again with the values you want.

If you've (only) modified template.yaml locally, then you'll need to run npm run template and use build/versioned.yaml to update your stack.

If you've modified other LambCI code locally, you can update with npm run deploy – this requires AWS SAM CLI to be installed.

Updating to 0.10.0 from earlier versions

Updating to 0.10.0 should Just Work™ using the new template – however GitHub shut down the use of SNS hooks, which is how LambCI was previously triggered, so you'll need to go through any repositories on GitHub that you had setup with previous LambCI versions, remove the SNS hook if it wasn't removed already (in Settings), and add the new webhook as laid out in Installation.

Security

The default configuration passes secret environment variables to build commands, except when building forked repositories. This allows you to use your AWS credentials and Git/Slack tokens in your build commands to communicate with the rest of your stack. Set inheritSecrets to false to prevent this.

HTML build logs are generated with random filenames, but are accessible to anyone who has the link. Set s3PublicSecretNames to false (only works for private repositories) to make build logs completely private (you'll need to use the AWS console to access them), or you can remove s3Bucket entirely – you can still see the build logs in the Lambda function output in CloudWatch Logs.

By default, the /tmp directory is removed each time – this is to prevent secrets from being leaked if your LambCI stack is building both private and public repositories. However, if you're only building private (trusted) repositories, then you can set the clearTmp config to false, and potentially cache files (eg, in $HOME) for use across builds (this is not guaranteed – it depends on whether the Lambda environment is kept "warm").

If you discover any security issues with LambCI please email [email protected].

Language Recipes

The default command is npm ci && npm test which will use Node.js 12.14.1 and npm 6.13.6.

The way to build with different Node.js versions, or other languages entirely, is just to override the cmd config property.

LambCI comes with a collection of helper scripts to setup your environment for languages not supported out of the box on AWS Lambda – that is, every language except Node.js and Python 3.6

Node.js

LambCI comes with nave installed and available on the PATH, so if you wanted to run your npm install and tests using Node.js v10.x, you could do specify:

{
  "cmd": "nave use 10 bash -c 'npm ci && npm test'"
}

If you're happy using the built-in npm to install, you could simplify this a little:

{
  "cmd": "npm ci && nave use 10 npm test"
}

There's currently no way to run multiple builds in parallel but you could have processes run in parallel using a tool like npm-run-all – the logs will be a little messy though!

Here's an example package.json for running your tests in Node.js v8, v10 and v12 simultaneously:

{
  "lambci": {
    "cmd": "npm ci && npm run ci-all"
  },
  "scripts": {
    "ci-all": "run-p ci:*",
    "ci:node8": "nave use 8 npm test",
    "ci:node10": "nave use 10 npm test",
    "ci:node12": "nave use 12 npm test"
  },
  "devDependencies": {
    "npm-run-all": "*"
  }
}

Python

LambCI comes with pip installed and available on the PATH, and Lambda has Python 3.6 already installed. $HOME/.local/bin is also added to PATH, so local pip installs should work:

{
  "cmd": "pip install --user tox && tox"
}

Other Python versions with pyenv

LambCI comes with pyenv installed and a script you can source to setup the pyenv root and download prebuilt versions for you.

Call it with the Python version you want (currently: 3.8.0, 3.7.4, 3.6.9 or system, which will use the 3.6 version already installed on Lambda):

{
  "cmd": ". ~/init/python 3.8.0 && pip install --user tox && tox"
}

Java

The Java SDK is not installed on AWS Lambda, so needs to be downloaded as part of your build – but the JRE does exist on Lambda, so the overall impact is small.

LambCI includes a script you can source before running your build commands that will install and setup the SDK correctly, as well as Maven (v3.6.3). Call it with the OpenJDK version you want (currently only 1.8.0):

{
  "cmd": ". ~/init/java 1.8.0 && mvn install -B -V && mvn test"
}

You can see an example of this working here – and the resulting build log.

Go

Go is not installed on AWS Lambda, so needs to be downloaded as part of your build, but Go is quite small and well suited to running anywhere.

LambCI includes a script you can source before running your build commands that will install Go and set your GOROOT and GOPATH with the correct directory structure. Call it with the Go version you want (any of the versions on the Go site):

{
  "cmd": ". ~/init/go 1.13.5 && make test"
}

You can see examples of this working here – and the resulting build log.

Ruby

Ruby is not installed on AWS Lambda, so needs to be downloaded as part of your build.

LambCI includes a script you can source before running your build commands that will install Ruby, rbenv, gem and bundler. Call it with the Ruby version you want (currently: 2.7.0, 2.6.5, 2.5.7, 2.4.9, 2.3.8, 2.2.10, 2.1.10 or 2.0.0-p648):

{
  "cmd": ". ~/init/ruby 2.7.0 && bundle install && bundle exec rake"
}

You can see an example of this working here – and the resulting build log.

PHP

PHP is not installed on AWS Lambda, so needs to be downloaded as part of your build.

LambCI includes a script you can source before running your build commands that will install PHP, phpenv and composer. Call it with the PHP version you want (currently: 7.3.13, 7.2.26, 7.1.33, 7.0.32 or 5.6.38):

{
  "cmd": ". ~/init/php 7.3.13 && composer install -n --prefer-dist && vendor/bin/phpunit"
}

These versions are compiled using php-build with the default config options and overrides of --disable-cgi and --disable-fpm.

You can see an example of this working here – and the resulting build log.

Extending with ECS

LambCI can run tasks on an ECS cluster, which means you can perform all of your build tasks in a Docker container and not be subject to the same restrictions you have in the Lambda environment.

This needs to be documented further – for now you'll have to go off the source and check out the lambci/ecs repo.

Questions

What does the Lambda function do?

  1. Receives notification from GitHub (via a webhook)
  2. Looks up config in DynamoDB
  3. Clones git repo using a bundled git binary
  4. Looks up config files in repo
  5. Runs install and build cmds on Lambda (or starts ECS task)
  6. Updates Slack and GitHub statuses along the way (optionally SNS for email, etc)
  7. Uploads build logs/statuses to S3

License

MIT

git-lambda-layer's People

Contributors

mhart avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

git-lambda-layer's Issues

Python Support

I see in the Dockerfile there is NO_PYTHON=1, I'm assuming this breaks Python support? Is there a reason for this?

How would I go about creating my own Layer that includes Git for use inside Python? I am aiming to use this library which requires git:

https://github.com/dxa4481/truffleHog

Could you add the build process?

Hi,

this is a nice idea. Thanks for the project.

However it seems to be working with binary files inside a .zip archive. Could you also opensource the build process for the zip file, so that users don't need to execute binary files on their production environment?

I also want to build this myself, so that I don't have to rely on a arbitrary aws account, that could go offline someday :D.

With kind regards,
Tim

Unable to import module 'lambda_function': No module named 'git'

I followed steps to set up git layer using provided ARN with eu-west-1 region. I am doing "from git import Repo", but I do get following error then testing my lambda: "Unable to import module 'lambda_function': No module named 'git'". Any ideas how to solve this?

Python3.8: Error while loading shared libraries: libcurl

Hi, I've noticed that the git-lambda-layer does not work with python3.8. It does work fine with 3.6, i have not tested 3.7.

Error:
Cloning into '/tmp/repo'...
/opt/libexec/git-core/git-remote-https: error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory

Cheers

EDIT:

It works fine on both 3.6 and 3.7.

File too short on shared library libpcre2-8.so.0

Hi!

I am trying to run git with this layer in a SAM lambda build.

Template snippet:

LambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/
      Handler: app.lambda_handler
      Runtime: python3.7
      Layers:
        - arn:aws:lambda:eu-west-1:553035198032:layer:git:10

Code snippet:

subprocess.call(['git', 'init', '/tmp/Apps/CDN/'])

or

os.system('cd /tmp/Apps/CDN && git init')

All attempts fail with git: error while loading shared libraries: /opt/lib/libpcre2-8.so.0: file too short

I also tried using the second version of the layer (despite py3.7 not being listed for it) instead, but that also fail with the same error.

Any ideas how this can be solved?

Lambda -> Git SSH Authentication

Hello,

  • Followed Complex example on Node.js w/ ssh steps from README.
  • Facing issue in authenticating to git over ssh. Verified same creds work locally.
  • As per guide, getting the private key from AWS SSM and added public key to GIT and /tmp/known_hosts.
  • Setting environment var for GIT_SSH_COMMAND with UserKnownHostsFile=/tmp/known_hosts and StrictHostKeyChecking=no options.

Python Lambda function:

import os
import subprocess
import boto3
import git

def lambda_handler(event, context):

    # get SSH key
    ssm = boto3.client('ssm')
    parameter = ssm.get_parameter(Name='gitLambda')
    gitLambdaKey = parameter['Parameter']['Value']

    # save SSH key in /tmp and chmod permissions
    with open('/tmp/gitLambdaKey', 'w') as outfile:
        outfile.write(gitLambdaKey)
    os.chmod('/tmp/gitLambdaKey', 0o400) # leading 0 in python2 and 0o in python 3 denies octal

    # clean up /tmp and make dir for repo
    os.system("rm -rf /tmp/* ; mkdir /tmp/git")
    # To fix "Warning: Remote Host Identification Has Changed" error clear known hosts for github.com first then add new
    os.system('ssh-keygen -f "/tmp/known_hosts" -R "github.com"')
    
    with open('/tmp/known_hosts', 'w') as outfile:
        outfile.write("github.com,192.30.252.*,192.30.253.*,192.30.254.*,192.30.255.*,140.82.113.* ssh-rsa AAA ... cU=")

    os.environ['GIT_SSH_COMMAND'] = "ssh -o UserKnownHostsFile=/tmp/known_hosts -o StrictHostKeyChecking=no -i /tmp/gitLambdaKey"

    try:
        cmd = 'ssh -v [email protected]'
        output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True, universal_newlines=True)
    except subprocess.CalledProcessError as exc:
        print("Status FAIL:", exc.returncode, exc.output)
    else:
        print("Output: \n{}\n".format(output))

Error with public key in /tmp/known_hosts:

debug1: Reading configuration data /opt/etc/ssh/ssh_config
debug1: /opt/etc/ssh/ssh_config line 58: Applying options for *
Pseudo-terminal will not be allocated because stdin is not a terminal.
debug1: Connecting to github.com [140.82.113.4] port 22.
debug1: Connection established.
debug1: SELinux support disabled
Could not create directory '/home/sbx_user1051/.ssh'.
debug1: key_load_public: No such file or directory
debug1: identity file /home/sbx_user1051/.ssh/id_rsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/sbx_user1051/.ssh/id_rsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/sbx_user1051/.ssh/id_dsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/sbx_user1051/.ssh/id_dsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/sbx_user1051/.ssh/id_ecdsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/sbx_user1051/.ssh/id_ecdsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/sbx_user1051/.ssh/id_ed25519 type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/sbx_user1051/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.4
debug1: Remote protocol version 2.0, remote software version babeld-5a455904
debug1: no match: babeld-5a455904
debug1: Authenticating to github.com:22 as 'git'
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256
debug1: kex: host key algorithm: rsa-sha2-512
debug1: kex: server->client cipher: [email protected] MAC: <implicit> compression: none
debug1: kex: client->server cipher: [email protected] MAC: <implicit> compression: none
debug1: kex: curve25519-sha256 need=64 dh_need=64
debug1: kex: curve25519-sha256 need=64 dh_need=64
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ssh-rsa SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8
debug1: read_passphrase: can't open /dev/tty: No such file or directory
Host key verification failed.

Any guidance is appreciated. Thank You.

Support for arm64 lambdas

Hi @mhart
The layer is currently not supported on arm64 AWS Lambdas.

On running it, the following error is displayed:
/bin/sh: /opt/bin/git: cannot execute binary file

Can you please provide a workaround for this?

How to use "git push" ?

Hi,
Thanks for [git-lambda-layer]!
I want to build a function to commit something to my github.
Under the layer, I can clone/add/commit in /tmp/my-repository folder, but when I try to push the change to origin branch, I run into below issue. Could you help me to resolve the issue?

error:
...
Could not create directory '/home/sbx_user1051/.ssh'.
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

...

This is my code

_const { execSync } = require('child_process')
const process = require('process')
const { GITHUB_TOKEN, GITHUB_USERNAME, GITHUB_EMAIL, GITHUB_REPO, PASSWD } = process.env
exports.handler = async (event) => {
const config = {
token: GITHUB_TOKEN,
username: GITHUB_USERNAME,
email: GITHUB_EMAIL,
repo: GITHUB_REPO,
password: PASSWD
}
const gitUrl = github.com/${config.username}/${config.repo}.git
const execOpt = { encoding: 'utf8', stdio: 'inherit' }

//execSync(`git config --global user.email ${config.email}`, execOpt)
//execSync(`git config --global user.name ${config.username}`, execOpt)

execSync(`rm -rf /tmp/${config.repo}`, execOpt)
execSync(`cd /tmp && git clone https://${gitUrl} \

&& ls && cd SI-AutomationTest && echo testxxx>test.txt
&& git config --local user.email ${config.email}
&& git config --local user.name ${config.username}
&& git add test.txt
&& git branch
&& git config --local user.email ${config.email}
&& git config --local user.name ${config.username}
&& git commit -m '[skip ci] hhhaa'
&& git remote -v
&& git config --local user.email ${config.email}
&& git config --local user.name ${config.username}
&& git remote set-url origin [email protected]:${config.username}/${config.rep}.git
&& git config --local user.email ${config.email}
&& git config --local user.name ${config.username}
&& git push -u origin main`, execOpt)
}_

AccessDeniedException on Gov Cloud?

Hi, I'm trying to run git on my lambda function which is on us-gov-west-1, but got an error saying I was unauthorized to perform GetLayer action on the layer's resource arn although my user's IAM policy already covers Lambda. I'm wondering if the resource is available in my region or not. I've tried using the layer on the commercial environment and it works perfectly, so I'm not sure if I'm missing anything... I'd really appreciate your help!

Cannot load PCRE

Unfortunatelly I got this error when trying to use git in real AWS Lambda
/opt/bin/git: error while loading shared libraries: libpcre2-8.so.0: cannot open shared object file: No such file or directory

Runtime:
nodejs12.x

Used layer:
arn:aws:lambda:eu-central-1:553035198032:layer:git-lambda2:6

ssh cloning broken in version 4

I just started using this for a side project of mine. I believe that the version 4 build ships a broken ssh that isn't linked properly to libfipscheck.so.1. This prevents ssh clones from working. Using the version 3 or 2 ARN link works fine.

run using arn:aws:lambda:us-east-2:553035198032:layer:git:4 as a layer

+ ldd /opt/bin/ssh
	linux-vdso.so.1 =>  (0x00007ffc826fd000)
	libfipscheck.so.1 => not found
	libselinux.so.1 => /usr/lib64/libselinux.so.1 (0x00007fdcfddae000)
	libcrypto.so.10 => /var/lang/lib/libcrypto.so.10 (0x00007fdcfd950000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007fdcfd74c000)
	libldap-2.4.so.2 => /lib64/libldap-2.4.so.2 (0x00007fdcfd4fa000)
	liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007fdcfd2eb000)
	libutil.so.1 => /lib64/libutil.so.1 (0x00007fdcfd0e8000)

Layer does not appear to function in Lambda nodejs10.x

Git layer fails in the new Lambda nodejs10.x container released this week.

Repro steps:

  • I used arn:aws:lambda:us-west-1:553035198032:layer:git:5 in us-west-1
  • Lambda configured with nodejs10.x
  • Ran the following child_process.exec git clone command (from within /tmp): git clone https://$USERNAME:[email protected]/$OWNER/$REPO.git
  • Received the following error: error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory

This isn't particular surprising considering the messaging AWS has been doing this week about the underlying library changes in Lambda nodejs10.x.

Reference:

Their announcement email:

Hello,

We are updating the AWS Lambda and AWS Lambda@Edge execution environment to include recent versions of Amazon Linux and software packages.

A majority of functions will seamlessly benefit from the enhancements in this update without requiring you to take any action. However, in rare cases package updates may introduce compatibility issues. Functions that contain libraries or application code compiled against very specific underlying OS packages, specifically those for openssl, glibc, or other system libraries, may potentially be impacted.

Starting May 14, 2019, you can test your functions with the new execution environment. From May 21, 2019, all new functions or updates of existing functions will use the new execution environment. Your existing functions will automatically migrate to using the new execution environment on June 11, 2019.

See the following blog post to learn more about the update including the timeline, testing guidelines, and how you can prepare[1].

[1] https://aws.amazon.com/blogs/compute/upcoming-updates-to-the-aws-lambda-execution-environment/

Sincerely,
Amazon Web Services

Edit: per tweeters, ratcheting down urgency since AWS Linux 2 isn't being forced into other Lambda container images yet; re-scoped issue more specifically to nodejs10.x

Support for GIT v2.30.2 because of Security Vulnerability

Hi, I've noticed there is a new security vulnerability in the last few versions of GIT and there is a patch already available in version v2.30.2.

More info from GitHub: https://github.blog/2021-03-09-git-clone-vulnerability-announced/

Would you mind building the latest patched version of GIT into a new layer version so everybody can upgrade as soon as possible?

Also, deprecating the vulnerable versions would be nice.

Thank you, we appreciate your work. :)

Python import git module error for AWS Lambda

Hello,

  • I'm trying to import git in a python AWS lambda.

  • After following through guide and adding a new layer with ARN: arn:aws:lambda:us-east-1:553035198032:layer:git-lambda2:7 the function is not able to import module.
    image

  • Verified the lambda's and layer's ARN match which is us-east-1.

  • Error Response:

image

Any guidance is appreciated. Thank You.

Lambda nodejs10.x warning: templates not found in /tmp/git/usr/share/git-core/templates

Hi :)

I'm trying to get this layer working in my lambda
I'm using serverless and have added the layer to my function

layers:
      - arn:aws:lambda:${opt:region}:553035198032:layer:git-lambda2:3

When I try to clone a https:// git repo I get the error

warning: templates not found in /tmp/git/usr/share/git-core/templates

I can see git binaries in /opt/bin

2019-12-17T11:08:11.860Z	7fee8550-01f8-4f1e-8d25-da11de063fae	INFO	log gitBinaryDir contents
2019-12-17T11:08:11.860Z	7fee8550-01f8-4f1e-8d25-da11de063fae	INFO	fipscheck
fipshmac
git
git-receive-pack
git-shell
git-upload-archive
git-upload-pack
idn2
scp
sftp
slogin
ssh
ssh-add
ssh-agent
ssh-copy-id
ssh-keygen
ssh-keyscan
xmlwf

but I also see this env vars in my lambda env

GIT_TEMPLATE_DIR: '/tmp/git/usr/share/git-core/templates',
GIT_EXEC_PATH: '/tmp/git/usr/libexec/git-core',

The question I have is. What is the true location of the templates, so that I can set them correctly in my lambda environment?

Thanks again, for all the good work here, and please keep it up!

Lambda nodejs12.x - Permission denied (Public Key)

Hi everyone :D

I'm trying to get this layer working in my lambda
I'm using serverless and have added the layer to my function

image

I'm using nodejs12.x and Git version 2.25.0 | OpenSSH_7.4p1, OpenSSL 1.0.2k-fips and the copy of the example "Complex example on Node.js w/ ssh" with my private key hardcoded in the file:

image

I generated a new private and public key and tested them previously, but in my logs in the CloudWatch i got:

image

I tried many ways to resolve, but I failed.
Anyway, congrats for the amazing work!
Thanks :)

[Question] Uploading my own zip file

Hello!

I'm trying to use your project in my lambda, but due to restriction of my company's infrastructure, I need to deploy the git layer to our own s3.

I uploaded this zip file to our s3 but it did not work, git is still unavailable.

My question is: Is this zip file supposed to work used like this?
It totally can be something on my end, but it appears that everything is as it should, so I came here to exclude this possibility :)

Permission Denied and File Too Short errors for git and ssh

Running git in lambda, I get /bin/sh: /opt/bin/git: Permission denied.

Using docker run to get interactive shell, I get the same error trying to run git: sh: /opt/bin/git: Permission denied.
The problem seems to be the lack of execution permission on files in /opt/bin:
-rw-rw-rw- 1 sbx_user1051 495 2480144 Dec 24 20:24 git
-rw-rw-rw- 1 sbx_user1051 495 658056 Dec 24 20:24 ssh

Granting permission using chmod +x /opt/bin/* fixes this problem.
But, ssh still doesn't work due to another error: ssh: error while loading shared libraries: /opt/lib/libfipscheck.so.1: file too short, not sure why.

I tested this on an image created and cached by AWS SAM CLI after attempting to locally invoke the lambda.

Could not create directory '/home/sbx_user1070/.ssh'.

while running ssh command , it shows sth like

Could not create directory '/home/sbx_user1070/.ssh'.

I guess this is related to AWS Lambda's read-only file system.

Even with the HOME env var set to something like /tmp/home/ the error message is still there..

Not sure if it matters . But anyway the error msg bothers me -_| 🤣

Issues Connecting to Bitbucket

Im trying to connect to Bitbucket and I’m having an issue authenticating. I’m connecting using SSH and I’m wondering if I can just add bitbucket.org to the list ok known hosts as in the example you’ve shown?

Should I keep the line written in known_host or should I adapt it? Sorry I’m not too familiar with all of that.

Could not resolve hostname

I'm running exactly your second example (substituting my own key and repo) and hitting this error:

ssh: Could not resolve hostname github.com:myorganization: Name or service not known

my key and known_hosts file appear fine, I can run

ssh -T git@github
and get
Hi schwiet! You've successfully authenticated, but GitHub does not provide shell access.

One thing, I noticed is that it seems the documented environment variable is GIT_SSH and not GIT_SSH_COMMAND, but unfortunately changing that did not resolve the problem.

Support for using layer.zip with AWS Lambda containers

I realize this probably out of scope

We have a Python lambda that runs from the AWS lambda container

FROM public.ecr.aws/lambda/python:3.8

We are running into the issue with git clone command.

PRIV_END: seteuid: Operation not permitted

I have tried setting the environment variable but this is not working

ENV GIT_SSH_COMMAND='ssh -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no'

I see you have the layer.zip with all the binaries - would it be possible to share instructions on how to use this in the lambda container? Do I merge the files into the respective folders in the container?

thanks for any reply - this is the only place I have found where there seems to be a solution for this problem

Could not deploy because lambda with layer exceeded 250 mb...

An error occurred: TrainUnderscoreminorLambdaFunction - Function code combined with layers exceeds the maximum allowed size of 262144000 bytes. The actual size is 263669938 bytes. (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: b05441bc-77f9-4416-b9b0-3625bfe59d64).

I had to use number 5 instead of 13 for it to work.

Git tries to create ~/.ssh/ directory

I tailored the complex example to Python and am receiving an error which seems to make this not work. It's possible the problem is on my side but it seems like something is missing from the example since it's still trying to write to .ssh.

Cloning into '/tmp/git'...
Could not create directory '/home/sbx_user1075/.ssh'.
Warning: Permanently added the RSA host key for IP address '52.95.19.19' to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Add support for git lfs

Any chance it would be worthwhile for you guys to add support for git lfs to this layer? Or perhaps that should be something I request be added to yumda?

Add package.json

I am updating an open PR for serverless to use git-lambda-layer instead of lambda-git.

Having a package.json is required by npm when I add git-lambda-layer as a github dev-dependency.

Would it be to much trouble to add a package.json?

If you prefer I can do it in a PR so you just have to merge it ;-)

Thanks in advance!

known_hosts and id_rsa

Great job! Thank you LambCI

just curious

The example file shows that it dynamically creates two files, known_hosts and id_rsa under the "/tmp" folder
Would it be easier to create and deploy a separate AWS layer (that layer would only contain these two files) , so that these two files will always be there in the "/opt" directory ...
coz AWS supports up to 5 layers at the same time.

Question:
Not so sure if we still need to run chmod 400 in this case. Do you think it would be necessary?

Nodejs12 doesn't seem to be working with layer v3?

I tried to attach the layer as instructed in the readme (arn:aws:lambda:us-west-2:553035198032:layer:git-lambda2:3), and it seems to be there, but when I run my lambda, I get the following error still:

git clone: Cloning into 'route53_monitoring_check'...
/tmp/git/usr/libexec/git-core/git-remote-https: error while loading shared libraries: libpcre.so.0: cannot open shared object file: No such file or directory

I'm sorry if I'm missing something exceptionally obvious, but I'm just not seeing what I missed. Can you help me figure this out? Thanks!

How can I create my own layer?

I love this layer. However, due to security concerns, we cannot use your layer for our production environment; similarly, we cannot simply download your layer and reupload it to a new layer on our account.

Can you please tell me how you went about creating the binary files so I can follow that process? I tried downloading them from git directly, but those files are heavily bloated compared to yours. Also, is there a way to remove the ssh binaries entirely?

SSH git clone broken - missing libldap2.4

I've added your git layer's v6 and copied the sample lambda code, replacing the known_hosts, rsa key and git repo url with my own. I get the following error:

ssh: error while loading shared libraries: libldap-2.4.so.2: cannot open shared object file: No such file or directory

May or may not be relevant, but our git repo is hosted in a TFS VCS server.

clone with ssh protocol hit issues

I use PythonGit to clone private repo with ssh and private key, (ref to gitpython-developers/GitPython#725) and it told errors below:

ssh: /lib64/libc.so.6: version GLIBC_2.26' not found (required by ssh) ssh: /lib64/libc.so.6: version GLIBC_2.25' not found (required by ssh)
fatal: Could not read from remote repository.

hope this can be get fixed soon.
thanks.

Unable to include from CLI

While I was able to attach the layer using AWS console, the same thing cannot be done from the command-line:

rw$ aws lambda update-function-configuration --function-name gitsync --layers arn:aws:lambda:us-east-1:553035198032:layer:git:3

An error occurred (AccessDeniedException) when calling the UpdateFunctionConfiguration operation: User: arn:aws:iam::123132123:user/romaninsh is not authorized to perform: lambda:GetLayerVersion on resource: arn:aws:lambda:us-east-1:553035198032:layer:git:3

user "romaninsh" is full admin.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.