Code Monkey home page Code Monkey logo

ks-devops's Introduction

Gitpod ready-to-code good first codecov Contributors

KubeSphere DevOps integrates popular CI/CD tools, provides CI/CD Pipelines based on Jenkins, offers automation toolkits including Binary-to-Image (B2I) and Source-to-Image (S2I), and boosts continuous delivery across Kubernetes clusters.

With the container orchestration capability of Kubernetes, KubeSphere DevOps scales Jenkins Agents dynamically, improves CI/CD workflow efficiency, and helps organizations accelerate the time to market for their products.

Features

  • Out-of-the-Box CI/CD Pipelines
  • Built-in Automation Toolkits for DevOps with Kubernetes
  • Use Jenkins Pipelines to Implement DevOps on Top of Kubernetes
  • Manage Pipelines via CLI

Get Started

Quick Start

  • Install KubeSphere via KubeKey (or the methods described here).

    kk create cluster --with-kubesphere
  • Enable DevOps application

    kubectl patch -nkubesphere-system cc ks-installer --type=json -p='[{"op": "replace", "path": "/spec/devops/enabled", "value": true}]'

For more information, refer to the documentation.

Next Steps

  • A Separate Front-End Project of KS-DevOps
  • Auth Support
    • OIDC support as a default provider

Communication Channels

Contribution

Looking forward to becoming a part of us?

Feel free to go through the Contribution Guide, pick up a good-first-issue, and create a pull request.

Thanks to all the people who have already contributed to KS-DevOps!

ks-devops's People

Contributors

abdelouahabmbarki avatar chengleqi avatar chilianyi avatar ciiiii avatar cndoit18 avatar dream002 avatar drzhangg avatar feeeenng avatar fossabot avatar ganbingkun avatar johnniang avatar ks-ci-bot avatar linuxsuren avatar littlejiancc avatar lvwkpt avatar lxm avatar mangogoforward avatar mzmuer avatar nuclearwu avatar pixiake avatar qiujiafei avatar seanly avatar shihaoh avatar usernameisnull avatar wujiahao15 avatar yjuns avatar yudong2015 avatar yuezhuangshi avatar zheng1 avatar zhengzehong331 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  avatar  avatar  avatar

ks-devops's Issues

【devops】pipeline running error after modify the jenkinsfile parameters

Describe the bug
When the pipeline is running,Three situations occur randomly

Situation 1:The input window gets the parameter value of the previous jenkinsfile. The pipeline in jenkins and k8s has been updated to the parameter value of the current jenkinsfile at this time, and an error 500 will be reported when you click Run

15

Situation 2:
The input window does not display the jenkinsfile parameter value, and it runs normally (but the window does not display the jenkinsfile parameter to the user, which loses the meaning of setting the jenkinsfile parameter)
11

Situation 3:The input window shows that the current jenkinsfile parameter value is running normally,everything is ok

Environment
kubesphere v3.1.0
kubernetes v1.20.4

To Reproduce

  1. create a pipeline. add jenkinsfile
    5

  2. first run, There is no jenkinsfile parameter "Greeting" in the entry window
    6

But Jenkins has already got the "Greeting" parameter
7

Check the running log, Greeting has been used
8

  1. Modify the "Greeting" parameter in jenkinsfile to "Greeting1"
    9
    10

  2. Second run,There is still no jenkinsfile parameter in the input window
    11

Check the running log, actually we have used Greeting1 in the jenkinsfile parameter
12

  1. Modify the jenkinsfile parameter Greeting1 parameter to Greeting2
    13

  2. Third run,The input window loaded the previous parameter Greeting1, but the put request has been successfully sent and the backend changed to Greeting2, 500 error was reported.
    14
    15

Expected behavior
pipeline running normally

Kubesphere Chinese Community
https://kubesphere.com.cn/forum/d/4586-devopspipeline-jenkinsfile

/priority high
/area devops

S2i stuck because of project quota exceeded

Describe the Bug
As shown in the following screenshot, s2i hung because of project resource quota exceeded. But there is not error message or any useful information help user understand what's going on here..

For UI issues please also add a screenshot that shows the issue.

截屏2020-08-11 13 41 01

Versions Used
KubeSphere: v3.0.0.
Kubernetes: v1.18.6

/milestone 3.1.0
/kind feature
/priority medium
/assign @shaowenchen

Proposal: Graphical page realizes "Parametric Build"

Due to some technical limits, the parameters we entered when creating the "Parametric Build" pipeline can only take effect in config.xml, and the Jenkinsfile generated when the pipeline is drawn cannot get the parameters configured when it is created, so it's difficult to use the graphical page Elegantly create "Parametric Build" pipelines.

