12/08/2018, 15:16

[Xamarin][CI] Jenkins for Xamarin (P.1)

Việc phát triển một dự án trong thực tế cần có sự làm việc của 1 team, quy mô có thể nhỏ to tuỳ thuộc vào dự án. Mỗi sáng, các thành viên trong team update code từ SVN/Git về, code say sưa, sau đó commit code lên trước khi về nhà. Nhưng đến một lúc khi build không được thì cả team lại nhốn nhao ...

Việc phát triển một dự án trong thực tế cần có sự làm việc của 1 team, quy mô có thể nhỏ to tuỳ thuộc vào dự án. Mỗi sáng, các thành viên trong team update code từ SVN/Git về, code say sưa, sau đó commit code lên trước khi về nhà. Nhưng đến một lúc khi build không được thì cả team lại nhốn nhao truy tìm và nhiều khi là tìm "hung thủ" viết code lỗi chứ chưa đi sửa lỗi =)). Đây là sai lầm mang tính con người chứ không phải máy móc, việc này chiếm khá nhiều thời gian của cả team và việc OT hay thậm chí ON để fix lỗi. Từ lý do này, khái niệm Continous Integration (CI) ra đời và thường được tích hợp trong các quy trình Agile. Vậy tổng quan thì CI là cái gì?

Continuous Integration là một tập quán trong phát triển phần mềm mà ở đó yêu cầu lập trình viên tích hợp source code trên máy local với server chứa source code được chia sẻ với các lập trình viên khác. Việc tích hợp này cần phải diễn ra thường xuyên và càng sớm càng tốt. Điều này giúp hạn chế sự khác biệt trong source code trên máy local của các thành viên khác nhau tham gia vào dự án. Đồng thời, nếu như dự án của bạn được viết Unit Test rất cẩn thận, đầy đủ, khi có 1 commit lên, hệ thống CI sẽ build và chạy lại toàn bộ các Unit Test. Nếu có case nào bị fail, cả team sẽ nhận được thông báo, developer có trách nhiệm phải nhanh chóng fix code để các case này pass, việc làm này sẽ giúp source code của developer trở lên đáng tin cậy hơn.

Jenkins là một phần mềm tự động hóa, mã nguồn mở và viết bằng Java. Dự án được tách ra từ dự án ban đầu là Hudson. Jenkins giúp tự động hóa các quy trình trong phát triển phần mềm - chính là CI. Jenkins là một phần mềm dạng server, chạy trên nền servlet với sự hỗ trợ của Apache Tomcat. Nó hỗ trợ hầu hết các dịch vụ quản lý mã nguồn phổ biến hiện nay như Git, Subversion, Mercurial, ClearCase... Jenkins cũng hỗ trợ cả các mã lệnh của Shell và Windows Batch, đồng thời còn chạy được các mã lệnh của Apache Ant, Maven, Gradle... và cái ta quan tâm ở đây là MSBuild - trình biên dịch dùng để build C# (Xamarin). Người sáng tạo ra Jenkins là Kohsuke Kawaguchi.[3]. Phát hành theo giấy phép MIT nên Jenkins là phần mềm miễn phí.

Việc kích hoạt tác vụ build dự án phần mềm bằng Jenkins có thể được thực hiện bằng nhiều cách: dựa theo các lần commit trên mã nguồn, theo các khoảng thời gian, kích hoạt qua các URL, kích hoạt sau khi các job khác được build,...

Các chức năng của Jenkins có thể được mở rộng thông qua các plugin sẽ được cài trong phần setting sẽ được giới thiệu sau trong phần config.

System requirements: Cấu hình một hệ thống Jenkis ổn định thường sẽ được đặt tại 1 máy chủ riêng biệt, đã được config các port để connect với các source code management như GIT, Svn, Bitbucket... -Lastest JDK -Tomcat server -Git (nếu dùng với Git)

For Xamarin (Optional): -OS: macOs nếu cần build Xamarin.iOS -Xamarin Studio -Installed Xamarin.Android, Xamarin.iOS -Xamarin license for Xamarin.Android, Xamarin.iOS

Install:

Đầu tiên ta cần cài đặt phần nền cho java, chính là JDK:

Step 1 : sudo apt-add-repository ppa:webupd8team/java
Step 2 : sudo apt-get update
Step 3 : sudo apt-get install oracle-java8-installer

Tiếp đến là cài đặt Git:

Step 1 : sudo apt-get update
Step 2 : sudo apt-get install git

Sau đó là Tomcat:

Step 1 : wget http://mirror.sdunix.com/apache/tomcat/tomcat-8/v8.0.23/bin/apache-tomcat-8.0.23.tar.gz
Step 2 : unzip apache-tomcat-8.0.39.zip
Step 3 : Add user name and password for tomcat
vi tomcat-user.xml
<tomcat-users>
    <user username="admin" password="password" roles="manager-gui,admin-gui"/>
</tomcat-users>

Step 4 : Start tomcat with port http://IP:8080

Và giờ là Jenkins. Đối với MAC, có thể cài Jenkins như 1 app, nó sẽ tự động cài những thứ cần thiết và run như 1 application. Có thể tham khảo tại đây: https://github.com/stisti/jenkins-app

