Add initial version of the irc-push Azure Function
This relies on spawning a thread for dispatching things to IRC, since GitHub webhooks will timeout in 10s https://github.community/t5/GitHub-API-Development-and/Extended-Service-Timeout-for-webhooks/td-p/19639 Really though, it's not like webhook logs are terribly useful in GitHub's VUI
This commit is contained in:
commit
4281b536db
|
@ -0,0 +1,5 @@
|
||||||
|
target/
|
||||||
|
Cargo.lock
|
||||||
|
.vscode/
|
||||||
|
.git/
|
||||||
|
.cargo/
|
|
@ -0,0 +1,6 @@
|
||||||
|
/target
|
||||||
|
**/*.rs.bk
|
||||||
|
*.swp
|
||||||
|
package-lock.json
|
||||||
|
node_modules/
|
||||||
|
.cargo/
|
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "attach",
|
||||||
|
"name": "Debug",
|
||||||
|
"windows": {
|
||||||
|
"program": "irc-push.exe"
|
||||||
|
},
|
||||||
|
"program": "irc-push",
|
||||||
|
"preLaunchTask": "Launch Azure Functions Application",
|
||||||
|
"postDebugTask": "Terminate Azure Functions Application"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "Launch Azure Functions Application",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "cargo",
|
||||||
|
"args": [
|
||||||
|
"func",
|
||||||
|
"run"
|
||||||
|
],
|
||||||
|
"presentation": {
|
||||||
|
"reveal": "always",
|
||||||
|
"clear": true,
|
||||||
|
"focus": true
|
||||||
|
},
|
||||||
|
"problemMatcher": [
|
||||||
|
{
|
||||||
|
"owner": "azureFunctions",
|
||||||
|
"pattern": [
|
||||||
|
{
|
||||||
|
"regexp": "\\b\\B",
|
||||||
|
"file": 1,
|
||||||
|
"location": 2,
|
||||||
|
"message": 3
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"background": {
|
||||||
|
"activeOnStart": true,
|
||||||
|
"beginsPattern": "^Azure Functions Core Tools",
|
||||||
|
"endsPattern": "^Application started."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isBackground": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Terminate Azure Functions Application",
|
||||||
|
"type": "process",
|
||||||
|
"command":"${command:workbench.action.tasks.terminate}",
|
||||||
|
"args": [
|
||||||
|
"Launch Azure Functions Application"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
[package]
|
||||||
|
name = "irc-push"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["tyler"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
azure-functions = "0.11.0"
|
||||||
|
irc = "~0.13.6"
|
||||||
|
log = "~0.4.8"
|
||||||
|
pretty_env_logger = "~0.3.1"
|
||||||
|
|
||||||
|
# Needed for deserializing objects
|
||||||
|
serde = "~1.0.103"
|
||||||
|
serde_json = "~1.0.0"
|
|
@ -0,0 +1,32 @@
|
||||||
|
# syntax=docker/dockerfile-upstream:experimental
|
||||||
|
|
||||||
|
FROM peterhuene/azure-functions-rs-build:0.11.0 AS build-image
|
||||||
|
|
||||||
|
WORKDIR /src
|
||||||
|
COPY . /src
|
||||||
|
|
||||||
|
RUN apt-get install -qy libssl-dev pkg-config
|
||||||
|
|
||||||
|
# Run with mounted cache
|
||||||
|
RUN --mount=type=cache,target=/src/target \
|
||||||
|
--mount=type=cache,target=/usr/local/cargo/git \
|
||||||
|
--mount=type=cache,target=/usr/local/cargo/registry \
|
||||||
|
["cargo", "run", "--release", "--", "init", "--script-root", "/home/site/wwwroot", "--sync-extensions"]
|
||||||
|
|
||||||
|
FROM mcr.microsoft.com/azure-functions/base:2.0 as runtime-image
|
||||||
|
|
||||||
|
FROM mcr.microsoft.com/dotnet/core/runtime-deps:2.2
|
||||||
|
|
||||||
|
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
|
||||||
|
HOME=/home \
|
||||||
|
FUNCTIONS_WORKER_RUNTIME=Rust \
|
||||||
|
languageWorkers__workersDirectory=/home/site/wwwroot/workers
|
||||||
|
|
||||||
|
# Copy the Azure Functions host from the runtime image
|
||||||
|
COPY --from=runtime-image [ "/azure-functions-host", "/azure-functions-host" ]
|
||||||
|
|
||||||
|
# Copy the script root contents from the build image
|
||||||
|
COPY --from=build-image ["/home/site/wwwroot", "/home/site/wwwroot"]
|
||||||
|
|
||||||
|
WORKDIR /home/site/wwwroot
|
||||||
|
CMD [ "/azure-functions-host/Microsoft.Azure.WebJobs.Script.WebHost" ]
|
|
@ -0,0 +1,17 @@
|
||||||
|
= IRC push function
|
||||||
|
|
||||||
|
== Development
|
||||||
|
|
||||||
|
=== Local invocations
|
||||||
|
|
||||||
|
[source,bash]
|
||||||
|
----
|
||||||
|
curl -XPOST --data @events.push.json http://localhost:8100/api/webhook
|
||||||
|
----
|
||||||
|
|
||||||
|
=== Deployment
|
||||||
|
|
||||||
|
[source,bash]
|
||||||
|
----
|
||||||
|
docker build -t functionsbrokencode.azurecr.io/irc-push . && docker push functionsbrokencode.azurecr.io/irc-push
|
||||||
|
----
|
|
@ -0,0 +1,136 @@
|
||||||
|
{
|
||||||
|
"ref": "refs/tags/simple-tag",
|
||||||
|
"before": "6113728f27ae82c7b1a177c8d03f9e96e0adf246",
|
||||||
|
"after": "0000000000000000000000000000000000000000",
|
||||||
|
"created": false,
|
||||||
|
"deleted": true,
|
||||||
|
"forced": false,
|
||||||
|
"base_ref": null,
|
||||||
|
"compare": "https://github.com/Codertocat/Hello-World/compare/6113728f27ae...000000000000",
|
||||||
|
"commits": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"head_commit": null,
|
||||||
|
"repository": {
|
||||||
|
"id": 186853002,
|
||||||
|
"node_id": "MDEwOlJlcG9zaXRvcnkxODY4NTMwMDI=",
|
||||||
|
"name": "Hello-World",
|
||||||
|
"full_name": "Codertocat/Hello-World",
|
||||||
|
"private": false,
|
||||||
|
"owner": {
|
||||||
|
"name": "Codertocat",
|
||||||
|
"email": "21031067+Codertocat@users.noreply.github.com",
|
||||||
|
"login": "Codertocat",
|
||||||
|
"id": 21031067,
|
||||||
|
"node_id": "MDQ6VXNlcjIxMDMxMDY3",
|
||||||
|
"avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4",
|
||||||
|
"gravatar_id": "",
|
||||||
|
"url": "https://api.github.com/users/Codertocat",
|
||||||
|
"html_url": "https://github.com/Codertocat",
|
||||||
|
"followers_url": "https://api.github.com/users/Codertocat/followers",
|
||||||
|
"following_url": "https://api.github.com/users/Codertocat/following{/other_user}",
|
||||||
|
"gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}",
|
||||||
|
"starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}",
|
||||||
|
"subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions",
|
||||||
|
"organizations_url": "https://api.github.com/users/Codertocat/orgs",
|
||||||
|
"repos_url": "https://api.github.com/users/Codertocat/repos",
|
||||||
|
"events_url": "https://api.github.com/users/Codertocat/events{/privacy}",
|
||||||
|
"received_events_url": "https://api.github.com/users/Codertocat/received_events",
|
||||||
|
"type": "User",
|
||||||
|
"site_admin": false
|
||||||
|
},
|
||||||
|
"html_url": "https://github.com/Codertocat/Hello-World",
|
||||||
|
"description": null,
|
||||||
|
"fork": false,
|
||||||
|
"url": "https://github.com/Codertocat/Hello-World",
|
||||||
|
"forks_url": "https://api.github.com/repos/Codertocat/Hello-World/forks",
|
||||||
|
"keys_url": "https://api.github.com/repos/Codertocat/Hello-World/keys{/key_id}",
|
||||||
|
"collaborators_url": "https://api.github.com/repos/Codertocat/Hello-World/collaborators{/collaborator}",
|
||||||
|
"teams_url": "https://api.github.com/repos/Codertocat/Hello-World/teams",
|
||||||
|
"hooks_url": "https://api.github.com/repos/Codertocat/Hello-World/hooks",
|
||||||
|
"issue_events_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/events{/number}",
|
||||||
|
"events_url": "https://api.github.com/repos/Codertocat/Hello-World/events",
|
||||||
|
"assignees_url": "https://api.github.com/repos/Codertocat/Hello-World/assignees{/user}",
|
||||||
|
"branches_url": "https://api.github.com/repos/Codertocat/Hello-World/branches{/branch}",
|
||||||
|
"tags_url": "https://api.github.com/repos/Codertocat/Hello-World/tags",
|
||||||
|
"blobs_url": "https://api.github.com/repos/Codertocat/Hello-World/git/blobs{/sha}",
|
||||||
|
"git_tags_url": "https://api.github.com/repos/Codertocat/Hello-World/git/tags{/sha}",
|
||||||
|
"git_refs_url": "https://api.github.com/repos/Codertocat/Hello-World/git/refs{/sha}",
|
||||||
|
"trees_url": "https://api.github.com/repos/Codertocat/Hello-World/git/trees{/sha}",
|
||||||
|
"statuses_url": "https://api.github.com/repos/Codertocat/Hello-World/statuses/{sha}",
|
||||||
|
"languages_url": "https://api.github.com/repos/Codertocat/Hello-World/languages",
|
||||||
|
"stargazers_url": "https://api.github.com/repos/Codertocat/Hello-World/stargazers",
|
||||||
|
"contributors_url": "https://api.github.com/repos/Codertocat/Hello-World/contributors",
|
||||||
|
"subscribers_url": "https://api.github.com/repos/Codertocat/Hello-World/subscribers",
|
||||||
|
"subscription_url": "https://api.github.com/repos/Codertocat/Hello-World/subscription",
|
||||||
|
"commits_url": "https://api.github.com/repos/Codertocat/Hello-World/commits{/sha}",
|
||||||
|
"git_commits_url": "https://api.github.com/repos/Codertocat/Hello-World/git/commits{/sha}",
|
||||||
|
"comments_url": "https://api.github.com/repos/Codertocat/Hello-World/comments{/number}",
|
||||||
|
"issue_comment_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/comments{/number}",
|
||||||
|
"contents_url": "https://api.github.com/repos/Codertocat/Hello-World/contents/{+path}",
|
||||||
|
"compare_url": "https://api.github.com/repos/Codertocat/Hello-World/compare/{base}...{head}",
|
||||||
|
"merges_url": "https://api.github.com/repos/Codertocat/Hello-World/merges",
|
||||||
|
"archive_url": "https://api.github.com/repos/Codertocat/Hello-World/{archive_format}{/ref}",
|
||||||
|
"downloads_url": "https://api.github.com/repos/Codertocat/Hello-World/downloads",
|
||||||
|
"issues_url": "https://api.github.com/repos/Codertocat/Hello-World/issues{/number}",
|
||||||
|
"pulls_url": "https://api.github.com/repos/Codertocat/Hello-World/pulls{/number}",
|
||||||
|
"milestones_url": "https://api.github.com/repos/Codertocat/Hello-World/milestones{/number}",
|
||||||
|
"notifications_url": "https://api.github.com/repos/Codertocat/Hello-World/notifications{?since,all,participating}",
|
||||||
|
"labels_url": "https://api.github.com/repos/Codertocat/Hello-World/labels{/name}",
|
||||||
|
"releases_url": "https://api.github.com/repos/Codertocat/Hello-World/releases{/id}",
|
||||||
|
"deployments_url": "https://api.github.com/repos/Codertocat/Hello-World/deployments",
|
||||||
|
"created_at": 1557933565,
|
||||||
|
"updated_at": "2019-05-15T15:20:41Z",
|
||||||
|
"pushed_at": 1557933657,
|
||||||
|
"git_url": "git://github.com/Codertocat/Hello-World.git",
|
||||||
|
"ssh_url": "git@github.com:Codertocat/Hello-World.git",
|
||||||
|
"clone_url": "https://github.com/Codertocat/Hello-World.git",
|
||||||
|
"svn_url": "https://github.com/Codertocat/Hello-World",
|
||||||
|
"homepage": null,
|
||||||
|
"size": 0,
|
||||||
|
"stargazers_count": 0,
|
||||||
|
"watchers_count": 0,
|
||||||
|
"language": "Ruby",
|
||||||
|
"has_issues": true,
|
||||||
|
"has_projects": true,
|
||||||
|
"has_downloads": true,
|
||||||
|
"has_wiki": true,
|
||||||
|
"has_pages": true,
|
||||||
|
"forks_count": 1,
|
||||||
|
"mirror_url": null,
|
||||||
|
"archived": false,
|
||||||
|
"disabled": false,
|
||||||
|
"open_issues_count": 2,
|
||||||
|
"license": null,
|
||||||
|
"forks": 1,
|
||||||
|
"open_issues": 2,
|
||||||
|
"watchers": 0,
|
||||||
|
"default_branch": "master",
|
||||||
|
"stargazers": 0,
|
||||||
|
"master_branch": "master"
|
||||||
|
},
|
||||||
|
"pusher": {
|
||||||
|
"name": "Codertocat",
|
||||||
|
"email": "21031067+Codertocat@users.noreply.github.com"
|
||||||
|
},
|
||||||
|
"sender": {
|
||||||
|
"login": "Codertocat",
|
||||||
|
"id": 21031067,
|
||||||
|
"node_id": "MDQ6VXNlcjIxMDMxMDY3",
|
||||||
|
"avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4",
|
||||||
|
"gravatar_id": "",
|
||||||
|
"url": "https://api.github.com/users/Codertocat",
|
||||||
|
"html_url": "https://github.com/Codertocat",
|
||||||
|
"followers_url": "https://api.github.com/users/Codertocat/followers",
|
||||||
|
"following_url": "https://api.github.com/users/Codertocat/following{/other_user}",
|
||||||
|
"gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}",
|
||||||
|
"starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}",
|
||||||
|
"subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions",
|
||||||
|
"organizations_url": "https://api.github.com/users/Codertocat/orgs",
|
||||||
|
"repos_url": "https://api.github.com/users/Codertocat/repos",
|
||||||
|
"events_url": "https://api.github.com/users/Codertocat/events{/privacy}",
|
||||||
|
"received_events_url": "https://api.github.com/users/Codertocat/received_events",
|
||||||
|
"type": "User",
|
||||||
|
"site_admin": false
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"version": "2.0",
|
||||||
|
"logging": {
|
||||||
|
"logLevel": {
|
||||||
|
"default": "Information"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"IsEncrypted": false,
|
||||||
|
"Values": {
|
||||||
|
"FUNCTIONS_WORKER_RUNTIME": "Rust",
|
||||||
|
"languageWorkers:workersDirectory": "workers"
|
||||||
|
},
|
||||||
|
"ConnectionStrings": {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
// WARNING: This file is regenerated by the `cargo func new` command.
|
||||||
|
|
||||||
|
mod webhook;
|
||||||
|
|
||||||
|
// Export the Azure Functions here.
|
||||||
|
azure_functions::export! {
|
||||||
|
webhook::webhook,
|
||||||
|
}
|
|
@ -0,0 +1,252 @@
|
||||||
|
extern crate irc;
|
||||||
|
extern crate serde;
|
||||||
|
extern crate serde_json;
|
||||||
|
|
||||||
|
use azure_functions::{
|
||||||
|
bindings::{HttpRequest, HttpResponse},
|
||||||
|
func,
|
||||||
|
};
|
||||||
|
use irc::client::prelude::*;
|
||||||
|
use log::*;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use serde_json::Value;
|
||||||
|
|
||||||
|
use std::default::Default;
|
||||||
|
use std::thread;
|
||||||
|
|
||||||
|
fn dispatch_to_irc(event: PushEvent) {
|
||||||
|
thread::spawn(move || {
|
||||||
|
/*
|
||||||
|
* Currently uncertain on how to import a file
|
||||||
|
*/
|
||||||
|
//let config = Config::load("Irc.toml").expect("failed to load Irc.toml");
|
||||||
|
let config = Config {
|
||||||
|
nickname: Some("otto-gh-bot".to_owned()),
|
||||||
|
server: Some("chat.freenode.net".to_owned()),
|
||||||
|
channels: Some(vec!["#otto".to_owned()]),
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Grabbing a clone of our configured channels before the config
|
||||||
|
* moves into IrcClient
|
||||||
|
*/
|
||||||
|
let channels = &config.channels.clone();
|
||||||
|
|
||||||
|
let client = IrcClient::from_config(config)
|
||||||
|
.expect("Failed to construct the IrcClient");
|
||||||
|
client.identify().unwrap();
|
||||||
|
|
||||||
|
client.for_each_incoming(|irc_msg| {
|
||||||
|
let m = irc_msg.to_string();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This effectively means the channel has been synchronized and we can
|
||||||
|
* send the message we need to send
|
||||||
|
*/
|
||||||
|
if m.contains("End of /NAMES list") {
|
||||||
|
if let Some(channel) = channels {
|
||||||
|
for chan in channel.iter() {
|
||||||
|
info!("Sending message to {}", chan);
|
||||||
|
client.send_privmsg(chan,
|
||||||
|
format!("{} pushed {} commits to {} in {} <{}>",
|
||||||
|
&event.sender.login,
|
||||||
|
&event.commits.len(),
|
||||||
|
&event.refname,
|
||||||
|
&event.repository.full_name,
|
||||||
|
&event.compare))
|
||||||
|
.expect(format!("Failed to send message to channel: {}", chan).as_str());
|
||||||
|
client.send_quit("rusty , over and out")
|
||||||
|
.expect("Failed to send QUIT");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).unwrap();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#[func]
|
||||||
|
pub fn webhook(req: HttpRequest) -> HttpResponse {
|
||||||
|
if let Ok(event) = req.body().as_json::<PushEvent>() {
|
||||||
|
info!("Parsed push event from {}", event.sender.login);
|
||||||
|
dispatch_to_irc(event);
|
||||||
|
return "Messages dispatched to IRC".into();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return "Failed to parse event".into();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
struct Sender {
|
||||||
|
login: String,
|
||||||
|
}
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
struct Repo {
|
||||||
|
name: String,
|
||||||
|
full_name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
struct PushEvent {
|
||||||
|
#[serde(rename = "ref")]
|
||||||
|
refname: String,
|
||||||
|
sender: Sender,
|
||||||
|
compare: String,
|
||||||
|
commits: Vec<Value>,
|
||||||
|
repository: Repo,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_push_event() {
|
||||||
|
/*
|
||||||
|
* Example event taken from:
|
||||||
|
* <https://developer.github.com/v3/activity/events/types/#pushevent>
|
||||||
|
*/
|
||||||
|
let push = r#"{
|
||||||
|
"ref": "refs/tags/simple-tag",
|
||||||
|
"before": "6113728f27ae82c7b1a177c8d03f9e96e0adf246",
|
||||||
|
"after": "0000000000000000000000000000000000000000",
|
||||||
|
"created": false,
|
||||||
|
"deleted": true,
|
||||||
|
"forced": false,
|
||||||
|
"base_ref": null,
|
||||||
|
"compare": "https://github.com/Codertocat/Hello-World/compare/6113728f27ae...000000000000",
|
||||||
|
"commits": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"head_commit": null,
|
||||||
|
"repository": {
|
||||||
|
"id": 186853002,
|
||||||
|
"node_id": "MDEwOlJlcG9zaXRvcnkxODY4NTMwMDI=",
|
||||||
|
"name": "Hello-World",
|
||||||
|
"full_name": "Codertocat/Hello-World",
|
||||||
|
"private": false,
|
||||||
|
"owner": {
|
||||||
|
"name": "Codertocat",
|
||||||
|
"email": "21031067+Codertocat@users.noreply.github.com",
|
||||||
|
"login": "Codertocat",
|
||||||
|
"id": 21031067,
|
||||||
|
"node_id": "MDQ6VXNlcjIxMDMxMDY3",
|
||||||
|
"avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4",
|
||||||
|
"gravatar_id": "",
|
||||||
|
"url": "https://api.github.com/users/Codertocat",
|
||||||
|
"html_url": "https://github.com/Codertocat",
|
||||||
|
"followers_url": "https://api.github.com/users/Codertocat/followers",
|
||||||
|
"following_url": "https://api.github.com/users/Codertocat/following{/other_user}",
|
||||||
|
"gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}",
|
||||||
|
"starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}",
|
||||||
|
"subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions",
|
||||||
|
"organizations_url": "https://api.github.com/users/Codertocat/orgs",
|
||||||
|
"repos_url": "https://api.github.com/users/Codertocat/repos",
|
||||||
|
"events_url": "https://api.github.com/users/Codertocat/events{/privacy}",
|
||||||
|
"received_events_url": "https://api.github.com/users/Codertocat/received_events",
|
||||||
|
"type": "User",
|
||||||
|
"site_admin": false
|
||||||
|
},
|
||||||
|
"html_url": "https://github.com/Codertocat/Hello-World",
|
||||||
|
"description": null,
|
||||||
|
"fork": false,
|
||||||
|
"url": "https://github.com/Codertocat/Hello-World",
|
||||||
|
"forks_url": "https://api.github.com/repos/Codertocat/Hello-World/forks",
|
||||||
|
"keys_url": "https://api.github.com/repos/Codertocat/Hello-World/keys{/key_id}",
|
||||||
|
"collaborators_url": "https://api.github.com/repos/Codertocat/Hello-World/collaborators{/collaborator}",
|
||||||
|
"teams_url": "https://api.github.com/repos/Codertocat/Hello-World/teams",
|
||||||
|
"hooks_url": "https://api.github.com/repos/Codertocat/Hello-World/hooks",
|
||||||
|
"issue_events_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/events{/number}",
|
||||||
|
"events_url": "https://api.github.com/repos/Codertocat/Hello-World/events",
|
||||||
|
"assignees_url": "https://api.github.com/repos/Codertocat/Hello-World/assignees{/user}",
|
||||||
|
"branches_url": "https://api.github.com/repos/Codertocat/Hello-World/branches{/branch}",
|
||||||
|
"tags_url": "https://api.github.com/repos/Codertocat/Hello-World/tags",
|
||||||
|
"blobs_url": "https://api.github.com/repos/Codertocat/Hello-World/git/blobs{/sha}",
|
||||||
|
"git_tags_url": "https://api.github.com/repos/Codertocat/Hello-World/git/tags{/sha}",
|
||||||
|
"git_refs_url": "https://api.github.com/repos/Codertocat/Hello-World/git/refs{/sha}",
|
||||||
|
"trees_url": "https://api.github.com/repos/Codertocat/Hello-World/git/trees{/sha}",
|
||||||
|
"statuses_url": "https://api.github.com/repos/Codertocat/Hello-World/statuses/{sha}",
|
||||||
|
"languages_url": "https://api.github.com/repos/Codertocat/Hello-World/languages",
|
||||||
|
"stargazers_url": "https://api.github.com/repos/Codertocat/Hello-World/stargazers",
|
||||||
|
"contributors_url": "https://api.github.com/repos/Codertocat/Hello-World/contributors",
|
||||||
|
"subscribers_url": "https://api.github.com/repos/Codertocat/Hello-World/subscribers",
|
||||||
|
"subscription_url": "https://api.github.com/repos/Codertocat/Hello-World/subscription",
|
||||||
|
"commits_url": "https://api.github.com/repos/Codertocat/Hello-World/commits{/sha}",
|
||||||
|
"git_commits_url": "https://api.github.com/repos/Codertocat/Hello-World/git/commits{/sha}",
|
||||||
|
"comments_url": "https://api.github.com/repos/Codertocat/Hello-World/comments{/number}",
|
||||||
|
"issue_comment_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/comments{/number}",
|
||||||
|
"contents_url": "https://api.github.com/repos/Codertocat/Hello-World/contents/{+path}",
|
||||||
|
"compare_url": "https://api.github.com/repos/Codertocat/Hello-World/compare/{base}...{head}",
|
||||||
|
"merges_url": "https://api.github.com/repos/Codertocat/Hello-World/merges",
|
||||||
|
"archive_url": "https://api.github.com/repos/Codertocat/Hello-World/{archive_format}{/ref}",
|
||||||
|
"downloads_url": "https://api.github.com/repos/Codertocat/Hello-World/downloads",
|
||||||
|
"issues_url": "https://api.github.com/repos/Codertocat/Hello-World/issues{/number}",
|
||||||
|
"pulls_url": "https://api.github.com/repos/Codertocat/Hello-World/pulls{/number}",
|
||||||
|
"milestones_url": "https://api.github.com/repos/Codertocat/Hello-World/milestones{/number}",
|
||||||
|
"notifications_url": "https://api.github.com/repos/Codertocat/Hello-World/notifications{?since,all,participating}",
|
||||||
|
"labels_url": "https://api.github.com/repos/Codertocat/Hello-World/labels{/name}",
|
||||||
|
"releases_url": "https://api.github.com/repos/Codertocat/Hello-World/releases{/id}",
|
||||||
|
"deployments_url": "https://api.github.com/repos/Codertocat/Hello-World/deployments",
|
||||||
|
"created_at": 1557933565,
|
||||||
|
"updated_at": "2019-05-15T15:20:41Z",
|
||||||
|
"pushed_at": 1557933657,
|
||||||
|
"git_url": "git://github.com/Codertocat/Hello-World.git",
|
||||||
|
"ssh_url": "git@github.com:Codertocat/Hello-World.git",
|
||||||
|
"clone_url": "https://github.com/Codertocat/Hello-World.git",
|
||||||
|
"svn_url": "https://github.com/Codertocat/Hello-World",
|
||||||
|
"homepage": null,
|
||||||
|
"size": 0,
|
||||||
|
"stargazers_count": 0,
|
||||||
|
"watchers_count": 0,
|
||||||
|
"language": "Ruby",
|
||||||
|
"has_issues": true,
|
||||||
|
"has_projects": true,
|
||||||
|
"has_downloads": true,
|
||||||
|
"has_wiki": true,
|
||||||
|
"has_pages": true,
|
||||||
|
"forks_count": 1,
|
||||||
|
"mirror_url": null,
|
||||||
|
"archived": false,
|
||||||
|
"disabled": false,
|
||||||
|
"open_issues_count": 2,
|
||||||
|
"license": null,
|
||||||
|
"forks": 1,
|
||||||
|
"open_issues": 2,
|
||||||
|
"watchers": 0,
|
||||||
|
"default_branch": "master",
|
||||||
|
"stargazers": 0,
|
||||||
|
"master_branch": "master"
|
||||||
|
},
|
||||||
|
"pusher": {
|
||||||
|
"name": "Codertocat",
|
||||||
|
"email": "21031067+Codertocat@users.noreply.github.com"
|
||||||
|
},
|
||||||
|
"sender": {
|
||||||
|
"login": "Codertocat",
|
||||||
|
"id": 21031067,
|
||||||
|
"node_id": "MDQ6VXNlcjIxMDMxMDY3",
|
||||||
|
"avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4",
|
||||||
|
"gravatar_id": "",
|
||||||
|
"url": "https://api.github.com/users/Codertocat",
|
||||||
|
"html_url": "https://github.com/Codertocat",
|
||||||
|
"followers_url": "https://api.github.com/users/Codertocat/followers",
|
||||||
|
"following_url": "https://api.github.com/users/Codertocat/following{/other_user}",
|
||||||
|
"gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}",
|
||||||
|
"starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}",
|
||||||
|
"subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions",
|
||||||
|
"organizations_url": "https://api.github.com/users/Codertocat/orgs",
|
||||||
|
"repos_url": "https://api.github.com/users/Codertocat/repos",
|
||||||
|
"events_url": "https://api.github.com/users/Codertocat/events{/privacy}",
|
||||||
|
"received_events_url": "https://api.github.com/users/Codertocat/received_events",
|
||||||
|
"type": "User",
|
||||||
|
"site_admin": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#;
|
||||||
|
|
||||||
|
let event = serde_json::from_str::<PushEvent>(push).expect("Failed to deserialized event");
|
||||||
|
assert_eq!("Codertocat", event.sender.login);
|
||||||
|
assert_eq!("refs/tags/simple-tag", event.refname);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
mod functions;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
azure_functions::worker_main(std::env::args(), functions::EXPORTS);
|
||||||
|
}
|
Loading…
Reference in New Issue