I think it is possible to directly provide the "Parametric Build" entry when drawing the pipeline, and remove the "Parametric Build" entry at creating the pipeline, then "Parametric Build" can be perfectly realized and never confuse users anymore.

image

image

/kind proposal
/area devops
/area console

S2i template bug

General remarks

When users rebuild the S2I, you'll see the customized template you selected last time by default, but when you actually execute it, it comes with using the KubeSphere built-in template, not the customized one you chose.

Describe the bug

Please refer to this post.

Environment

v2.1.1

(and other info are welcomed to help us debugging)

To Reproduce

Please refer to this video

Expected behavior

When rebuilding S2i, it should select the user-customized template that is used in the first S2i build instead of the kubesphere built-in template.

TestAddCredentialFinalizers UT randomly fails

Describe the Bug

TestAddCredentialFinalizers UT randomly fails.

ref: https://github.com/kubesphere/kubesphere/runs/2771946724?check_suite_focus=true

Versions Used
KubeSphere: 3.1.0
Kubernetes: (If KubeSphere installer used, you can skip this)

Environment
How many nodes and their hardware configuration:

For example: CentOS 7.5 / 3 masters: 8cpu/8g; 3 nodes: 8cpu/16g
(and other info are welcomed to help us debugging)

How To Reproduce

I0608 08:40:31.354345   28018 devopscredential_controller.go:220] namespace 'test-123/test' in work queue no longer exists 
--- FAIL: TestAddCredentialFinalizers (0.00s)
    devopscredential_controller_test.go:191: 1 additional expected actions:[{ActionImpl:{Namespace:test-123 Verb:update Resource:/v1, Resource=secrets Subresource:} Object:&Secret{ObjectMeta:{test  test-123    0 0001-01-01 00:00:00 +0000 UTC <nil> <nil> map[] map[credential.devops.kubesphere.io/autosync:true credential.devops.kubesphere.io/syncstatus:successful] [] [finalizers.kubesphere.io/credential]  []},Data:map[string][]byte{},Type:credential.devops.kubesphere.io/test,StringData:map[string]string{},Immutable:nil,}}]
    devopscredential_controller_test.go:200:  credential &Secret{ObjectMeta:{test  test-123    0 0001-01-01 00:00:00 +0000 UTC <nil> <nil> map[] map[credential.devops.kubesphere.io/autosync:true credential.devops.kubesphere.io/syncstatus:successful] [] [finalizers.kubesphere.io/credential]  []},Data:map[string][]byte{},Type:credential.devops.kubesphere.io/test,StringData:map[string]string{},Immutable:nil,} not match 
         &Secret{ObjectMeta:{test  test-123    0 0001-01-01 00:00:00 +0000 UTC <nil> <nil> map[] map[credential.devops.kubesphere.io/autosync:true] [] []  []},Data:map[string][]byte{},Type:credential.devops.kubesphere.io/test,StringData:map[string]string{},Immutable:nil,}
FAIL

Expected behavior
UT test should always pass.

/kind bug
/area devops
/cc @kubesphere/devops-admin

Can the pipeline interface add a status display when running?

Problem

  1. After clicking "Run", there is no progress bar to display the status and progress of the operation. Otherwise, it will go to "Run" again after a few seconds, which will lead to repeated creation

Want to solve

  1. Hope to add such display as [progress bar]

Errors happened when deploying an application with the Jenkins kubernetes-cd plugin

