dmitryserbin / azdev-release-orchestrator Goto Github PK
View Code? Open in Web Editor NEWAzure DevOps extension to manage and orchestrate release pipelines
License: MIT License
Azure DevOps extension to manage and orchestrate release pipelines
License: MIT License
Hello,
I'm having an issue implementing the V3 task with parameters specifically within an integrated project (my repos/pipelines are in the same azdo project). Without parameters, my child target pipeline triggers successfully and everything works wonderfully. With parameters, the call to get the target pipelines parameters times out after 10 attempts with the same message:
2022-05-11T16:17:31.754Z release-orchestrator:Retry:retryAsync Error: Unable to retrieve <policy> (63) run parameters
at BuildWebApiRetry.getRunParameters (/home/vsts/work/_tasks/releaseorchestrator_5d38d46b-4c0a-4c14-8f0c-04df59e4dc27/3.0.1592/extensions/buildwebapiretry/buildwebapiretry.js:74:19)
at process._tickCallback (internal/process/next_tick.js:68:7)
2022-05-11T16:17:41.764Z release-orchestrator:ApiClient:post Making <[https://dev.azure.com/<redacted>//_apis/Contribution/HierarchyQuery/project/<redacted>](https://dev.azure.com/<redacted>//_apis/Contribution/HierarchyQuery/project/<redacted>) API <POST> call
2022-05-11T16:17:41.874Z release-orchestrator:BuildWebApiRetry: { dataProviderExceptions:
{ 'ms.vss-build-web.pipeline-run-parameters-data-provider':
{ exceptionType: 'ResourceValidationException',
message:
'The repository policy in project <redacted> could not be retrieved. Verify the name and credentials being used.',
stackTrace: null } },
dataProviderSharedData:
{ _featureFlags: { 'Build2.DisableRunTimeVariableEdit': false } },
dataProviders:
{ 'ms.vss-web.component-data': {},
'ms.vss-web.shared-data': null } }
After 10 tries:
##[error]Failed retrying <getRunParameters> for <10> times. Error: Unable to retrieve <policy> (63) run parameters
Here is the code block from pipeline:
- stage: policyPipe
displayName: Initiate Policy Pipeline
condition: |
and(
eq(variables['Build.Reason'], 'Manual'),
eq('${{ parameters.initateAllPipes }}', 'true')
)
jobs:
- job:
steps:
- task: releaseorchestrator@3
displayName: Kickoff pipeline
inputs:
projectName: $(System.TeamProject)
definitionName: policy
branchName: ${{ parameters.policyRefName }}
strategy: new
parameters: applyTerraform=${{ parameters.applyTerraform }}
Verified that our build service has all the requisite permissions per your v3 docs. Again, everything works like a charm without parameters specified.
could you add a new strategy that is just approval? This would be very useful because when you have microservices and releases are generated, not always to deploy all the microservices, but only those that are pending approval because they had any changes
On the other hand, the Release Definition, it would be good to be able to select more than one, for example with a field separated by commas, for the same reason, that I mentioned above
The error we are seeing when we attempt to upload the extension to Azure DevOps Server, is "Extension validation error
Task definition input 'strategy' and Task definition input 'proceedSkippedStages' must belong to same group as they are dependent inputs for Task with ID '5d38d46b-4c0a-4c14-8f0c-04df59e4dc27'."
Could you advise what this means and what is needed to resolve it?
I am receiving an error when trying to run the version 2 task.
"Cannot read property 'value' of null"
This is for all possible combinations of inputs to the task that I can think of.
This is for an On-Premise version of Azure DevOps.
Hi,
Is it possible to only release the stage if the stage is waiting for approval?
Thanks.
Hi,
looking into docs (here) to execute a specific pipeline version, in the YAML example you show to use:
buildNumber: <value>
You write also:
Parameter | Description |
---|---|
buildNumber | Target build number (i.e. build name) |
But the field buildNumber is not recognized as valid and after some research, the right field must be:
buildName: <value>
It's only a documentation error?
How to execute multiple Release pipelines using this Release Orchestrator? What is the option to set multiple Release pipelines in one go?
Can this work as a trigger for a pipeline on a different organization? Say, I import the repository of OrgB (source) to OrgA (copy). if OrgB updated the source repo, in OrgA, does the imported repo (copy) get updated automatically? If not, do you know of any other workaround for this topic ?
This task has been so great! We use it heavily.
We came across a minor issue where the Release Definition we pass in a variable like $(Release). This works when the value of this variable are the definition ID. However, if you pass in the release name, even though it actually exists in the dropdown, the task fails. Can this please be fixed?
I have a release that uses the orchestrator to call another release; both of which uses the same Agent.
Problem is that it seems to be blocking in a deadlock as the first release is waiting for the second to complete but in order for the second to start it needs to wait for the Agent to be freed up; or it seems to be this way as it gets stuck on that step for a long time.
Is this true? And is there any way to mitigate this besides allocating to different Agents (which we currently do not have)
When upgrading from v1 to v2 i noticed that when using Specific Release option it is not possible to supply the specific ReleaseID, it fails saying not found. We supply the specific release via a variable which corresponds to the unique release ID, so are unable to upgrade for the specific release scenario.
Also, when specifying release definition, we had switched to using IDs for v1 and now it appears only to accept the Name, this means if the name of the releae definition changes through an edit it could fail.
would be good in all circumstances to allow specific ids for specific releases and definitions.
Hello,
Frequently ReleaseOrchestrator stucked in "in progress" state on MAIN Release (the Release where this task is added to).
In Release report console I can see that triggered Release has been finished successfully :
2019-03-20T08:06:36.9903054Z Release automatically started as stages deployment conditions are met
2019-03-20T08:07:17.4058074Z Stage (15677) deployment completed with status
2019-03-20T08:07:17.4059090Z Phase completed with status
but "MAIN" Release which triggers this external Release stucked at:
and when Timeout occurs MAIN Release just fails.
Hi Dimitry, first of all, thank you for this extension: It is very useful.
Context: I have a YAML pipeline which use the orchestrator@2 task to approve a release in a classic release pipeline.
According to specification, definition name can be also the ID of the pipeline.
Tasks/OrchestratorV2/task.json
{
"name": "definitionName",
"type": "pickList",
"label": "Definition name",
"helpMarkDown": "Target release definition name or ID",
"required": true,
"properties": {
"EditableOptions": true
}
}
If the numeric ID of the pipeline is passed as an argument the task fails.
2023-06-08T16:25:10.093Z release-orchestrator:TaskHelper:getParameters { releaseType: 'Specific',
projectName: '<OMITTED>',
definitionName: '443',
releaseName: '0.84.230531.1-R1',
stages: [ 'Tier2' ],
variables: [],
filters:
{ releaseTags: [],
artifactTags: [],
artifactVersion: '',
artifactBranch: '',
stageStatuses: [] },
...
release-orchestrator:Retry:retryable Executing <getReleaseDefinitions> with <10> retries
release-orchestrator:ReleaseHelper:getDefinition []
release-orchestrator:TaskHelper:fail Task <Failed> result (ignore failure <false>)
##[debug]task result: Failed
##[error]Definition <443> not found
I searched in the code and the issue could be in
Tasks/OrchestratorV2/helpers/releasehelper.ts
public async getDefinition(projectName: string, definitionName: string): Promise<ReleaseDefinition> {
const debug = this.debugLogger.extend(this.getDefinition.name);
const matchingDefinitions: ReleaseDefinition[] = await this.releaseApi.getReleaseDefinitions(
projectName,
definitionName,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
true);
debug(matchingDefinitions.map(
(definition) => `${definition.name} (${definition.id})`));
if (matchingDefinitions.length <= 0) {
throw new Error(`Definition <${definitionName}> not found`);
}
const targetDefinition: ReleaseDefinition = await this.releaseApi.getReleaseDefinition(
projectName,
matchingDefinitions[0].id!);
debug(targetDefinition);
return targetDefinition;
}
In case you would like code contribution, I am interested in working together for a solution.
Best
Matteo
instead of listing definition stages by csv, it would be nice to do it by 'filter'-like expresions.
i.e. instead of
$(environment)-frontend,$(environment)-infra,$(environment)-backend,$(environment)-services
use
$(environment)-*
Starting from 10/31/2022 I got the following error in our release when calling Release Orchestrator with version 2.0.1846.
[error]Cannot read property 'trim' of undefined
The same release worked the day before where the build version was 2.0.1663.
Is it a bug or do we need to update some configuration in the release?
Thanks,
Zhou
2022-10-31T13:48:54.3870663Z ##[section]Starting: Release Orchestrator
2022-10-31T13:48:54.4047329Z ==============================================================================
2022-10-31T13:48:54.4047726Z Task : Release Orchestrator
2022-10-31T13:48:54.4048048Z Description : Manage and orchestrate Azure DevOps release pipelines
2022-10-31T13:48:54.4048320Z Version : 2.0.1846
2022-10-31T13:48:54.4048521Z Author : Dmitry Serbin
2022-10-31T13:48:54.4049005Z Help : For aditional information and support please refer to https://github.com/dmitryserbin/azdev-release-orchestrator project repository
2022-10-31T13:48:54.4049521Z ==============================================================================
2022-10-31T13:48:55.0261713Z ##[error]Cannot read property 'trim' of undefined
2022-10-31T13:48:55.0419919Z ##[section]Finishing: Release Orchestrator
It seems that the SystemVssConnection
is case sensitive on *nix systems - I was able to get it to work on a windows agent, but when running on an OSX agent it throws that error. All uses I have found in the Microsoft/azure-pipelines-tasks tests seems to have it in uppercase - so perhaps changing it to SYSTEMVSSCONNECTION
would help this to be a cross-platform tool.
Related issue: geeklearningio/gl-vsts-tasks-inception#9 (comment)
Here is my debug log from testing:
2019-03-19T22:43:21.6480150Z ##[debug]agent.TempDirectory=/Users/Shared/myagent/_work/_temp
2019-03-19T22:43:21.6480700Z ##[debug]loading inputs and endpoints
2019-03-19T22:43:21.6480820Z ##[debug]loading INPUT_ENDPOINTTYPE
2019-03-19T22:43:21.6481010Z ##[debug]loading INPUT_TARGETPROJECT
2019-03-19T22:43:21.6481070Z ##[debug]loading INPUT_TARGETDEFINITION
2019-03-19T22:43:21.6481180Z ##[debug]loading INPUT_RELEASESTRATEGY
2019-03-19T22:43:21.6481230Z ##[debug]loading INPUT_TARGETRELEASE
2019-03-19T22:43:21.6481420Z ##[debug]loading INPUT_TARGETRELEASESTAGES
2019-03-19T22:43:21.6481560Z ##[debug]loading INPUT_RELEASETAGFILTER
2019-03-19T22:43:21.6481610Z ##[debug]loading INPUT_ARTIFACTTAGFILTER
2019-03-19T22:43:21.6481720Z ##[debug]loading INPUT_SOURCEBRANCHFILTER
2019-03-19T22:43:21.6481770Z ##[debug]loading INPUT_SOURCEBRANCHNAME
2019-03-19T22:43:21.6481870Z ##[debug]loading INPUT_ARTIFACTSTRATEGY
2019-03-19T22:43:21.6481930Z ##[debug]loading INPUT_TARGETARTIFACT
2019-03-19T22:43:21.6481980Z ##[debug]loading INPUT_TARGETARTIFACTVERSION
2019-03-19T22:43:21.6482140Z ##[debug]loading INPUT_STAGESTRATEGY
2019-03-19T22:43:21.6482190Z ##[debug]loading INPUT_TARGETDEFINITIONSTAGES
2019-03-19T22:43:21.6482290Z ##[debug]loading INPUT_IGNOREFAILURE
2019-03-19T22:43:21.6482350Z ##[debug]loading ENDPOINT_AUTH_SYSTEMVSSCONNECTION
2019-03-19T22:43:21.6482400Z ##[debug]loading ENDPOINT_AUTH_SCHEME_SYSTEMVSSCONNECTION
2019-03-19T22:43:21.6482520Z ##[debug]loading ENDPOINT_AUTH_PARAMETER_SYSTEMVSSCONNECTION_ACCESSTOKEN
2019-03-19T22:43:21.6482570Z ##[debug]loaded 19
2019-03-19T22:43:21.6483180Z ##[debug]Agent.ProxyUrl=undefined
2019-03-19T22:43:21.6483240Z ##[debug]Agent.CAInfo=undefined
2019-03-19T22:43:21.6483350Z ##[debug]Agent.ClientCert=undefined
2019-03-19T22:43:21.6483410Z ##[debug]Agent.SkipCertValidation=undefined
2019-03-19T22:43:21.7836810Z ##[debug]EndpointType=integrated
2019-03-19T22:43:21.7859230Z ##[debug]IgnoreFailure=false
2019-03-19T22:43:21.7860890Z ##[debug]task result: Failed
2019-03-19T22:43:21.7911930Z ##[error]Endpoint not present: SystemVssConnection
2019-03-19T22:43:21.7922130Z ##[debug]Processed: ##vso[task.issue type=error;]Endpoint not present: SystemVssConnection
2019-03-19T22:43:21.7939750Z ##[debug]Processed: ##vso[task.complete result=Failed;]Endpoint not present: SystemVssConnection
I was not able to get any further to see if there are other places it might fail on a non-windows box.
Hi,
I don't see an option to set a variable scope when defining variables for a release pipeline. From previous experience with the API, it assumes variable scope is "Release", when some variables are sometimes scoped to specific stages.
Has anyone tested this?
Thanks
Currently, it is not possible to create a release without approving any stage. When no stage is specified, the task tries to approve all stages that require approval. Please provide an option for this use case.
Hi,
I've managed to get the extension to trigger a release against a specific branch but I want to be able to specify a specific build of that branch. I've tried using the Build Number of the build I want and the Source Version (i.e. Git commit hash) but I always get the message that no builds matching the filter can be found.
Is it possible to do this? I could just be using the wrong YAML parameters.
Hi,
I would like to propose a potential enhancement.
Can it be possible to have a strategy with a "no wait" task + a "wait only" task.
The idea is to have the possibility to start multiple release deployment first and then wait all completions at a later stage.
This to allow parallelization and reduce global deployment time when multiple agents are available.
Thank you
For a future enhancement, can you have it find the most recent successful release of a definition for the specified environment(s) and rerun them. Currently I can specify a release to redeploy, but it would help to find the most recent too.
This a great extension! Thanks!
Can we integrate yaml pipeline and classic pipeline through Release Orchestrator pipeline?
For example -
I have to run a sequence of pipelines where i have to run few classic editor pipelines and then few yaml pipleines and then again few classic pipelines. So can this be automate through release orchestrator task?
Hi,
I randomly get the error "Unable to get XXX release progress" on release orchestrator tasks during deployment.
The setup of my task is:
My release pipeline is just a succession of orchestrator tasks with the same setup (except the release definition name for sure).
Attached, the log:
Error.log
If I redeploy the release, it pass (or randomly failed on another release orchestrator deployment task).
When the error occurs, if I check the targeted release, it was successfully deployed.
Regards
Hello,
Its working fine when triggers from Release Definition but from Build Definition or YAML pipeline I have following output :
"##[error]Definition not found"
Can we use Release Orchetsrator task from Build Def or YAML pipeline ?
Hi,
I got ##[error]name is not defined error when trying to re-deploy a release from Build Definition.
Please help if you have a solution to fix this issue
Can this be upgraded?
CVE-2022-0144: shelljs is vulnerable to Improper Privilege Management
CVE-2022-24785: Moment.js is a JavaScript date library for parsing, validating, manipulating, and formatting dates. A path traversal vulnerability impacts npm (server) users of Moment.js between versions 1.0.1 and 2.29.1, especially if a user-provided locale string is directly used to switch moment locale. This problem is patched in 2.29.2, and the patch can be applied to all affected versions. As a workaround, sanitize the user-provided locale name before passing it to Moment.js.
CVE-2022-31129: moment is a JavaScript date library for parsing, validating, manipulating, and formatting dates. Affected versions of moment were found to use an inefficient parsing algorithm. Specifically using string-to-date parsing in moment (more specifically rfc2822 parsing, which is tried by default) has quadratic (N^2) complexity on specific inputs. Users may notice a noticeable slowdown is observed with inputs above 10k characters. Users who pass user-provided strings without sanity length checks to moment constructor are vulnerable to (Re)DoS attacks. The problem is patched in 2.29.4, the patch can be applied to all affected versions with minimal tweaking. Users are advised to upgrade. Users unable to upgrade should consider limiting date lengths accepted from user input.
CVE-2021-3807: ansi-regex is vulnerable to Inefficient Regular Expression Complexity
CVE-2021-23358: The package underscore from 1.13.0-0 and before 1.13.0-2, from 1.3.2 and before 1.12.1 are vulnerable to Arbitrary Code Injection via the template function, particularly when a variable property is passed as an argument as it is not sanitized.
I have a release that Partially Succeeded
, and when I invoke that release from my orchestration release pipeline, it never completes. I let it wait overnight to see if it was just some timing issue and it never resolved.
Details:
ref/heads/master
Step that caused the partial success (it is the last task):
Can we have an override for the description on the triggered/created release so that I can insert pipeline variables, like a link back to the source pipeline, or the
$(Release.DefinitionName)
so I know which pipeline triggered this pipeline, in addition to the
$(Release.ReleaseName).
A quick glance looks like this is assigned on line 205 @
https://github.com/dmitryserbin/azdev-release-orchestrator/blob/master/Tasks/OrchestratorV2/helpers/releasehelper.ts
But would need additional options added to the module.
I have two different Release pipeline. In one pipeline using Release Orchestration agent to call second release pipeline . When we execute first Release pipeline the second release pipeline is showing "Waiting for running jobs to finish".
Please let me know how to fix this issue.
Hi,
testing the plugin, I didn't find a way to fill the Comment (optional) field into Waiting for review form.
Looking into your code, seem you support the field through the code because you pass them to the azure library, but seems the plugin does not provide a way to insert it in the orchestration pipeline written with the plugin.
Do you agree with the analysis?
Can you add the support?
While using V1 orchestrator, it was possible to supply multiple release definition ids as a comma separated value.
For ex - 62,63,64 etc
Whereas in V2 orch, looks like csv of release def ids are no longer supported?
Would it be possible to mark the task as skipped if no release is found that matches the search criteria?
We have a micro-service architecture and not every service has a release to go all the time. So marking the task as partially complete looks like there were deployment issues when a release was never run. Marking the the task as Skipped with an appropriate message allows our release team to focus on any real failures.
Hello,
When Release triggered by Rel Orchestrator is finished as "Partially Succeed" then Rel Orchestrator task shows it as "Succeeded"
Expecatation here is to mark Release Orchestrator task as "Partially Succeeded" when triggered Release finish as "Partially Succeeded"
Hi,
I have an issue with the orchestrator tasks. Randomly, the execution failed with the error "Unable to get release status". It append approximatively for 50% of our executions. Especially for long running tasks (but not only).
I checked the source code and, based on debug logs, it seems that the method "releaseApi.getRelease" in function "getReleaseStatus" of "releasehelper.ts" don't fail but return an empty "Release" object. Like if the API response is a 200 OK but the response can't be parsed into a "Release" object. It seems to be a 200 OK because there is no debug logs coming from the "Retryable".
Orchestrator version : 2.0.846
Task version: 2.0
Mode: Deploy latest release with stage and branch filter
Thank you
tasklog_10.log
Rather than specifying a filter to define what artifacts to use when running a new release, it would be helpful to specify the artifacts to use directly in the release that is running the release orchestrator task.
Certainly in our case this would be helpful as we are not tagging our artifacts.
Please consider adding this feature
Hello, Is it possible to end the release once it hits "Stage <Stage 1> (129) cannot be approved by (Project Collection Build Service)"
It seems to be retrying forever.
I just want to trigger the release and let others manually approve.
Thank you
The fact that the Orchestrator step holds an agent hostage while waiting for the child task to complete creates some issues, especially when using them for parallel deployment of many services. We have a pool of 10 agents, if I have 7 services all deploying in parallel we encounter an issue where 7 Orchestrator steps are holding up 7 agents... leaving only 3 to do the actual work. If it were 10 services, the orchestrator pipeline would just sit and spin until timeouts, because there would never be any agents left to actually do the work. A simple solution for this is to have an option to use the orchestrator to just START the child pipeline, but not sit and monitor it's status/wait for it to finish... just set it and forget it.
I attempted to use a configure the task to use Filter Source Branch with Latest Release as follows:
Unfortunately it started triggering deployments for the oldest, not the newest release when i used develop branch on my component.
I found it used the latest release if i removed the Filter Source Branch, but i would really like to use this to deploy a specific release based on the branch of artifacts.
Can you provide a reason as to why the very latest release would not be used when specifying Filter Source Branch?
If I cancel the release pipeline which is using release orchestrator is there a way I could use release orchestrator to propagate the cancellation to any releases it triggered? I don't want to leave around lots of zombie child releases consuming resources or waiting for manual approvals which no longer matter because the orchestration job was cancelled/abandoned.
I presumably would need a separate invocation of the task with a custom condition to run always (ie even if previous tasks failed) which knows the release IDs of the triggered releases to send cancel events to?
Hello,
Thanks for your extension which looks really promising. However when I try to Create Release with following settings:
I have following error:
VS402962: No artifact version id is specified corresponding to artifact source 'Source-Alias'. Specify a valid value and try again.
Moreover when I choose "Artifacts Strategy" with "Specific Artifacts" I can see list of Artiffacts linked to Release Definition. Issue only occurs when I choose "Create Release" with "Default Artifacts"
Version on Premise: TFS 2018 Update.3
We are finding that we cannot use a variable for the Release Definition field and must slect from the drop down. As we have many releases we wanted to use your task within a re-usable task group rather than having to clone it many times and hard code the release definition selection.
We get the following error:
##[error]Unable to create new release. TypeError: Cannot read property 'map' of undefined
It would be good to understand if this is supposed to be supported or if it's a know issue?
Hi
I want to select the build number and then this build must be used by the remote pipelines.
In my test I select the build which downloads the correct artifacts, but the remote build uses the latest build instead.
How can I pass the build to all the remote pipelines I trigger?
Thanks
Jacques
Hello,
When using these settings, the error 'No <THE_NAME_OF_THE_RELEASE_DEFINITION> artifact matching filter (version: undefined, branch: master) criteria found' is thrown. Could you make it possible to implicitly use the latest version of the selected branch? Or make it possible to choose between the latest version or a manually defined version?
The problem is that for the moment, the option of filtering the source branch does not work at all.
Best regards
Could we have the ability to trigger a CI/CD YAML pipeline? Releases are now considered as classic by Microsoft with the introduction of deployment jobs in YAML pipelines so CI and CD are now all in the same pipelines section of Azure DevOps.
Please could we have the ability to trigger a Pipeline and not just the classic releases?
Reference:
https://docs.microsoft.com/en-us/azure/devops/pipelines/process/deployment-jobs?view=azure-devops
buildTags assigend to parameters.stages
if(buildTags.length) {
parameters.stages = buildTags;
}
#72 - Pull request #
Hi! Truly a gem of a task for people who need to orchestrate a lot of pipelines!
Any suggestion how to handle stage names with commas and spaces in the name ๐ ? Is this supported? E.g.: ''Build, Test, Dockerize & Pack"
I add a "reproducible" example below.
Yaml task definition:
steps:
- ${{ each value in parameters.Pipelines }}:
- task: releaseorchestrator@3
displayName: Orchestrate services deployment
inputs:
projectName: "Cloud Team"
definitionName: ${{ value }}
strategy: ${{ parameters.Strategy }}
stages: ''Build, Test, Dockerize & Pack"
branchName: ${{ parameters.Branch }}
Debug log from a run of the orchestrator:
2022-06-29T11:28:20.079Z release-orchestrator:BuildSelector:getStages [ 'Build, Test, Dockerize & Pack',
'Release to ***',
'Release to ***',
'Release to ***',
'Release to ***',
'Release ***' ]
##[debug]ignoreFailure=false
##[debug]task result: Failed
##[error]Definition <***> (***) does not contain <Build> stage
##[debug]Processed: ##vso[task.issue type=error;]Definition <***> (***) does not contain <Build> stage
2022-06-29T11:28:20.081Z release-orchestrator:TaskHelper:fail Task <Failed> result (ignore failure <false>)
##[debug]Processed: ##vso[task.complete result=Failed;]Definition <***> (307) does not contain <***> stage
Finishing: Orchestrate service deployment
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.