Hay là thử nguy hiểm hơn với Manually-install:

Step 1 :  wget http://mirrors.jenkins.io/war/2.33/jenkins.war

Step 2 : Put jenkins.war in the tomcat/webapp

Step 3 : Start tomcat server

Step 4 : goto jenkins page : http://localhost:8080/jenkins

Đã cài được jenkins, nhưng giờ chúng ta sẽ phải cài các plugin như đã nhắc ở trên để có thể deploy hay tương tác với git, bitbucket, ...

Ở bước này nên chọn những cái mà Jenkins nó suggest nhé, hầu như là đủ những thứ cần và hay dùng rồi.

Sau khi cài đặt xong nó sẽ bảo bạn thiết lập user để sử dụng với Jenkis. Sau khi fill đầy đủ các trường, bạn hãy nhớ là chọn "Save and Finish" nhé, nhớ đấy.

Và đây là giao diện Homepage của nó:

Tại Homepage, chọn Manage Plugins, đây là kho plugin của Jenkins, vào đây tìm cài những plugins sau:

  • Git Plugin
  • Build Piplinbe Pugin
  • HTML Publisher plugin
  • Deploy to container Plugin
  • MSBuild Plugin
  • Team Foundation Server Plugin (nếu team bạn dùng TFS)

Install without restart luôn cho lẹ nhé.

Đã cài xong, Go back to the top page nhé.

Tiếp đến ta sẽ vào config Path cho các build tool. Về lại trang Manage Jenkins -> chọn Global Tool Configuration

Lần lượt ta sẽ set Path đúng cho JDK, Git, MSBuild

Ở MAC, ta có thể lấy JDK Path bằng command này:

/usr/libexec/java_home xxx

//xxx là version của JDK, mình dùng 1.8 nhé.

Tương tự như với Git:

which git

Riêng đối với MSBuild ta sẽ config Path đến xbuild nhé Command:

which xbuild

Xong, nhớ save.

Mình sẽ tạo 1 project Xamarin đã buil thành công để demo.

Trên Jenkins, tiến hành tạo mới 1 item bằng cách về home -> New item

Nhập tên và chọn loại project, đối với Xamarin ta chọn loại Freestyle nhé, kiểu tự biên tự diễn ấy. -> OK

Đây là giao diện của 1 project trong Jenkins.

Bây giờ mình sẽ trỏ Jenkins đến với repo của mình là Github để nó có thể clone source về nhé. Tại tab GeneralSource Code Management sẽ có các tuỳ chọn để trỏ đến repo của bạn, ở đây mình trỏ đến project mình vừa đưa lên GitHub nhé. Source Code Management

Trong Jenkins khi build xong 1 job thì nó sẽ lưu lại vào history, việc này nếu để quá lâu có thể gây tốn tài nguyên máy không cần thiết nên mình sẽ bỏ tính năng này.

Bên cạnh đó có thể config các thông tin như cách trigger cho Jenkins tự động build khi có 1 pull request lên repo của mình - nằm trong phần Build Triggers. Hoặc các config cho môi trường lúc build ở Build Environment...

Giờ đến lúc config cho Jenkins build Xamarin với MSBuild. Tại tab Build, chọn "Build a Visual Studio project or solution using MSBuild" để chỉ Jenkins các dùng xbuild build project Xamarin của bạn theo cách của bạn :v

  • MSBuild Version: chỉ đến enviroment MSBuild mà lúc trước mình đã config, nếu trong máy bạn có nhiều version thì có thể add thêm theo config trên nhé.
  • MSBuild Build File: Khi build thì jenkins sẽ pull project của bạn từ trên repo về trong workspace của nó, nên tại đây ta sẽ trỏ path đến file .csproj của project mình cần build (ở đây là mình test với Xamarin.Android).
  • Command Line Arguments: đây là parameter sẽ truyền vào khi jenkins gọi command tới thằng MSBuild, bạn có thể tham khảo thêm các parameter dùng cho MSBuild tại đây https://msdn.microsoft.com/en-us/library/ms164311.aspx

NOTE:

  • Tuỳ vào scope mà dự án của bạn cần để config các step build, vd như build xong -> lấy APK trong bin/Release và cài lên device hoặc chạy UT/Automation test...
  • Ở đây scope của mình chỉ đơn giản là Build không success là được :v -> mình sẽ config để build chế độ Release và xuất file APK để kiểm tra.
/p:Configuration=Release /t:PackageForAndroid

Giờ sẽ tiến hành Build thử nhé. Về trang chính của project và chọn Build now

1 job build sẽ xuất hiện

Ok, đã success:

Trên đây là tutorial từ việc install đến setup Jenkins và build 1 project cơ bản nhất. Jenkins là 1 công cụ khá mạnh nếu bạn biết tận dụng, nhiều mô hình phát triển và dự án lớn đã áp dụng rất thành công nó. Nếu có thời gian mình sẽ tìm hiểu và viết thêm về build Jenkins với Xamarin có UnitTest/IntergrationTest hoặc tự động build, chạy test, tự động xuất file APK với có keystore...

0