异常信息:
-------------start---------------------
`Starting Kubernetes deployment
ERROR: ERROR: java.lang.RuntimeException: io.kubernetes.client.openapi.ApiException: Bad Request
hudson.remoting.ProxyException: java.lang.RuntimeException: io.kubernetes.client.openapi.ApiException: Bad Request
at com.microsoft.jenkins.kubernetes.wrapper.ResourceManager.handleApiExceptionExceptNotFound(ResourceManager.java:180)
at com.microsoft.jenkins.kubernetes.wrapper.V1ResourceManager$PodUpdater.getCurrentResource(V1ResourceManager.java:613)
at com.microsoft.jenkins.kubernetes.wrapper.V1ResourceManager$PodUpdater.getCurrentResource(V1ResourceManager.java:602)
at com.microsoft.jenkins.kubernetes.wrapper.ResourceManager$ResourceUpdater.createOrApply(ResourceManager.java:93)
at com.microsoft.jenkins.kubernetes.wrapper.KubernetesClientWrapper.handleResource(KubernetesClientWrapper.java:289)
at com.microsoft.jenkins.kubernetes.wrapper.KubernetesClientWrapper.apply(KubernetesClientWrapper.java:256)
at com.microsoft.jenkins.kubernetes.command.DeploymentCommand$DeploymentTask.doCall(DeploymentCommand.java:172)
at com.microsoft.jenkins.kubernetes.command.DeploymentCommand$DeploymentTask.call(DeploymentCommand.java:124)
at com.microsoft.jenkins.kubernetes.command.DeploymentCommand$DeploymentTask.call(DeploymentCommand.java:106)
at hudson.remoting.UserRequest.perform(UserRequest.java:212)
at hudson.remoting.UserRequest.perform(UserRequest.java:54)
at hudson.remoting.Request$2.run(Request.java:369)
at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at hudson.remoting.Engine$1.lambda$newThread$0(Engine.java:93)
at java.lang.Thread.run(Thread.java:748)
Suppressed: hudson.remoting.Channel$CallSiteStackTrace: Remote call to JNLP4-connect connection from 10.244.2.149/10.244.2.149:59144
at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1800)
at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:357)
at hudson.remoting.Channel.call(Channel.java:1001)
at hudson.FilePath.act(FilePath.java:1160)
at com.microsoft.jenkins.kubernetes.command.DeploymentCommand.execute(DeploymentCommand.java:68)
at com.microsoft.jenkins.kubernetes.command.DeploymentCommand.execute(DeploymentCommand.java:45)
at com.microsoft.jenkins.azurecommons.command.CommandService.runCommand(CommandService.java:88)
at com.microsoft.jenkins.azurecommons.command.CommandService.execute(CommandService.java:96)
at com.microsoft.jenkins.azurecommons.command.CommandService.executeCommands(CommandService.java:75)
at com.microsoft.jenkins.azurecommons.command.BaseCommandContext.executeCommands(BaseCommandContext.java:77)
at com.microsoft.jenkins.kubernetes.KubernetesDeploy.perform(KubernetesDeploy.java:42)
at com.microsoft.jenkins.azurecommons.command.SimpleBuildStepExecution.run(SimpleBuildStepExecution.java:54)
at com.microsoft.jenkins.azurecommons.command.SimpleBuildStepExecution.run(SimpleBuildStepExecution.java:35)
at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
... 1 more
Caused by: hudson.remoting.ProxyException: io.kubernetes.client.openapi.ApiException: Bad Request
at io.kubernetes.client.openapi.ApiClient.handleResponse(ApiClient.java:979)
at io.kubernetes.client.openapi.ApiClient.execute(ApiClient.java:895)
at io.kubernetes.client.openapi.apis.CoreV1Api.readNamespacedPodWithHttpInfo(CoreV1Api.java:25423)
at io.kubernetes.client.openapi.apis.CoreV1Api.readNamespacedPod(CoreV1Api.java:25399)
at com.microsoft.jenkins.kubernetes.wrapper.V1ResourceManager$PodUpdater.getCurrentResource(V1ResourceManager.java:611)
... 16 more
Loading configuration: /home/jenkins/agent/workspace/demo-devopsml2qz/pipeline-test/deploy/test/nginx-test.yaml
Api call failed with code 400, detailed message: {
"kind": "Status",
"apiVersion": "v1",
"metadata": {

},
"status": "Failure",
"message": "the export parameter, deprecated since v1.14, is no longer supported",
"reason": "BadRequest",
"code": 400
}
Kubernetes deployment ended with HasError
`
--------------end---------------------------

环境信息:kubesphere 3.1.0, kubernetes V1.21.1
kubeconfig 用的是web控制台生成的
部署用的项目是官方示例项目devops-java-sample

Request to support publish and deploy helm chart in KubeSphere

在公司内网k8s集群内安装了ks,创建了devops工程,建了一个应用的流水线gateway-http pipline,向导式的UI非常人性化,即便不懂jenkinsfile的人也可以创建一条流水线,非常棒的功能。
我的需求: 从checkout scm到build and push都很好,但是最后一步发布至k8s时,我发现只支持yaml,不支持helm chart,因为我们公司都是通过helm chart发布应用到k8s集群的,希望在后面的版本中流水线可以支持helm 部署发布。
我发现ks是可以添加自建的helm repo的,是不是可以将流水线和应用仓库打通。
kubesphere是我用过最好的云原生时代下的管理平台,希望越做越好。

Failed to create Credentials in DevOps Projects

Describe the Bug
A clear and concise description of what the bug is.

I Got Sync Failed error when create a credential named harbor-id

image

Versions Used
KubeSphere: nightly-20210422
Kubernetes: v1.18.14

** More Logs**

  • ks-apiserver

image

  • ks-controller-manager

image

/kind bug
/area devops

Can automatic refresh function be added in the pipeline?

Problem
Unable to view the latest pipeline situation in real time after many build items
Want to solve
Hope to add the function of "automatic refresh", and add a new function similar to the progress bar, which can display the running status

