Remove stale targets from CI
[icn.git] / ci / ci.sh
1 #!/usr/bin/env bash
2 set -eux -o pipefail
3
4 SCRIPT_DIR="$(readlink -f $(dirname ${BASH_SOURCE[0]}))"
5
6 WITH_VAGRANT="${WITH_VAGRANT:-yes}"
7 JENKINS_HOSTNAME="${JENKINS_HOSTNAME:-localhost}"
8 JENKINS_ADMIN_USERNAME="${JENKINS_ADMIN_USERNAME:-admin}"
9 JENKINS_ADMIN_PASSWORD="${JENKINS_ADMIN_PASSWORD:-admin}"
10 JENKINS_LFTOOLS_USERNAME="${JENKINS_LFTOOLS_USERNAME:-icn.jenkins}"
11 JENKINS_SSH_USERNAME="${JENKINS_SSH_USERNAME:-icn.jenkins}"
12 CLUSTER_MASTER_IP="${CLUSTER_MASTER_IP:-localhost}"
13 CLUSTER_SSH_USER="${CLUSTER_SSH_USER:-root}"
14
15 BUILD_DIR=${SCRIPT_DIR/icn/icn/build}
16 mkdir -p ${BUILD_DIR}
17
18 ICN_DIR="${SCRIPT_DIR}/.."
19 # The ci-management repo must be a sibling of the icn repo
20 CI_MANAGEMENT_DIR="${ICN_DIR}/../ci-management"
21 JJB_PATH="${CI_MANAGEMENT_DIR}/jjb:${ICN_DIR}/ci/jjb"
22
23 # Workaround for KuD installer which messes with /etc/environment
24 function cleanup_after_kud {
25     sed -i -e '/ANSIBLE_CONFIG/d' /etc/environment
26 }
27
28 function install_jenkins {
29     # Prerequisites
30     export DEBIAN_FRONTEND=noninteractive
31     apt-get update
32     apt-get install -y ca-certificates python3-pip
33     pip3 install ansible jenkins-job-builder lftools
34
35     # Jenkins
36     ansible-galaxy install -r ${SCRIPT_DIR}/galaxy-requirements.yaml --roles-path /etc/ansible/roles
37     ansible-playbook ${SCRIPT_DIR}/site_jenkins.yaml --extra-vars "@${SCRIPT_DIR}/vars.yaml" -v
38
39     # The Bluval job requires docker access
40     usermod -aG docker jenkins
41
42     # Restart Jenkins to take into account any group changes above
43     systemctl restart jenkins
44
45     # Jenkins jobs
46     mkdir -p ${HOME}/.config/jenkins_jobs
47     cp ${SCRIPT_DIR}/jenkins_jobs.ini ${HOME}/.config/jenkins_jobs/jenkins_jobs.ini
48     git clone --recursive https://gerrit.akraino.org/r/ci-management "${CI_MANAGEMENT_DIR}"
49 }
50
51 function install_credentials {
52     if [[ ! -f ${JENKINS_SSH_PRIVATE_KEY} ]]; then
53         echo "JENKINS_SSH_PRIVATE_KEY must be set to the path of the private key of ${JENKINS_SSH_USERNAME}"
54         exit 1
55     fi
56
57     wget http://${JENKINS_HOSTNAME}:8080/jnlpJars/jenkins-cli.jar -O ${BUILD_DIR}/jenkins-cli.jar
58     cat <<EOF >${BUILD_DIR}/jenkins-ssh-credential.xml
59 <com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey plugin="ssh-credentials@1.13">
60   <scope>GLOBAL</scope>
61   <id>jenkins-ssh</id>
62   <description></description>
63   <username>${JENKINS_SSH_USERNAME}</username>
64   <privateKeySource class="com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey\$DirectEntryPrivateKeySource">
65     <privateKey>$(cat ${JENKINS_SSH_PRIVATE_KEY})</privateKey>
66   </privateKeySource>
67 </com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey>
68 EOF
69     java -jar ${BUILD_DIR}/jenkins-cli.jar -auth ${JENKINS_ADMIN_USERNAME}:${JENKINS_ADMIN_PASSWORD} -s http://${JENKINS_HOSTNAME}:8080/ create-credentials-by-xml system::system::jenkins _  <${BUILD_DIR}/jenkins-ssh-credential.xml
70 }
71
72 function install_lftools_credentials {
73     cat <<EOF >/var/lib/jenkins/.netrc
74 machine nexus.akraino.org login ${JENKINS_LFTOOLS_USERNAME} password ${JENKINS_LFTOOLS_PASSWORD}
75 EOF
76     chown jenkins:jenkins /var/lib/jenkins/.netrc
77     chmod 0600 /var/lib/jenkins/.netrc
78 }
79
80 function update_jobs {
81     # TODO Find a better way to do this without touching files under
82     # source control
83     sed -i -e "s!git-url: .*!git-url: 'ssh://${JENKINS_SSH_USERNAME}@gerrit.akraino.org:29418'!" ${SCRIPT_DIR}/jjb/defaults.yaml
84     sed -i -e "s!bluval-cluster-master-ip: .*!bluval-cluster-master-ip: ${CLUSTER_MASTER_IP}!" ${SCRIPT_DIR}/jjb/defaults.yaml
85     sed -i -e "s!bluval-cluster-ssh-user: .*!bluval-cluster-ssh-user: ${CLUSTER_SSH_USER}!" ${SCRIPT_DIR}/jjb/defaults.yaml
86
87     # This will create all 344 jobs:
88     # jenkins-jobs update ${JJB_PATH}:${ICN_DIR}/ci/jjb/project.yaml
89
90     # These are the ICN jobs we are interested in
91     if [[ ${WITH_VAGRANT} == "yes" ]]; then
92         jenkins-jobs update ${JJB_PATH} icn-master-vagrant-verify-verifier
93     fi
94     jenkins-jobs update ${JJB_PATH} icn-master-bm-verify-bm_verifier
95     jenkins-jobs update ${JJB_PATH} icn-bluval-daily-master
96     #jenkins-jobs update ${JJB_PATH} icn-master-verify
97
98     # These are additional ICN jobs:
99     # if [[ ${WITH_VAGRANT} == "yes" ]]; then
100     #     jenkins-jobs update ${JJB_PATH} icn-master-vagrant-verify-verify_nestedk8s
101     # fi
102 }
103
104 function install_jenkins_id {
105     # Create a new key if one does not exist
106     ssh-keygen -q -t rsa -N '' -f /var/lib/jenkins/jenkins-rsa -C jenkins@$(hostname) <<<n >/dev/null 2>&1 || true
107     ssh-copy-id -i /var/lib/jenkins/jenkins-rsa -f ${CLUSTER_SSH_USER}@${CLUSTER_MASTER_IP}
108     chown jenkins:jenkins /var/lib/jenkins/jenkins-rsa*
109     chmod 600 /var/lib/jenkins/jenkins-rsa*
110 }
111
112 case $1 in
113     "cleanup-after-kud") cleanup_after_kud ;;
114     "install-credentials") install_credentials ;;
115     "install-jenkins") install_jenkins ;;
116     "install-jenkins-id") install_jenkins_id ;;
117     "install-lftools-credentials") install_lftools_credentials ;;
118     "update-jobs") update_jobs ;;
119     *) cat <<EOF
120 Usage: $(basename $0) COMMAND
121
122 Commands:
123   cleanup-after-kud            - Cleanup after KuD install
124   install-credentials          - Install credentials into Jenkins
125   install-jenkins              - Install Jenkins
126   install-jenkins-id           - Install Jenkins ID into test cluster
127   install-lftools-credentials  - Install lftools credentials
128   update-jobs                  - Install or update ICN jobs into Jenkins
129
130 Environment variables used by the commands:
131   WITH_VAGRANT=[yes|no]    - Install components needed to run the VM
132                              verifier job
133   JENKINS_HOSTNAME         - jenkins_hostname in vars.yaml
134   JENKINS_ADMIN_USERNAME   - jenkins_admin_username in vars.yaml
135   JENKINS_ADMIN_PASSWORD   - jenkins_admin_password in vars.yaml
136   JENKINS_LFTOOLS_USERNAME - The .netrc login
137   JENKINS_LFTOOLS_PASSWORD - The .netrc password
138   JENKINS_SSH_USERNAME     - The gerrit account username
139   JENKINS_SSH_PRIVATE_KEY  - The gerrit account private key file
140   CLUSTER_MASTER_IP        - The cluster under test
141   CLUSTER_SSH_USER         - The cluster account username
142 EOF
143        ;;
144 esac