Project

General

Profile

Support #596

Updated by Daniel Curtis about 9 years ago

This is a guide for installing GitLab CI on FreeBSD 9.3. 

 *+NOTE+*: This issue has been rejected due to Continuous Integration being introduced in GitLab 8 

 h2. Setting up the Environment 

 * Start by making sure everything is up to date: 
 <pre> 
 pkg update && pkg upgrade 
 portsnap fetch extract 
 </pre> 

 * Install portmaster: 
 <pre> 
 cd /usr/ports/ports-mgmt/portmaster 
 make install clean 
 pkg2ng 
 </pre> 

 * Install a few dependencies: 
 <pre> 
 portmaster sysutils/rubygem-bundler ftp/wget ftp/curl textproc/libxml2 textproc/libxslt databases/redis devel/icu devel/readline devel/git textproc/libyaml 
 </pre> 

 * Install the libv8 gem system-wide: 
 <pre> 
 gem install libv8 
 </pre> 

 * Add the GitLab CI user 
 <pre> 
 pw add user -n gitlab_ci -m -s /usr/local/bin/bash -c "GitLab CI" 
 </pre>  

 h2. Install MariaDB 5.5 

 * This environment will be setup with MariaDB 5.5 for its MySQL server: 
 <pre> 
 portmaster databases/mariadb55-server databases/mariadb55-client 
 </pre> 
 #* Ensure you have MySQL version 5.5.14 or later 
 <pre> 
 mysql --version 
 </pre> 

 * Start and enable MySQL at boot: 
 <pre> 
 echo 'mysql_enable="YES"' >> /etc/rc.conf 
 service mysql-server start 
 </pre> 

 * Secure your installation: 
 <pre> 
 mysql_secure_installation 
 </pre> 

 * Login to MySQL 
 <pre> 
 mysql -u root -p 
 </pre> 
 #* Create a user for GitLab CI 
 <pre> 
 CREATE USER 'gitlab_ci'@'localhost' IDENTIFIED BY 'SuperSecretPassword'; 
 </pre> 
 *NOTE*: Change SuperSecretPassword to what ever password desired 
 #* Ensure you can use the InnoDB engine which is necessary to support long indexes. 
 <pre> 
 SET storage_engine=INNODB; 
 </pre> 
 *NOTE*: If this fails, check your MySQL config files (e.g. `/etc/mysql/*.cnf`, `/etc/mysql/conf.d/*`) for the setting "innodb = off" 
 #* Create the GitLab CI production database 
 <pre> 
 CREATE DATABASE IF NOT EXISTS `gitlab_ci_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`; 
 </pre> 
 #* Grant the GitLab user necessary permissions on the table. 
 <pre> 
 GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlab_ci_production`.* TO 'gitlab_ci'@'localhost'; 
 </pre> 
 #* Quit the database session 
 <pre> 
 quit 
 </pre> 

 * Try connecting to the new database with the new user 
 <pre> 
 mysql -h localhost -u gitlab_ci -p -D gitlab_ci_production 
 </pre> 
 * You should now see a mysql> prompt, quit the database session: 
 <pre> 
 quit 
 </pre> 

 h2. Install GitLab CI 

 * Switch to the GitLab CI user: 
 <pre> 
 su - gitlab_ci 
 </pre> 

 * Download GitLab CI: 
 <pre> 
 git clone https://github.com/gitlabhq/gitlab-ci.git 
 </pre> 

 * Checkout the latest stable 2.2 version 
 <pre> 
 cd gitlab-ci 
 git checkout 2-2-stable 
 </pre> 

 * Create a tmp and sockets directory inside application 
 <pre> 
 mkdir -p tmp/pids 
 mkdir tmp/sockets 
 </pre> 

 * Install dependencies 
 <pre> 
 bundle --without development test postgresql --path vendor/bundle 
 </pre> 
 #* *NOTE*: Installation with bundle will most likely fail the first time through, just run the following to fix: 
 <pre> 
 bundle update 
 </pre> 

 * Create the mysql db config 
 <pre> 
 cp config/database.yml.mysql config/database.yml 
 </pre> 

 * Edit the database config file: 
 <pre> 
 vi config/database.yml 
 </pre> 
 #* And modify the database parameters: 
 <pre> 
 production: 
   adapter: mysql2 
   encoding: utf8 
   reconnect: false 
   database: gitlab_ci_production 
   pool: 5 
   username: gitlab_ci 
   password: "SuperSecretPassword" 
   host: localhost 
 </pre> 

 * Setup the database 
 <pre> 
 bundle exec rake db:setup RAILS_ENV=production 
 </pre> 

 * During the database setup a secret key will be generates, add this to the devise initializer : 
 <pre> 
 vi config/initializers/devise.rb 
 </pre> 
 #* and add the following +before the *end*+ statement at the bottom of the file 
 <pre> 
 config.secret_key = 'dd3036798c2c74a3c41ea5b39b2593d417be8dfd62252219c158101cefdecea4d40a9d28f46df0a664328ceb7965207046520c18197489aea1f79b53dd6a4418' 
 </pre> 
 #* And restart the database setup 
 <pre> 
 bundle exec rake db:setup RAILS_ENV=production 
 </pre> 

 * Setup schedules  
 <pre> 
 bundle exec whenever -w RAILS_ENV=production 
 </pre> 

 * Now exit from gitlab_ci user 
 <pre> 
 exit 
 </pre> 

 h3. GitLab CI rc.d script 

 * Create the gitlab-ci rc script: 
 <pre> 
 vi /usr/local/etc/rc.d/gitlab-ci 
 </pre> 
 #* And add the following: 
 <pre> 
 #! /usr/local/bin/bash 

 # GITLAB CI 
 # Maintainer: @randx 
 # App Version: 2.2 

 ### BEGIN INIT INFO 
 # Provides:            gitlab-ci 
 # Required-Start:      $local_fs $remote_fs $network $syslog redis-server 
 # Required-Stop:       $local_fs $remote_fs $network $syslog 
 # Default-Start:       2 3 4 5 
 # Default-Stop:        0 1 6 
 # Short-Description: GitLab CI 
 # Description:         GitLab CI 
 ### END INIT INFO 


 APP_ROOT="/usr/home/gitlab_ci/gitlab-ci" 
 DAEMON_OPTS="-C $APP_ROOT/config/puma.rb -e production" 
 PID_PATH="$APP_ROOT/tmp/pids" 
 WEB_SERVER_PID="$PID_PATH/puma.pid" 
 SIDEKIQ_PID="$PID_PATH/sidekiq.pid" 
 STOP_SIDEKIQ="RAILS_ENV=production bundle exec rake sidekiq:stop" 
 START_SIDEKIQ="RAILS_ENV=production bundle exec rake sidekiq:start" 
 NAME="GitLab CI" 
 DESC="Gitlab CI service" 

 check_pid(){ 
   if [ -f $WEB_SERVER_PID ]; then 
     PID=`cat $WEB_SERVER_PID` 
     SPID=`cat $SIDEKIQ_PID` 
     STATUS=`ps aux | grep $PID | grep -v grep | wc -l` 
   else 
     STATUS=0 
     PID=0 
   fi 
 } 

 start() { 
   cd $APP_ROOT 
   check_pid 
   if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then 
     # Program is running, exit with error code 1. 
     echo "Error! $DESC is currently running!" 
     exit 1 
   else 
     if [ `whoami` = root ]; then 
       /usr/local/bin/sudo -u gitlab_ci -H /usr/local/bin/bash -l -c "RAILS_ENV=production bundle exec puma $DAEMON_OPTS" 
       /usr/local/bin/sudo -u gitlab_ci -H /usr/local/bin/bash -l -c "mkdir -p $PID_PATH && $START_SIDEKIQ    > /dev/null    2>&1 &" 
       echo "$DESC started" 
     fi 
   fi 
 } 

 stop() { 
   cd $APP_ROOT 
   check_pid 
   if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then 
     ## Program is running, stop it. 
     kill -QUIT `cat $WEB_SERVER_PID` 
     sudo -u gitlab_ci -H bash -l -c "mkdir -p $PID_PATH && $STOP_SIDEKIQ    > /dev/null    2>&1 &" 
     rm "$WEB_SERVER_PID" >> /dev/null 
     echo "$DESC stopped" 
   else 
     ## Program is not running, exit with error. 
     echo "Error! $DESC not started!" 
     exit 1 
   fi 
 } 

 restart() { 
   cd $APP_ROOT 
   check_pid 
   if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then 
     echo "Restarting $DESC..." 
     kill -USR2 `cat $WEB_SERVER_PID` 
     sudo -u gitlab_ci -H bash -l -c "mkdir -p $PID_PATH && $STOP_SIDEKIQ    > /dev/null    2>&1 &" 
     if [ `whoami` = root ]; then 
       sudo -u gitlab_ci -H bash -l -c "mkdir -p $PID_PATH && $START_SIDEKIQ    > /dev/null    2>&1 &" 
     fi 
     echo "$DESC restarted." 
   else 
     echo "Error, $NAME not running!" 
     exit 1 
   fi 
 } 

 status() { 
   cd $APP_ROOT 
   check_pid 
   if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then 
     echo "$DESC / Unicorn with PID $PID is running." 
     echo "$DESC / Sidekiq with PID $SPID is running." 
   else 
     echo "$DESC is not running." 
     exit 1 
   fi 
 } 

 ## Check to see if we are running as root first. 
 ## Found at http://www.cyberciti.biz/tips/shell-root-user-check-script.html 
 if [ "$(id -u)" != "0" ]; then 
     echo "This script must be run as root" 
     exit 1 
 fi 

 case "$1" in 
   start) 
         start 
         ;; 
   stop) 
         stop 
         ;; 
   restart) 
         restart 
         ;; 
   reload|force-reload) 
         echo -n "Reloading $NAME configuration: " 
         kill -HUP `cat $PID` 
         echo "done." 
         ;; 
   status) 
         status 
         ;; 
   *) 
         echo "Usage: sudo service gitlab {start|stop|restart|reload}" >&2 
         exit 1 
         ;; 
 esac 

 exit 0 
 </pre> 

 * Make the script executable: 
 <pre> 
 chmod +x /usr/local/etc/rc.d/gitlab-ci 
 </pre> 

 * Start and enable GitLab CI at boot: 
 <pre> 
 echo 'gitlab_ci_enable="YES"' >> /etc/rc.conf 
 service gitlab-ci start 
 </pre> 

 h2. Nginx 

 * Install nginx: 
 <pre> 
 portmaster www/nginx 
 </pre> 

 * Start and enable nginx at boot: 
 <pre> 
 echo 'nginx_enable="YES"' >> /etc/rc.conf 
 service nginx start 
 </pre> 

 * Edit the nginx configuration file: 
 <pre> 
 vi /usr/local/etc/nginx/nginx.conf 
 </pre> 
 #* And add the following inside the http block: 
 <pre> 
 upstream gitlab_ci { 
   server unix:/home/gitlab_ci/gitlab-ci/tmp/sockets/gitlab-ci.socket; 
 } 

 server { 
   listen 80 default_server; 
   server_name ci.example.com;      
   root /home/gitlab_ci/gitlab-ci/public; 

   access_log    /var/log/nginx/gitlab_ci_access.log; 
   error_log     /var/log/nginx/gitlab_ci_error.log; 

   location / { 
     try_files $uri $uri/index.html $uri.html @gitlab_ci; 
   } 

   location @gitlab_ci { 
     proxy_read_timeout 300; 
     proxy_connect_timeout 300; 
     proxy_redirect       off; 

     proxy_set_header     X-Forwarded-Proto $scheme; 
     proxy_set_header     Host                $http_host; 
     proxy_set_header     X-Real-IP           $remote_addr; 

     proxy_pass http://gitlab_ci; 
   } 
 } 
 </pre> 

 h2. Login 

 Visit http://ci.example.com for your first GitLab CI login. The setup has created an admin account for you. You can use it to log in: 
 * admin@local.host 
 * 5iveL!fe 

 h2. Resources 

 * https://github.com/Philzen/gitlab-ci-recipes/blob/master/freebsd/install.md 
 * https://github.com/gitlabhq/gitlab-ci/blob/2-2-stable/doc/installation.md 
 * https://raw.githubusercontent.com/gitlabhq/gitlab-ci/2-2-stable/lib/support/nginx/gitlab_ci 
 * https://github.com/Philzen/gitlab-ci-recipes/blob/master/freebsd/rc.d-2.2.sh

Back