create not allowed while custom resource definition is terminating in v3.1.0 devops pipeline

Describe the Bug

Create pipeline error

create not allowed while custom resource definition is terminating

image

Versions Used
KubeSphere: 3.1.0
Kubernetes: (If KubeSphere installer used, you can skip this)
1.18.18

Environment
How many nodes and their hardware configuration:

For example: CentOS 7.5 / 3 masters: 8cpu/8g; 3 nodes: 8cpu/16g
(and other info are welcomed to help us debugging)

How To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior
A clear and concise description of what you expected to happen.

Github token missing scopes, but there is no feedback to users.

Describe the Bug
When creating a DevOps pipeline using in-scm way, I've generated a github token and pasted it into the Token input box, and click confirm, then it showed wrong token, but there is no why. Only after inspecting server logs, I've found this error message.

E0323 10:02:24.731578       1 pipeline.go:637] {
  "message" : "Invalid token, its missing scopes: user:email,repo",
  "code" : 428,
  "errors" : [ ]
}

Clearly, I've forget to select the right scopes when generating token. It's better to return this error message back to users.

截屏2021-03-23 10 03 00

截屏2021-03-23 10 02 34

Versions Used
KubeSphere: nightly-20210321
Kubernetes: (If KubeSphere installer used, you can skip this)

/kind bug
/priority low
/area devops
/area console

Add support to select an artifact when creating an image builder

What's it about?

Currently, users only can upload a binary file manually even they want to create an image builder against the same file multiple times.

image

/area devops
/priority medium

What's the reason why we need it?

In the real world, users always have their own artifact server. For example, Nexus, MinIO, Artifactory, etc. It would be very inconvenient if users need to upload it manually.

So, I propose that the Image Builder allows users to choose an artifact from a server (like I mentioned before). There're a couple of things that we might need to consider:

  • integration with Nexus, MinIO, etc.
    • auth support
  • changes from the front-end side

Please leave your comments below if there's anyone who agrees with me. Or just give me a thumb up.

Area Suggestion

/kind feature-request

Incomplete pipeline logs

Describe the Bug

I ran a Pipeline. From the ks page, I can see that it has failed, but I can't see the error message.

image

But I can see additional logs from jenkins.

image

Versions Used
KubeSphere: nightly-20210426

/kind bug
/area devops

can't rerun failed pipeline

Describe the Bug
Click rerun the failed piple and got the following error msg. But clicking on the successful pipeline is fine.
Screen Shot 2020-08-05 at 6 05 49 PM

Versions Used
KubeSphere: 3.0.0-dev

Set Jenkins Persistence.StorageClass "-" as default

Currently, default value of Jenkins Persistence.StorageClass is "local", which means that we must have a storageclass named "local". This is unreasonable.

https://github.com/LinuxSuRen/ks-devops/blob/781c64c7e93d41b2ee0a66fb50c9f6723a524c69/charts/ks-devops/charts/jenkins/values.yaml#L406

We could make the storageClassName field disappear as default by setting Persistence.StorageClass as "-".

https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1
https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#defaultstorageclass

internel server error

在创建完devops pipline后只有admin账号显示健康状态,其他任何账号均显示的异常状态,且以其他非admin账号的任何账号点击后都是报internel server error
1621835564(1)
1621835664(1)
1621835610(1)
1621835698(1)

Add the switch to plaintext button when setting Credentials.

Versions used(KubeSphere/Kubernetes)
KubeSphere: dev:latest

image
image

Expected behavior
The token/password can be switched to plaintext display in Account Credentials.
The passphrase can be switched to plaintext display in SSH.

/priority low
/area devops
/cc @kubesphere/sig-devops
/kind feature
/milestone 3.1.0

build image operation failed

Describe the Bug

steps:

  1. When building the image, select the correct mirror key
  2. Upload the correct WAR package
  3. see result of the build mirror operation

Expected results:
The image can be successfully built

Actual results:
The build image failed, and no log information is displayed

image

/kind bug
/assign @LinuxSuRen
/priority High
/milestone 3.1.0

jenkins.yaml format error after editd it from the web page

Describe the Bug

I edited jenkins.yaml on the web page, and after apply through the web page, I checked the cm configuration through kubectl and found that the format was not correct.

image

image

/area devops
/area console
/kind bug
/version nightly-20210419

Make it be easier to get the error log due to the Jenkinsfile is missing

Describe the Bug

I created a Pipeline and cliecked the button "Scan Repository", but nothing heppended.

image

Logs at jenkins pod as below:

