From 76c1f18c4fcb5fa4ef08fcd6cad527598d761bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20K=C3=BChnel?= Date: Tue, 29 Oct 2019 13:56:40 +0100 Subject: [PATCH] improved documentation --- README.md | 62 +++--------------------------------- docs/images/bot_comment.png | Bin 0 -> 22421 bytes docs/images/diff_detail.png | Bin 0 -> 15719 bytes docs/images/unit_tests.png | Bin 0 -> 25929 bytes docs/playbooks.md | 58 +++++++++++++++++++++++++++++++++ docs/user_doc.md | 17 ++++++++++ 6 files changed, 79 insertions(+), 58 deletions(-) create mode 100644 docs/images/bot_comment.png create mode 100644 docs/images/diff_detail.png create mode 100644 docs/images/unit_tests.png create mode 100644 docs/playbooks.md create mode 100644 docs/user_doc.md diff --git a/README.md b/README.md index 431dc65..b5569be 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Overview -This repository contains the configuration files for the merge guards for the LLVM project. It configures a cluster of build machines that are used to check all incoming commits to the LLVM project. +This repository contains the configuration files for the pre-merge checks for the LLVM project. This github project contains the documentation and the server configuration cluster of build machines that are used to check all incoming commits to the LLVM project. # Pre-merge check vision for end of 2019 Maria is a developer working on a new idea for the LLVM project. When she submits a new diff to Phabricator (or updates an existing diff), the pre-merge checks are triggered automatically in the cloud. The pre-merge checks run in one configuration (amd64, Debian Testing, clang8) and comprise these steps: @@ -55,63 +55,9 @@ On the Jenkins side: There is no backup of the credentials. If you need to change it, generate a new one and update it in Jenkins and Phabricator. -# Playbooks - -## deployment to a clean infrastructure - -General remarks: -* GCP does not route any traffic to your services unless the service is "healthy". It might take a few minutes after startup before the services is classified as healthy. Until then you will only see some generic error message. - -These are the steps to set up the build server on a clean infrastructure: -1. Configure the tools on your local machine: - ```bash - ./local_setup.sh - ``` -1. Delete the old cluster, if it still exists: - ```bash - cd kubernetes/cluster - ./cluster_delete.sh - ``` -1. Create the cluster: - ```bash - cd kubernetes/cluster - ./cluster_create.sh - ``` -1. Create the disk storage, if it does not yet exist: - ```bash - cd kubernetes/cluster - ./disk_create.sh - ``` -1. SSH into the VM instance mounting the volume, find the mount point and then set - ```bash - # go to the mount point of the volume - cd /var/lib/kubelet/plugins/kubernetes.io/gce-pd/mounts/jenkins-home - # change the permissions - sudo chmod a+rwx - ``` -1. Push the docker images to gcr.io: - ```bash - cd containers - #for each subfolder: - ./build_deploy.sh - ``` -1. Deploy the stack: - ```bash - cd kubernetes - ./deploy.sh - ``` -1. Configure it - -## creating basic authentication for reverse proxy - -1. create auth file, based on [ingress-nginx documentation](https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/auth/basic) - ```bash - cd kubernetes/reverse-proxy - htpasswd -c auth - # enter password at prompt - # add more users as required - kubectl create secret generic proxy-auth --from-file=auth --namespace=jenkins - ``` +# Additional Information +* [Playbooks](docs/playbook.yaml) for installing/upgrading +* [User documentation](docs/user_doc.md) # License This project is licensed unter the "Apache 2.0 with LLVM Exception" license. See [LICENSE](LICENSE) for details. diff --git a/docs/images/bot_comment.png b/docs/images/bot_comment.png new file mode 100644 index 0000000000000000000000000000000000000000..32c6003a94ec706e745264c8edf683c2f3122b9c GIT binary patch literal 22421 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 KK}wX~2LA_0=V^Ta literal 0 HcmV?d00001 diff --git a/docs/images/diff_detail.png b/docs/images/diff_detail.png new file mode 100644 index 0000000000000000000000000000000000000000..76b596e37bf97b9986a9e738eba280831c256750 GIT binary patch literal 15719 zcmd73WmH^E)F#UNCLw|a2=0vq5AF~`2-;v^l%NH5-H*el7tSYS_Pl;S5v|ZIe7Ooz~&gLkV4j_AT78g@zb8`n5E0F8a ziw+SK6iO5spqRR6>cNtiwwe|>@3D~-4rTD?_irde|JBUK(fu*;aSfAEg6OYSrL0Dw z+!SLwBWDPBTyy_Jtpu}`hQ949ih#~+K!~c73>x3RjLJMZAunSqY5u{ngNvfPdf7eQ zEAZe){zQ3|?sC{fa69ZV>U<`d(;AFy9tz6j8mOZA#q-fI!H@H|&j)+{|BEtbJmbrh zTR6AdDP7)PbDfc}!4%SkAd(XE4o4$offoLMg0?rr#ETtIH{#&MsY)_ixNb-Ov!fx$Bg(PleR zy4fxmL+Y9_suKF}eBb*5Q2{}0Gb(h;KA$R6Neks+r!g^oPGvRAMM)|j9TSE>JZ*b{Sdo!&J7QqXH!BEzV(M$l9Vrf_}+wCH)u12 z29Xu@VZ0js8GyFTGoGoLl-;!HWNOP4705+>Bd-}=_1CRBCy7X&zx&vvDSqfMmyk*;C`-=*r>THN- z`9>f6tXx=bi`qEP`brLrpF4f8QRFm(-Pf%hDQ$T7`Euh|zW>-Co#_`)^uFPY4(IXf z0Rs^MVa~JV@b;=IIu-G$F3qWj*qwDET3zZ^{Lv&P7<1EcMx!80AgF1?Z372`kY~ha zvlrgh>|IunIB2A=A&TKXn^56*rPf_@cJ!}2jQ$l_?@ztpoYK1a0`}e0fu*^X8 zQqA`JwILZ%^Mh&X=SZvmpQj6bpk-DYV(vf6N-@&nL%+Mb6QNcs=QsZxXt|A=H>&vYT z33M#X+8BM9R#6j@+_kc{wo)GQUznRS;~4&|OHGf#i7>VhC<|C~CQ_lOuzB{b-$Z{? zB#Y$nGr+gskE19=d_P&3kZcK=U*>sA5iTEW_G1m5hx0r|Ag+U{hwGqFLJQpcZ7e>Q z-Q}hU{<0U^z2bpNJf_%D^<`G_y-g_|9im#?-EN&514kQu=Be-|e{(y|FJDW}D)+A7 z)X&{({l-hYsQ^yszb?9GAz`{WM}59(sMdfMN(SeGII#PU2|iyb#DdZPUy+fLkatsq zBu_hj&yW9YB-Q~dz*9PkJbe9p-a0)@rEVMkc;4G=i-l;x8&GU` zH{7~>p)DzYx>9($RgV?o4FA31c17;NkmXrvGjT(k#5kzfaJw@|PiruS6P5eh^uVLt zWU2;i6Mx@oYn1%)cz-2wG~&(U@|CMs#1E)C1DvLV%*_ba=J`;rG{!pMm;XR+9$F?c z!m{(=`>aOcsqIm|fX3tm8rcrND>NcNzERHuO7NqXBbkN5MfxTsp|%fVc(<_juya38 znR_55c@skc2*ltuebL^kdm*Kt|2h(_{QeUdB2zc_w?Z>g=^??Yk4EvLC)I$KZ5DmV zGks+JY^GR1H0^dD=3-VW{hJa1m|H#DG*HW7+|*yaNI!LVkty%%0A*16|E4un}2m4*nGwvx!{}j?R9zSpy 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 KVELD?KmHrzj>gge literal 0 HcmV?d00001 diff --git a/docs/images/unit_tests.png b/docs/images/unit_tests.png new file mode 100644 index 0000000000000000000000000000000000000000..fc2088550227d386a4d10c3d47b82890a19142c9 GIT binary patch literal 25929 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�#_Gy|oN8T|f5c~&zVEI6__if(7 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 literal 0 HcmV?d00001 diff --git a/docs/playbooks.md b/docs/playbooks.md new file mode 100644 index 0000000..3e76cb0 --- /dev/null +++ b/docs/playbooks.md @@ -0,0 +1,58 @@ +# Playbooks + + +## deployment to a clean infrastructure + +General remarks: +* GCP does not route any traffic to your services unless the service is "healthy". It might take a few minutes after startup before the services is classified as healthy. Until then you will only see some generic error message. + +These are the steps to set up the build server on a clean infrastructure: +1. Configure the tools on your local machine: + ```bash + ./local_setup.sh + ``` +1. Delete the old cluster, if it still exists: + ```bash + cd kubernetes/cluster + ./cluster_delete.sh + ``` +1. Create the cluster: + ```bash + cd kubernetes/cluster + ./cluster_create.sh + ``` +1. Create the disk storage, if it does not yet exist: + ```bash + cd kubernetes/cluster + ./disk_create.sh + ``` +1. SSH into the VM instance mounting the volume, find the mount point and then set + ```bash + # go to the mount point of the volume + cd /var/lib/kubelet/plugins/kubernetes.io/gce-pd/mounts/jenkins-home + # change the permissions + sudo chmod a+rwx + ``` +1. Push the docker images to gcr.io: + ```bash + cd containers + #for each subfolder: + ./build_deploy.sh + ``` +1. Deploy the stack: + ```bash + cd kubernetes + ./deploy.sh + ``` +1. Configure it + +## creating basic authentication for reverse proxy + +1. create auth file, based on [ingress-nginx documentation](https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/auth/basic) + ```bash + cd kubernetes/reverse-proxy + htpasswd -c auth + # enter password at prompt + # add more users as required + kubectl create secret generic proxy-auth --from-file=auth --namespace=jenkins + ``` diff --git a/docs/user_doc.md b/docs/user_doc.md new file mode 100644 index 0000000..0eea9f7 --- /dev/null +++ b/docs/user_doc.md @@ -0,0 +1,17 @@ +# Sign up for beta test + +To sign up for the pre-merge tests, please add your user id to the [Herald rule](https://reviews.llvm.org/H511) triggering the builds. If you can't modify the rule yourself, please send an email to [kuhnel@google.com](mailto:kuhnel@google.com?subject=pre-merge%20beta%20testing). + + +# Integration in Phabricator + +Once you're signed up, Phabricator will automatically trigger a build for every new patch you upload or every existing patch you modify. Phabricator shows the build results at the top of the entry: +![build status](images/diff_detail.png) + +If a unit test failed, this is shown below the build status. You can also expand the unit test to see the details: +![unit test results](images/unit_tests.png) + +After every build the build server will comment on your latest patch, so that you can also see the results for previous changes. The comment also contains a link to the log files: +![bot comment](images/bot_comment.png) + +You can also trigger a build manually by using the "Run Plan Manually" link on the [Harbormaster page](https://reviews.llvm.org/harbormaster/plan/3/) and entering a revision ID in the pop-up window. \ No newline at end of file