2021-04-30 06:14:04.277+0000 [id=11637] WARNING jenkins.model.Jenkins#lambda$getActiveAdministrativeMonitors$1
java.lang.NullPointerException
        at hudson.PluginWrapper.getDeprecations(PluginWrapper.java:1310)
        at hudson.PluginWrapper.isDeprecated(PluginWrapper.java:379)
        at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
        at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
        at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
        at hudson.PluginManager$PluginDeprecationMonitor.getDeprecatedPlugins(PluginManager.java:2264)
        at hudson.PluginManager$PluginDeprecationMonitor.isActivated(PluginManager.java:2258)
        at jenkins.model.Jenkins.lambda$getActiveAdministrativeMonitors$1(Jenkins.java:2233)
        at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
        at java.util.Iterator.forEachRemaining(Iterator.java:116)
        at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
        at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
        at jenkins.model.Jenkins.getActiveAdministrativeMonitors(Jenkins.java:2238)
        at jenkins.management.AdministrativeMonitorsDecorator.getActiveAdministrativeMonitors(AdministrativeMonitorsDecorator.java:74)
        at jenkins.management.AdministrativeMonitorsDecorator.getActiveAdministrativeMonitorsCount(AdministrativeMonitorsDecorator.java:69)
        at jenkins.management.AdministrativeMonitorsDecorator.shouldDisplay(AdministrativeMonitorsDecorator.java:126)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.commons.jexl.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:258)
        at org.apache.commons.jexl.parser.ASTMethod.execute(ASTMethod.java:104)
        at org.apache.commons.jexl.parser.ASTReference.execute(ASTReference.java:83)
        at org.apache.commons.jexl.parser.ASTReference.value(ASTReference.java:57)
        at org.apache.commons.jexl.parser.ASTReferenceExpression.value(ASTReferenceExpression.java:51)
        at org.apache.commons.jexl.ExpressionImpl.evaluate(ExpressionImpl.java:80)
        at hudson.ExpressionFactory2$JexlExpression.evaluate(ExpressionFactory2.java:74)
        at org.apache.commons.jelly.expression.ExpressionSupport.evaluateRecurse(ExpressionSupport.java:61)
        at org.apache.commons.jelly.expression.ExpressionSupport.evaluateAsBoolean(ExpressionSupport.java:71)
        at org.apache.commons.jelly.tags.core.CoreTagLibrary$1.run(CoreTagLibrary.java:97)
        at org.apache.commons.jelly.tags.core.CoreTagLibrary$2.run(CoreTagLibrary.java:105)
        at org.kohsuke.stapler.jelly.JellyViewScript.run(JellyViewScript.java:95)
        at org.kohsuke.stapler.jelly.IncludeTag.doTag(IncludeTag.java:147)
        at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:269)
        at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:161)
        at org.apache.commons.jelly.tags.core.ForEachTag.doTag(ForEachTag.java:150)
        at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:269)
        at org.apache.commons.jelly.tags.core.CoreTagLibrary$1.run(CoreTagLibrary.java:98)
        at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95)
        at org.kohsuke.stapler.jelly.ReallyStaticTagLibrary$1.run(ReallyStaticTagLibrary.java:100)
        at org.kohsuke.stapler.jelly.ReallyStaticTagLibrary$1.run(ReallyStaticTagLibrary.java:100)
        at org.apache.commons.jelly.tags.core.CoreTagLibrary$1.run(CoreTagLibrary.java:98)
        at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95)
        at org.kohsuke.stapler.jelly.ReallyStaticTagLibrary$1.run(ReallyStaticTagLibrary.java:100)
        at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95)
        at org.kohsuke.stapler.jelly.ReallyStaticTagLibrary$1.run(ReallyStaticTagLibrary.java:100)
        at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95)
        at org.kohsuke.stapler.jelly.CallTagLibScript$1.run(CallTagLibScript.java:99)
        at org.apache.commons.jelly.tags.define.InvokeBodyTag.doTag(InvokeBodyTag.java:91)
        at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:269)
        at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95)
        at org.apache.commons.jelly.tags.core.CoreTagLibrary$2.run(CoreTagLibrary.java:105)
        at org.kohsuke.stapler.jelly.CallTagLibScript.run(CallTagLibScript.java:120)
        at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95)
        at org.apache.commons.jelly.tags.core.CoreTagLibrary$2.run(CoreTagLibrary.java:105)
        at org.kohsuke.stapler.jelly.CallTagLibScript.run(CallTagLibScript.java:120)
        at org.apache.commons.jelly.tags.core.CoreTagLibrary$2.run(CoreTagLibrary.java:105)
        at org.kohsuke.stapler.jelly.JellyViewScript.run(JellyViewScript.java:95)
        at org.kohsuke.stapler.jelly.DefaultScriptInvoker.invokeScript(DefaultScriptInvoker.java:64)
        at org.kohsuke.stapler.jelly.DefaultScriptInvoker.invokeScript(DefaultScriptInvoker.java:54)
        at org.kohsuke.stapler.jelly.ScriptInvoker.execute(ScriptInvoker.java:56)
        at org.kohsuke.stapler.jelly.ScriptInvoker.execute(ScriptInvoker.java:43)
        at org.kohsuke.stapler.Facet.handleIndexRequest(Facet.java:284)
        at org.kohsuke.stapler.jelly.JellyFacet.handleIndexRequest(JellyFacet.java:100)
        at org.kohsuke.stapler.IndexViewDispatcher.dispatch(IndexViewDispatcher.java:32)
        at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:766)
        at org.kohsuke.stapler.Stapler.invoke(Stapler.java:898)
        at org.kohsuke.stapler.MetaClass$4.doDispatch(MetaClass.java:281)
        at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
        at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:766)
        at org.kohsuke.stapler.Stapler.invoke(Stapler.java:898)
        at org.kohsuke.stapler.MetaClass$4.doDispatch(MetaClass.java:281)
        at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
        at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:766)
        at org.kohsuke.stapler.Stapler.invoke(Stapler.java:898)
        at org.kohsuke.stapler.MetaClass$9.dispatch(MetaClass.java:457)
        at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:766)
        at org.kohsuke.stapler.Stapler.invoke(Stapler.java:898)
        at org.kohsuke.stapler.MetaClass$4.doDispatch(MetaClass.java:281)
        at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
        at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:766)
        at org.kohsuke.stapler.Stapler.invoke(Stapler.java:898)
        at org.kohsuke.stapler.Stapler.invoke(Stapler.java:694)
        at org.kohsuke.stapler.Stapler.service(Stapler.java:240)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:763)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1631)
        at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:154)
        at org.jenkinsci.plugins.ssegateway.Endpoint$SSEListenChannelFilter.doFilter(Endpoint.java:248)
        at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)
        at jenkins.security.ResourceDomainFilter.doFilter(ResourceDomainFilter.java:76)
        at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)
        at jenkins.telemetry.impl.UserLanguages$AcceptLanguageFilter.doFilter(UserLanguages.java:129)
        at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)
        at io.jenkins.blueocean.auth.jwt.impl.JwtAuthenticationFilter.doFilter(JwtAuthenticationFilter.java:60)
        at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)
        at com.cloudbees.jenkins.support.slowrequest.SlowRequestFilter.doFilter(SlowRequestFilter.java:37)
        at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)
        at com.smartcodeltd.jenkinsci.plugin.assetbundler.filters.LessCSS.doFilter(LessCSS.java:47)
        at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)
        at io.jenkins.blueocean.ResourceCacheControl.doFilter(ResourceCacheControl.java:134)
        at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)
        at jenkins.metrics.impl.MetricsFilter.doFilter(MetricsFilter.java:125)
        at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)
        at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:157)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1618)
        at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:159)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1618)
        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)
        at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:51)
        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
        at jenkins.security.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
        at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
        at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
        at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
        at jenkins.security.BasicHeaderProcessor.success(BasicHeaderProcessor.java:139)
        at jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:82)
        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
        at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
        at hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:67)
        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
        at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:90)
        at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:171)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1618)
        at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:51)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1618)
        at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:82)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1618)
        at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1618)
        at jenkins.security.SuspiciousRequestFilter.doFilter(SuspiciousRequestFilter.java:36)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1618)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:549)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:578)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
        at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1610)
        at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1369)
        at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:489)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1580)
        at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1284)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
        at org.eclipse.jetty.server.Server.handle(Server.java:501)
        at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383)
        at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:556)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:272)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
        at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129)
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:375)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938)
        at java.lang.Thread.run(Thread.java:748)

Versions Used
KubeSphere: v3.1.0
Kubernetes: v1.18.14

/kind bug
/area devops

Request to support multibranch-default plugin for DevOps

What's it about?

pipeline-multibranch-defaults can allow users to set a default for many pipelines. So maintaining all pipeline scripts from one place could be possible.

This idea came from Kubesphere Chinese forum.

What's the reason why we need it?

I believe this is an important feature for Kubesphere. There're a few use cases:

  • There're many pipelines that have very similar logic. It's hard to maintain all of them (for example 20+ pipelines).
  • Sometimes the maintainers just don't have the permission to access the git server. For example, the tester team doesn't permission to access the business code base. It's very inconvenient in this case.
  • ...

Please leave your comments below if there's anyone agrees with me. Or just give me a thumb up. Or you also can provide more use cases below.

Why do we need to support this via Kubesphere? Anyone can install this plugin into their Jenkins instead. But in our real world, it's not true. We don't really hope all team members can access Jenkins even have admin permission. So, providing some kind of way to maintain the default pipeline via Kubesphere is absolutely necessary.

But there's one more thing we need to consider. There're so many plugins that can be installed into Jenkins. Maybe we need to figure out a smart way to integrate some of them.

Area Suggestion

/area devops

/kind feature-request

Add Pipeline update strategy support

What's it about?

Add an update strategy for Pipeline. For example, add three strategies:

  • overwrite
    • Convert the Pipeline resource into a Jenkins job, then overwrite it every time.
    • Consider back-compatible, this should be the default one.
  • patch
    • Update the Jenkins job configuration partly.
    • It's should be possible, but we need to do some research.
  • none
    • Do not update Jenkins job from the KubeSphere side.
    • This looks like a switch that totally up to the users.

Both the backend and frontend need to make changes.

Backend
Add a field into the spec of the pipeline resource struct. Or add it to the annotation.

Do not update the Jenkins job if the strategy is none.

Frontend
Don't allow users to modify Pipeline if the update strategy is none. Given a reasonable tip for users.

What's the reason why we need it?

Jenkins has over 1.5k plugins. Thanks to that, users can have a lot of choices to meet their requirements.

But some of those plugins are not well maintained. Even worse, there is no active maintainer for some plugins. We cannot predict if users will install some additional plugins. So it's impossible to make sure there's no exception when some additional plugins exist.

Secondly, KubeSphere only offers part features of Jenkins instead of all. If users modify Pipelines across from the Jenkins and KubeSphere UI, it might lead to chaos. Because KubeSphere will overwrite the Jenkins jobs once users modify the Pipeline via KubeSphere or kubectl. It means some unexpected options of Jenkins job might be lost.

Please leave your comments below if there's anyone who agrees with me. Or just give me a thumb up.

Area Suggestion

/area devops
/kind feature-request
/kind proposal
/priority medium

Support integration an external Jenkins

In many cases, users already have a Jenkins in their environment. But kubesphere always request us to install a new one. It will spend a lot of time to migrate the data file of Jenkins. The most important thing is that many people just don't know how to do it.

Support integration an external Jenkins could be an excellent feature. Please give me a thumb if you need this feature too.

[Proposal] Avoid communicate with Jenkins on DevOps credential modules

Current

The credential controller will create or update it to Jenkins via API calling once you create a DevOps credential via UI or CLI.

Potential Problems

  • The extra cost of maintaining the credential controller in kubesphere
  • Highly rely on Jenkins
  • Potential exception from the communication from KubeSphere and Jenkins
  • Users can modify (or remove) the credential from Jenkins side, then they might meet some confusing results due to they don't fully understand how does it work

Expected

  • Less dependence on Jenkins
  • No extra cost of unnecessary maintaining code lines

Solution

There's a plugin that can help us. kubernetes-credentials-provider-plugin can build a mapping between K8S secrets and Jenkins credentials. We don't need to maintain those credentials.

What do we need to do?

Desire reviewers

/cc @shaowenchen

Relevant Issues from Forum

https://kubesphere.com.cn/forum/d/3244-devops/19

/area devops
/kind feature-request
/priority medium

The branch count number is not the latest after clicking the refresh button on the Pipeline list page

General remarks

This form is to report bugs. For general usage questions refer to our Slack channel
KubeSphere-users

Describe the bug
The branch count number is not the latest after clicking the refresh button on the Pipeline list page.

image

/bug
/priority low
/area devops

Versions used(KubeSphere/Kubernetes)
KubeSphere: nightly-20210314

Environment
This is not an environmental issue.

To Reproduce
Steps to reproduce the behavior:

  1. Go to the DevOps Pipeline page
  2. Create a multi-branch Pipeline
  3. Scan the PIpeline, see the branch count number
  4. Create some new branches in git repository
  5. Check the branch count number again

Expected behavior
Expect to have a consistent branch count number on the same page.

Suggest to improve DevOps

1.devops要支持编排。就像咱们的云平台,能把整套环境导出,然后倒入到另外一个可用区。我们的devops工作流,如果能编排,让用户导出已有的流水线,然后倒入到另外一个里面,这样能少些工作;
2.支持流水线的复制。包括整体的或者局部的。同一个项目下面,不同的用户登进去后,新的用户看到老的项目的流水线,直接复制部分过来,然后稍微修改下,也能省些工作;
3.支持流水线导出成jenkins文件,这样有的人喜欢编辑jenkins文件的,可以让他直接在文件里修改;
4.咱们的基础模块可以再进一步细化。比如拉代码的模块,只保留参数,用户指定他的git的项目名,直接把整个url搞出来;

Make DevOps as a separate Application from KubeSphere core

Backgroud

Currently, the DevOps backend is part of KubeSphere Core. It's impossible to upgrade the DevOps component independently if a specific version has a crucial bug exist. Also, users cannot install DevOps as an application on Kubernetes.

Proposal

I'd like to suggest that make DevOps be a separate application. Please see also the following points:

  • Install DevOps application as a Helm charts
  • Has no dependency on KubeSphere
    • Only as a regular k8s application
    • Advanced features could be an enhancement in KubeSphere

What things do we need to do?

  • Move the DevOps controller-manager and APIServer into a separate repo
  • Move the DevOps frontend into a separate repo
  • Have a Helm chart for the DevOps application
  • Have a KubeSphere DevOps plugin that contains the connection between KubeSphere and DevOps
    • Some features should belong to the DevOps project, such as multi-cluster support, enterprise workspace, etc.

/area devops
/kind proposal
/stage alpha

For gitlab group, it supports multi-level display repo

When selecting gitlab type to create pipeline, if the group of multi-level directory is encountered,it supports multi-level display repo
eg group:
A
—a
—a—a1
—a—a2
—b
—b—b1
—b—b2
--c
show list:
A/a/a1
A/a/a2
A/b/b1
A/b/b2
A/c

Request to add s2i support for Golang

Describe the bug(描述下问题)
“通过代码构建新的服务”功能中,目前只支持javanodejspython。希望能够添加对golang语言的支持,因为这门语言在后端开发中已经非常流行。谢谢

Versions used(KubeSphere/Kubernetes的版本)
KubeSphere: 2.1.0
Kubernetes: 1.15.7

Environment(环境的硬件配置)
How many nodes and their hardware configuration:

For example:
1 masters: 4cpu/16g
3 nodes: 4cpu/16g

When the pipeline runs to the step input , there is no choice to continue or end, let alone enter content.

Describe the Bug
When the pipeline runs to the step input, there is no choice to continue or end, let alone enter content.

Versions Used
KubeSphere:

Environment
http://allinone:30880/

How To Reproduce
Steps to reproduce the behavior:

  1. Create pipeline 'Test' using JenkinsFile below:
    pipeline {
    agent any
    stages {
    stage('Example') {
    input {
    message "Should we continue?"
    ok "Yes, we should."
    submitter "alice,bob"
    parameters {
    string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
    }
    }
    steps {
    echo "Hello, ${PERSON}, nice to meet you."
    }
    }
    }
    }
  2. run pipeline 'Test'.
  3. When the pipeline state becomes paused,Enter the activity details page of the pipeline.
  4. Select Continue run Pipeline and enter content.

Expected behavior
step4: user can choice to continue or end

Actual behavior
step4: user have no choice to continue or end, let alone enter content

/kind bug
/area devops
/assign @shaowenchen
/milestone 3.1.0
/priority high

no repositories are listed after selecting a github-token

Describe the Bug
When using QKE 3.1.0. on QingCloud Asia region, no repositories are listed after selecting a github-token. The relative article is https://v3-1.docs.kubesphere.io/zh/docs/devops-user-guide/how-to-use/create-a-pipeline-using-jenkinsfile/.

The screenshot is provided below:

image

Versions Used
KubeSphere: 3.1.0

Environment
QKE 3.1.0, 1 master 2 worker nodes.

Expected behavior
A repositoy list should be listed just as described in the article.

The operator user who is not the designated auditor can still approve the pipeline

Versions Used
KubeSphere: dev:latest

Environment
http://139.198.9.112:30883

Preset conditions
there is a user 'wx-02' with global role platform-regular, workspce role ws2-regular and devops project 'dev' role operator

How To Reproduce
Steps to reproduce the behavior:

  1. use admin login ks
  2. Go to workspace 'ws2'
  3. Go to devops project 'dev'
  4. run pipeline '6'
  5. use 'wx-02' login ks and approve the pipeline '6'
    jenkinsfile.txt

Expected behavior
user 'wx-02' can not approve pipeline '6'

Actual behavior
image

/priority medium
/area devops
/cc @kubesphere/sig-devops
/kind bug
/milestone 3.1.0

Kubesphere local and official mirror of each installation environment, The Kubesphere local and official image installation environment is performing S2I error

image-20210518081751543

image-20210518081814198

Both my local and official mirror libraries have Kubesphere V3.1.0 deployed, The Kubesphere deployed by the official mirror library during S2i can be successfully packaged and uploaded,The local mirroring library deployed to Kubesphere reported an error,I read the error message that the Maven plugin was not downloaded. Is this a bug?

image-20210518081832213

I went into the build container and ping repo.maven.apache.org works

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.