SlideShare a Scribd company logo
Penyajian
Delivering High Quality Elixir
Code into Your Production
Line
Oleh
Tonny Adhi Sabastian
Jakarta, 2020
tonny.adhi@ui.ac.id / tonny.adhi@ruma.co.id | http://kambing.ui.ac.id
● 13 years of experiences at IT Industry and Academy
● Former chief of Network Administrator at Universitas
Indonesia and volunteer System Administrator for
kambing.ui.ac.id F/OSS repository
● Former (part time) lecturer and researcher at Faculty of
Computer Science Universitas Indonesia and also
Universitas Gunadarma
● Currently work at MAPAN ( Gojek Group ) as Tech. Architect
and Senior Engineer
● Topics of interest:
○ Linux Kernel, especially in Networking Stack, Kernel
Performance and Network Security
○ Distributed System in general - including Cloud
Computing
○ System Performance and Optimization
○ Pervasive Computing and Internet of Things
Tonny Adhi Sabastian
Sekilas
Agenda
MAPAN 101
Quick Bootstrapping on Elixir
Quality Assurance on Elixir Code
Elixir Pipeline on Gitlab
(1) MAPAN 101
source https://mapan.id
license limited use, only for MAPAN Publication
Gb. Tangkapan Layar
Kami percaya bahwa semua orang berhak untuk mengakses
layanan yang membantu mereka mencapai hidup mapan
- Bagian dari Ikrar Mapan
A Short History of MAPAN
● Founded in 2009 as PT Ruma by Aldi Haryopratomo
○ Selling Airtime
● Adding Bill Payment Product in 2012
● Branchless Banking Pilot with Bank of Indonesia in 2013
● Started serving physical goods to member in 2014
● Launching Arisan Mapan in 2015
● Member of Gojek Group since 2017
● Selling Digital Product from Gojek since 2019
● New Mapan App is launched on March 2020
○ Enabling various services on the platform
Arisan MAPAN
● We sell Household Goods
○ Cooking Pans
○ Furnitures
● Enabling community engagement in the spirit of
“Gotong Royong”
● Members will pay through “Arisan” Installments
○ More here:
https://www.mapan.id/apa-itu-arisan-mapan/arisan-
barang/
MAPAN Tech Stack
source various respective sources
license Apache License 2.0, Fair Use, and Public Domain
(2) Bootstrapping Elixir
source various respective sources
license CC-BY-SA, Fair Use
fn ( , ) ->
Elixir is Awesome
source self()
license CC-BY-SA
Interactive Elixir (1.10.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> defmodule Collection do
...(1)> def add_element_to_collection(collection, element) do
...(1)> collection ++ [element]
...(1)> end
...(1)> end
iex(2)> collection = [1,2,3,4]
[1, 2, 3, 4]
iex(3)> Collection.add_element_to_collection(collection, 5)
[1, 2, 3, 4, 5]
iex(4)> IO.inspect collection
[1, 2, 3, 4]
Immutable
# Elixir Shell
Interactive Elixir (1.10.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(7)> handle_result = fn
...(7)> {:ok, result} -> IO.puts "Handling result..."
...(7)> {:ok} -> IO.puts "Single Item"
...(7)> {:error} -> IO.puts "An error has occurred!"
...(7)> end
iex(8)> some_result = 2
2
iex(9)> handle_result.({:ok, some_result})
Handling result...
:ok
iex(10)> handle_result.({:ok})
Single Item
:ok
Pattern Matching
# Elixir Shell
Interactive Elixir (1.10.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(14)> 1..1_000_000 
...(14)> |> Enum.map(&(Task.async(fn -> &1 * &1 end)))
...(14)> |> Enum.map(&Task.await/1)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324,
361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089,
1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116,
2209, 2304, 2401, 2500, ...]
Processes (1)
# Elixir Shell
$ iex --sname bejo@localhost
Erlang/OTP 22 [erts-10.6.4] [source] [64-bit] [smp:8:8] [ds:8:8:10]
[async-threads:1] [hipe]
Interactive Elixir (1.10.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(bejo@localhost)1> defmodule Bejo do
...(bejo@localhost)1> def say_name do
...(bejo@localhost)1> IO.puts "Halo, Nama gue bejo."
...(bejo@localhost)1> end
...(bejo@localhost)1> end
$iex --sname surti@localhost
Erlang/OTP 22 [erts-10.6.4] [source] [64-bit] [smp:8:8] [ds:8:8:10]
[async-threads:1] [hipe]
Interactive Elixir (1.10.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(surti@localhost)1> Node.spawn_link(:bejo@localhost, fn -> Bejo.say_name end)
Halo, Nama gue bejo.
#PID<10888.124.0>
Processes (2)
# Elixir Shell
(3) Quality Assurance
on Elixir Code
source various respective sources
license CC-BY-SA
-> ->
Code Review by Peers ( senior
engineer, tech lead / head,
architect ).
1) Code Review
Run unit test on pipeline. Block
if it bellow coverage
2) Unit
Testing Run credo linter of pipeline.
Block if linter state that part
of code need more review
3) Code Lint
Typespec, Unreachable Code,
Pattern that never match. Block if
discrepancy found
4) Discrepancy
Check
Check if any dependencies
for a project contain CVE.
Block if a CVE found
5) CVE
Checking
Elixir Pipeline with Quality as
Concern
Same with previous step. The
different is only we do CVE
check on Docker Image that
use for a project deployment
6)Docker
Image CVE
Checking
Elixir Pipeline with Quality as
Concern
Functional Test done by QA
officer. It can be automated and
embedded within pipeline
7)Functional
Testing
Code Linting using
Credo (1)
https://github.com/rrrene/credo
Code Linting using
Credo (2)
https://github.com/rrrene/credo
# Bash Shell
# add credo in your project
$ vi mix.exs
…
defp deps do
[
{:credo, "~> 1.3", only: [:dev, :test], runtime: false}
]
end
…
Code Linting using
Credo (3)
https://github.com/rrrene/credo
Discrepancy Check
using Dialyxir (1)
https://github.com/jeremyjh/dialyxir
# Bash Shell
# add dialyxir in your project
$ vi mix.exs
…
def project do
[
dialyzer: [
plt_add_deps: :transitive,
plt_add_apps: [:mix, :ex_unit],
check_plt: true,
ignore_warnings: "dialyzer.ignore-warnings"
]
end
…
defp deps do
[
{:dialyxir, "~> 1.0", only: [:dev, :test], runtime: false}
]
end
…
Discrepancy Check
using Dialyxir (2)
https://github.com/jeremyjh/dialyxir
Unit Test Coverage
using Excoveralls (1)
https://github.com/parroty/excoveralls
# Bash Shell
# coveralls.json
$ cat coveralls.json
…
{
"coverage_options": {
"minimum_coverage": 90
},
"skip_files": [
"lib/phxchat_web.ex"
]
}
…
Unit Test Coverage
using Excoveralls (2)
https://github.com/parroty/excoveralls
# Bash Shell
# add excoverallw into your project
$ vi mix.exs
…
def project do
[
…
test_coverage: [tool: ExCoveralls],
preferred_cli_env: [
coveralls: :test,
"coveralls.detail": :test,
"coveralls.post": :test,
"coveralls.html": :test
],
…
]
end
…
defp deps do
[
{:excoveralls, "~> 0.12", only: [:dev, :test]}
]
end
…
Unit Test Coverage
using Excoveralls (3)
https://github.com/parroty/excoveralls
Showcase
( https://gitlab.mapan.io/tonny.adhi/phxchat/ )
Reference List for Elixir Study
Sites :
○ https://elixircasts.io/
○ https://elixirschool.com/en/
○ https://alchemist.camp/
○ https://elixirweekly.net/
○ https://elixirstatus.com/
○ https://www.nerves-project.org/
Books :
○ Learn Functional Programming with Elixir, by Ulises
Amelia
○ Functional Web Development with Elixir, OTP, and
Phoenix, by Lance Halvorsen
○ Elixir in Action Second Edition, by Sasa Juric
Q & A
Terima Kasih!

More Related Content

What's hot

Introduction to Python.Net
Introduction to Python.NetIntroduction to Python.Net
Introduction to Python.Net
Stefan Schukat
 
Reversing & malware analysis training part 2 introduction to windows internals
Reversing & malware analysis training part 2   introduction to windows internalsReversing & malware analysis training part 2   introduction to windows internals
Reversing & malware analysis training part 2 introduction to windows internals
securityxploded
 
Reversing & malware analysis training part 3 windows pe file format basics
Reversing & malware analysis training part 3   windows pe file format basicsReversing & malware analysis training part 3   windows pe file format basics
Reversing & malware analysis training part 3 windows pe file format basics
securityxploded
 
O porque das minhas aplicações funcionarem... E o que acontece com os recurso...
O porque das minhas aplicações funcionarem... E o que acontece com os recurso...O porque das minhas aplicações funcionarem... E o que acontece com os recurso...
O porque das minhas aplicações funcionarem... E o que acontece com os recurso...
Comunidade NetPonto
 
Anti-Virus Evasion Techniques and Countermeasures
Anti-Virus Evasion Techniques and CountermeasuresAnti-Virus Evasion Techniques and Countermeasures
Anti-Virus Evasion Techniques and Countermeasures
n|u - The Open Security Community
 
Introduction tojavaandxml lc-slides01-fp2005-ver 1.0
Introduction tojavaandxml lc-slides01-fp2005-ver 1.0Introduction tojavaandxml lc-slides01-fp2005-ver 1.0
Introduction tojavaandxml lc-slides01-fp2005-ver 1.0
Sanjay Yadav
 
Reverse engineering android apps
Reverse engineering android appsReverse engineering android apps
Reverse engineering android apps
Pranay Airan
 
Reversing & Malware Analysis Training Part 11 - Exploit Development [Advanced]
Reversing & Malware Analysis Training Part 11 - Exploit Development [Advanced]Reversing & Malware Analysis Training Part 11 - Exploit Development [Advanced]
Reversing & Malware Analysis Training Part 11 - Exploit Development [Advanced]
securityxploded
 
Corejava ratan
Corejava ratanCorejava ratan
Corejava ratan
Satya Johnny
 
Reversing & Malware Analysis Training Part 4 - Assembly Programming Basics
Reversing & Malware Analysis Training Part 4 - Assembly Programming BasicsReversing & Malware Analysis Training Part 4 - Assembly Programming Basics
Reversing & Malware Analysis Training Part 4 - Assembly Programming Basics
securityxploded
 
Reversing & malware analysis training part 1 lab setup guide
Reversing & malware analysis training part 1   lab setup guideReversing & malware analysis training part 1   lab setup guide
Reversing & malware analysis training part 1 lab setup guide
securityxploded
 
Introduction to Dynamic Analysis of Android Application
Introduction to Dynamic Analysis of Android ApplicationIntroduction to Dynamic Analysis of Android Application
Introduction to Dynamic Analysis of Android ApplicationKelwin Yang
 
Update from android kk to android l
Update from android kk to android lUpdate from android kk to android l
Update from android kk to android l
Bin Yang
 
Droidcon Greece '15 - Reverse Engineering in Android: Countermeasures and Tools
Droidcon Greece '15 - Reverse Engineering in Android: Countermeasures and ToolsDroidcon Greece '15 - Reverse Engineering in Android: Countermeasures and Tools
Droidcon Greece '15 - Reverse Engineering in Android: Countermeasures and Tools
Dario Incalza
 
Advanced Malware Analysis Training Session 6 - Malware Sandbox Analysis
Advanced Malware Analysis Training Session 6  - Malware Sandbox AnalysisAdvanced Malware Analysis Training Session 6  - Malware Sandbox Analysis
Advanced Malware Analysis Training Session 6 - Malware Sandbox Analysis
securityxploded
 
Reversing & Malware Analysis Training Part 9 - Advanced Malware Analysis
Reversing & Malware Analysis Training Part 9 -  Advanced Malware AnalysisReversing & Malware Analysis Training Part 9 -  Advanced Malware Analysis
Reversing & Malware Analysis Training Part 9 - Advanced Malware Analysis
securityxploded
 
Was faqs
Was faqsWas faqs
Was faqs
sruthilaya
 
(CISC 2013) Real-Time Record and Replay on Android for Malware Analysis
(CISC 2013) Real-Time Record and Replay on Android for Malware Analysis(CISC 2013) Real-Time Record and Replay on Android for Malware Analysis
(CISC 2013) Real-Time Record and Replay on Android for Malware Analysis
ZongXian Shen
 

What's hot (20)

Introduction to Python.Net
Introduction to Python.NetIntroduction to Python.Net
Introduction to Python.Net
 
Reversing & malware analysis training part 2 introduction to windows internals
Reversing & malware analysis training part 2   introduction to windows internalsReversing & malware analysis training part 2   introduction to windows internals
Reversing & malware analysis training part 2 introduction to windows internals
 
Reversing & malware analysis training part 3 windows pe file format basics
Reversing & malware analysis training part 3   windows pe file format basicsReversing & malware analysis training part 3   windows pe file format basics
Reversing & malware analysis training part 3 windows pe file format basics
 
O porque das minhas aplicações funcionarem... E o que acontece com os recurso...
O porque das minhas aplicações funcionarem... E o que acontece com os recurso...O porque das minhas aplicações funcionarem... E o que acontece com os recurso...
O porque das minhas aplicações funcionarem... E o que acontece com os recurso...
 
Anti-Virus Evasion Techniques and Countermeasures
Anti-Virus Evasion Techniques and CountermeasuresAnti-Virus Evasion Techniques and Countermeasures
Anti-Virus Evasion Techniques and Countermeasures
 
Introduction tojavaandxml lc-slides01-fp2005-ver 1.0
Introduction tojavaandxml lc-slides01-fp2005-ver 1.0Introduction tojavaandxml lc-slides01-fp2005-ver 1.0
Introduction tojavaandxml lc-slides01-fp2005-ver 1.0
 
Reverse engineering android apps
Reverse engineering android appsReverse engineering android apps
Reverse engineering android apps
 
Reversing & Malware Analysis Training Part 11 - Exploit Development [Advanced]
Reversing & Malware Analysis Training Part 11 - Exploit Development [Advanced]Reversing & Malware Analysis Training Part 11 - Exploit Development [Advanced]
Reversing & Malware Analysis Training Part 11 - Exploit Development [Advanced]
 
C# tutorial
C# tutorialC# tutorial
C# tutorial
 
Corejava ratan
Corejava ratanCorejava ratan
Corejava ratan
 
Reversing & Malware Analysis Training Part 4 - Assembly Programming Basics
Reversing & Malware Analysis Training Part 4 - Assembly Programming BasicsReversing & Malware Analysis Training Part 4 - Assembly Programming Basics
Reversing & Malware Analysis Training Part 4 - Assembly Programming Basics
 
Reversing & malware analysis training part 1 lab setup guide
Reversing & malware analysis training part 1   lab setup guideReversing & malware analysis training part 1   lab setup guide
Reversing & malware analysis training part 1 lab setup guide
 
Introduction to Dynamic Analysis of Android Application
Introduction to Dynamic Analysis of Android ApplicationIntroduction to Dynamic Analysis of Android Application
Introduction to Dynamic Analysis of Android Application
 
Update from android kk to android l
Update from android kk to android lUpdate from android kk to android l
Update from android kk to android l
 
Unit 8 Java
Unit 8 JavaUnit 8 Java
Unit 8 Java
 
Droidcon Greece '15 - Reverse Engineering in Android: Countermeasures and Tools
Droidcon Greece '15 - Reverse Engineering in Android: Countermeasures and ToolsDroidcon Greece '15 - Reverse Engineering in Android: Countermeasures and Tools
Droidcon Greece '15 - Reverse Engineering in Android: Countermeasures and Tools
 
Advanced Malware Analysis Training Session 6 - Malware Sandbox Analysis
Advanced Malware Analysis Training Session 6  - Malware Sandbox AnalysisAdvanced Malware Analysis Training Session 6  - Malware Sandbox Analysis
Advanced Malware Analysis Training Session 6 - Malware Sandbox Analysis
 
Reversing & Malware Analysis Training Part 9 - Advanced Malware Analysis
Reversing & Malware Analysis Training Part 9 -  Advanced Malware AnalysisReversing & Malware Analysis Training Part 9 -  Advanced Malware Analysis
Reversing & Malware Analysis Training Part 9 - Advanced Malware Analysis
 
Was faqs
Was faqsWas faqs
Was faqs
 
(CISC 2013) Real-Time Record and Replay on Android for Malware Analysis
(CISC 2013) Real-Time Record and Replay on Android for Malware Analysis(CISC 2013) Real-Time Record and Replay on Android for Malware Analysis
(CISC 2013) Real-Time Record and Replay on Android for Malware Analysis
 

Similar to Delivering High Quality Elixir Code using Gitlab

VB2013 - Security Research and Development Framework
VB2013 - Security Research and Development FrameworkVB2013 - Security Research and Development Framework
VB2013 - Security Research and Development Framework
Amr Thabet
 
Docker practical solutions
Docker practical solutionsDocker practical solutions
Docker practical solutions
Kesav Kumar Kolla
 
Kotlin: Why Do You Care?
Kotlin: Why Do You Care?Kotlin: Why Do You Care?
Kotlin: Why Do You Care?
intelliyole
 
Mining Source Code Improvement Patterns from Similar Code Review Works
Mining Source Code Improvement Patterns from Similar Code Review WorksMining Source Code Improvement Patterns from Similar Code Review Works
Mining Source Code Improvement Patterns from Similar Code Review Works
奈良先端大 情報科学研究科
 
Mining Source Code Improvement Patterns from Similar Code Review Works
Mining Source Code Improvement Patterns from Similar Code Review WorksMining Source Code Improvement Patterns from Similar Code Review Works
Mining Source Code Improvement Patterns from Similar Code Review Works
Yuki Ueda
 
Code Factory avec GitLab CI et Rancher
Code Factory avec GitLab CI et RancherCode Factory avec GitLab CI et Rancher
Code Factory avec GitLab CI et Rancher
SUSE
 
Code Factory avec GitLab CI et Rancher
Code Factory avec GitLab CI et RancherCode Factory avec GitLab CI et Rancher
Code Factory avec GitLab CI et Rancher
SUSE
 
Docker interview Questions-3.pdf
Docker interview Questions-3.pdfDocker interview Questions-3.pdf
Docker interview Questions-3.pdf
Yogeshwaran R
 
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
Eric Smalling
 
Plug yourself in and your app will never be the same (1 hr edition)
Plug yourself in and your app will never be the same (1 hr edition)Plug yourself in and your app will never be the same (1 hr edition)
Plug yourself in and your app will never be the same (1 hr edition)
Mikkel Flindt Heisterberg
 
Weave User Group Talk - DockerCon 2017 Recap
Weave User Group Talk - DockerCon 2017 RecapWeave User Group Talk - DockerCon 2017 Recap
Weave User Group Talk - DockerCon 2017 Recap
Patrick Chanezon
 
Eclipse Training - Main eclipse ecosystem classes
Eclipse Training - Main eclipse ecosystem classesEclipse Training - Main eclipse ecosystem classes
Eclipse Training - Main eclipse ecosystem classes
Luca D'Onofrio
 
Common primitives in Docker environments
Common primitives in Docker environmentsCommon primitives in Docker environments
Common primitives in Docker environments
alexandru giurgiu
 
Building Slack's internal developer platform as a product.pdf
Building Slack's internal developer platform as a product.pdfBuilding Slack's internal developer platform as a product.pdf
Building Slack's internal developer platform as a product.pdf
Javier Turégano Molina
 
Velocity NYC 2017: Building Resilient Microservices with Kubernetes, Docker, ...
Velocity NYC 2017: Building Resilient Microservices with Kubernetes, Docker, ...Velocity NYC 2017: Building Resilient Microservices with Kubernetes, Docker, ...
Velocity NYC 2017: Building Resilient Microservices with Kubernetes, Docker, ...
Ambassador Labs
 
Stage 1 Tradecraft
Stage 1 TradecraftStage 1 Tradecraft
Stage 1 Tradecraft
matt806068
 
SonarQube.pptx
SonarQube.pptxSonarQube.pptx
SonarQube.pptx
YASHWANTHGANESH1
 
iPhone development from a Java perspective (Jazoon '09)
iPhone development from a Java perspective (Jazoon '09)iPhone development from a Java perspective (Jazoon '09)
iPhone development from a Java perspective (Jazoon '09)
Netcetera
 
Getting Native with NDK
Getting Native with NDKGetting Native with NDK
Getting Native with NDK
ナム-Nam Nguyễn
 
Kubernetes Robotics Edge Cluster System
Kubernetes Robotics Edge Cluster SystemKubernetes Robotics Edge Cluster System
Kubernetes Robotics Edge Cluster System
Tomoya Fujita
 

Similar to Delivering High Quality Elixir Code using Gitlab (20)

VB2013 - Security Research and Development Framework
VB2013 - Security Research and Development FrameworkVB2013 - Security Research and Development Framework
VB2013 - Security Research and Development Framework
 
Docker practical solutions
Docker practical solutionsDocker practical solutions
Docker practical solutions
 
Kotlin: Why Do You Care?
Kotlin: Why Do You Care?Kotlin: Why Do You Care?
Kotlin: Why Do You Care?
 
Mining Source Code Improvement Patterns from Similar Code Review Works
Mining Source Code Improvement Patterns from Similar Code Review WorksMining Source Code Improvement Patterns from Similar Code Review Works
Mining Source Code Improvement Patterns from Similar Code Review Works
 
Mining Source Code Improvement Patterns from Similar Code Review Works
Mining Source Code Improvement Patterns from Similar Code Review WorksMining Source Code Improvement Patterns from Similar Code Review Works
Mining Source Code Improvement Patterns from Similar Code Review Works
 
Code Factory avec GitLab CI et Rancher
Code Factory avec GitLab CI et RancherCode Factory avec GitLab CI et Rancher
Code Factory avec GitLab CI et Rancher
 
Code Factory avec GitLab CI et Rancher
Code Factory avec GitLab CI et RancherCode Factory avec GitLab CI et Rancher
Code Factory avec GitLab CI et Rancher
 
Docker interview Questions-3.pdf
Docker interview Questions-3.pdfDocker interview Questions-3.pdf
Docker interview Questions-3.pdf
 
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
 
Plug yourself in and your app will never be the same (1 hr edition)
Plug yourself in and your app will never be the same (1 hr edition)Plug yourself in and your app will never be the same (1 hr edition)
Plug yourself in and your app will never be the same (1 hr edition)
 
Weave User Group Talk - DockerCon 2017 Recap
Weave User Group Talk - DockerCon 2017 RecapWeave User Group Talk - DockerCon 2017 Recap
Weave User Group Talk - DockerCon 2017 Recap
 
Eclipse Training - Main eclipse ecosystem classes
Eclipse Training - Main eclipse ecosystem classesEclipse Training - Main eclipse ecosystem classes
Eclipse Training - Main eclipse ecosystem classes
 
Common primitives in Docker environments
Common primitives in Docker environmentsCommon primitives in Docker environments
Common primitives in Docker environments
 
Building Slack's internal developer platform as a product.pdf
Building Slack's internal developer platform as a product.pdfBuilding Slack's internal developer platform as a product.pdf
Building Slack's internal developer platform as a product.pdf
 
Velocity NYC 2017: Building Resilient Microservices with Kubernetes, Docker, ...
Velocity NYC 2017: Building Resilient Microservices with Kubernetes, Docker, ...Velocity NYC 2017: Building Resilient Microservices with Kubernetes, Docker, ...
Velocity NYC 2017: Building Resilient Microservices with Kubernetes, Docker, ...
 
Stage 1 Tradecraft
Stage 1 TradecraftStage 1 Tradecraft
Stage 1 Tradecraft
 
SonarQube.pptx
SonarQube.pptxSonarQube.pptx
SonarQube.pptx
 
iPhone development from a Java perspective (Jazoon '09)
iPhone development from a Java perspective (Jazoon '09)iPhone development from a Java perspective (Jazoon '09)
iPhone development from a Java perspective (Jazoon '09)
 
Getting Native with NDK
Getting Native with NDKGetting Native with NDK
Getting Native with NDK
 
Kubernetes Robotics Edge Cluster System
Kubernetes Robotics Edge Cluster SystemKubernetes Robotics Edge Cluster System
Kubernetes Robotics Edge Cluster System
 

More from Tonny Adhi Sabastian

The_Story_of_Microservices_YAI_KALBIS.pdf
The_Story_of_Microservices_YAI_KALBIS.pdfThe_Story_of_Microservices_YAI_KALBIS.pdf
The_Story_of_Microservices_YAI_KALBIS.pdf
Tonny Adhi Sabastian
 
Introduction to Open Telemetry as Observability Library
Introduction to Open  Telemetry as Observability LibraryIntroduction to Open  Telemetry as Observability Library
Introduction to Open Telemetry as Observability Library
Tonny Adhi Sabastian
 
Adopting Open Telemetry as Distributed Tracer on your Microservices at Kubern...
Adopting Open Telemetry as Distributed Tracer on your Microservices at Kubern...Adopting Open Telemetry as Distributed Tracer on your Microservices at Kubern...
Adopting Open Telemetry as Distributed Tracer on your Microservices at Kubern...
Tonny Adhi Sabastian
 
Single Sign On (SSO) Services with Free/Open Source Software
Single Sign On (SSO) Services with Free/Open Source SoftwareSingle Sign On (SSO) Services with Free/Open Source Software
Single Sign On (SSO) Services with Free/Open Source Software
Tonny Adhi Sabastian
 
Software Delivery Pipeline
Software Delivery PipelineSoftware Delivery Pipeline
Software Delivery Pipeline
Tonny Adhi Sabastian
 
DevOps Culture and Principles
DevOps Culture and PrinciplesDevOps Culture and Principles
DevOps Culture and Principles
Tonny Adhi Sabastian
 
Cloud Services On UI and Ideas for Federated Cloud on idREN
Cloud Services On UI and Ideas for Federated Cloud on idRENCloud Services On UI and Ideas for Federated Cloud on idREN
Cloud Services On UI and Ideas for Federated Cloud on idREN
Tonny Adhi Sabastian
 
Towards universitas indonesia_next_generation_firewall_service
Towards universitas indonesia_next_generation_firewall_serviceTowards universitas indonesia_next_generation_firewall_service
Towards universitas indonesia_next_generation_firewall_service
Tonny Adhi Sabastian
 
Paparan menteri kadisdik 141201 - low v.0
Paparan menteri   kadisdik 141201 - low v.0Paparan menteri   kadisdik 141201 - low v.0
Paparan menteri kadisdik 141201 - low v.0
Tonny Adhi Sabastian
 
Cloud computing 101 & The Development Beyond
Cloud computing 101  &  The Development BeyondCloud computing 101  &  The Development Beyond
Cloud computing 101 & The Development Beyond
Tonny Adhi Sabastian
 
Raspberry Pi GPIO 101
Raspberry Pi GPIO 101Raspberry Pi GPIO 101
Raspberry Pi GPIO 101
Tonny Adhi Sabastian
 
Kreatif Dengan Piranti Keras Open Source Raspberry Pi
Kreatif Dengan Piranti Keras Open Source Raspberry PiKreatif Dengan Piranti Keras Open Source Raspberry Pi
Kreatif Dengan Piranti Keras Open Source Raspberry Pi
Tonny Adhi Sabastian
 
RaspberryPi-KopiDarat-IDPython-Oktober2013
RaspberryPi-KopiDarat-IDPython-Oktober2013RaspberryPi-KopiDarat-IDPython-Oktober2013
RaspberryPi-KopiDarat-IDPython-Oktober2013Tonny Adhi Sabastian
 
Raspberry Pi 101
Raspberry Pi 101Raspberry Pi 101
Raspberry Pi 101
Tonny Adhi Sabastian
 

More from Tonny Adhi Sabastian (14)

The_Story_of_Microservices_YAI_KALBIS.pdf
The_Story_of_Microservices_YAI_KALBIS.pdfThe_Story_of_Microservices_YAI_KALBIS.pdf
The_Story_of_Microservices_YAI_KALBIS.pdf
 
Introduction to Open Telemetry as Observability Library
Introduction to Open  Telemetry as Observability LibraryIntroduction to Open  Telemetry as Observability Library
Introduction to Open Telemetry as Observability Library
 
Adopting Open Telemetry as Distributed Tracer on your Microservices at Kubern...
Adopting Open Telemetry as Distributed Tracer on your Microservices at Kubern...Adopting Open Telemetry as Distributed Tracer on your Microservices at Kubern...
Adopting Open Telemetry as Distributed Tracer on your Microservices at Kubern...
 
Single Sign On (SSO) Services with Free/Open Source Software
Single Sign On (SSO) Services with Free/Open Source SoftwareSingle Sign On (SSO) Services with Free/Open Source Software
Single Sign On (SSO) Services with Free/Open Source Software
 
Software Delivery Pipeline
Software Delivery PipelineSoftware Delivery Pipeline
Software Delivery Pipeline
 
DevOps Culture and Principles
DevOps Culture and PrinciplesDevOps Culture and Principles
DevOps Culture and Principles
 
Cloud Services On UI and Ideas for Federated Cloud on idREN
Cloud Services On UI and Ideas for Federated Cloud on idRENCloud Services On UI and Ideas for Federated Cloud on idREN
Cloud Services On UI and Ideas for Federated Cloud on idREN
 
Towards universitas indonesia_next_generation_firewall_service
Towards universitas indonesia_next_generation_firewall_serviceTowards universitas indonesia_next_generation_firewall_service
Towards universitas indonesia_next_generation_firewall_service
 
Paparan menteri kadisdik 141201 - low v.0
Paparan menteri   kadisdik 141201 - low v.0Paparan menteri   kadisdik 141201 - low v.0
Paparan menteri kadisdik 141201 - low v.0
 
Cloud computing 101 & The Development Beyond
Cloud computing 101  &  The Development BeyondCloud computing 101  &  The Development Beyond
Cloud computing 101 & The Development Beyond
 
Raspberry Pi GPIO 101
Raspberry Pi GPIO 101Raspberry Pi GPIO 101
Raspberry Pi GPIO 101
 
Kreatif Dengan Piranti Keras Open Source Raspberry Pi
Kreatif Dengan Piranti Keras Open Source Raspberry PiKreatif Dengan Piranti Keras Open Source Raspberry Pi
Kreatif Dengan Piranti Keras Open Source Raspberry Pi
 
RaspberryPi-KopiDarat-IDPython-Oktober2013
RaspberryPi-KopiDarat-IDPython-Oktober2013RaspberryPi-KopiDarat-IDPython-Oktober2013
RaspberryPi-KopiDarat-IDPython-Oktober2013
 
Raspberry Pi 101
Raspberry Pi 101Raspberry Pi 101
Raspberry Pi 101
 

Recently uploaded

How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
Globus
 
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Anthony Dahanne
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
XfilesPro
 
GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
Globus
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
Fermin Galan
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Globus
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
Matt Welsh
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
Globus
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Globus
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
Globus
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Globus
 
A Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdfA Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdf
kalichargn70th171
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
informapgpstrackings
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
Adele Miller
 
Cyaniclab : Software Development Agency Portfolio.pdf
Cyaniclab : Software Development Agency Portfolio.pdfCyaniclab : Software Development Agency Portfolio.pdf
Cyaniclab : Software Development Agency Portfolio.pdf
Cyanic lab
 
Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
Donna Lenk
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
abdulrafaychaudhry
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
Philip Schwarz
 

Recently uploaded (20)

How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
 
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
 
GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
 
A Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdfA Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdf
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
 
Cyaniclab : Software Development Agency Portfolio.pdf
Cyaniclab : Software Development Agency Portfolio.pdfCyaniclab : Software Development Agency Portfolio.pdf
Cyaniclab : Software Development Agency Portfolio.pdf
 
Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
 

Delivering High Quality Elixir Code using Gitlab

  • 1. Penyajian Delivering High Quality Elixir Code into Your Production Line Oleh Tonny Adhi Sabastian Jakarta, 2020 tonny.adhi@ui.ac.id / tonny.adhi@ruma.co.id | http://kambing.ui.ac.id
  • 2. ● 13 years of experiences at IT Industry and Academy ● Former chief of Network Administrator at Universitas Indonesia and volunteer System Administrator for kambing.ui.ac.id F/OSS repository ● Former (part time) lecturer and researcher at Faculty of Computer Science Universitas Indonesia and also Universitas Gunadarma ● Currently work at MAPAN ( Gojek Group ) as Tech. Architect and Senior Engineer ● Topics of interest: ○ Linux Kernel, especially in Networking Stack, Kernel Performance and Network Security ○ Distributed System in general - including Cloud Computing ○ System Performance and Optimization ○ Pervasive Computing and Internet of Things Tonny Adhi Sabastian Sekilas
  • 3. Agenda MAPAN 101 Quick Bootstrapping on Elixir Quality Assurance on Elixir Code Elixir Pipeline on Gitlab
  • 4. (1) MAPAN 101 source https://mapan.id license limited use, only for MAPAN Publication Gb. Tangkapan Layar
  • 5. Kami percaya bahwa semua orang berhak untuk mengakses layanan yang membantu mereka mencapai hidup mapan - Bagian dari Ikrar Mapan
  • 6. A Short History of MAPAN ● Founded in 2009 as PT Ruma by Aldi Haryopratomo ○ Selling Airtime ● Adding Bill Payment Product in 2012 ● Branchless Banking Pilot with Bank of Indonesia in 2013 ● Started serving physical goods to member in 2014 ● Launching Arisan Mapan in 2015 ● Member of Gojek Group since 2017 ● Selling Digital Product from Gojek since 2019 ● New Mapan App is launched on March 2020 ○ Enabling various services on the platform
  • 7. Arisan MAPAN ● We sell Household Goods ○ Cooking Pans ○ Furnitures ● Enabling community engagement in the spirit of “Gotong Royong” ● Members will pay through “Arisan” Installments ○ More here: https://www.mapan.id/apa-itu-arisan-mapan/arisan- barang/
  • 8. MAPAN Tech Stack source various respective sources license Apache License 2.0, Fair Use, and Public Domain
  • 9. (2) Bootstrapping Elixir source various respective sources license CC-BY-SA, Fair Use fn ( , ) ->
  • 10. Elixir is Awesome source self() license CC-BY-SA
  • 11. Interactive Elixir (1.10.2) - press Ctrl+C to exit (type h() ENTER for help) iex(1)> defmodule Collection do ...(1)> def add_element_to_collection(collection, element) do ...(1)> collection ++ [element] ...(1)> end ...(1)> end iex(2)> collection = [1,2,3,4] [1, 2, 3, 4] iex(3)> Collection.add_element_to_collection(collection, 5) [1, 2, 3, 4, 5] iex(4)> IO.inspect collection [1, 2, 3, 4] Immutable # Elixir Shell
  • 12. Interactive Elixir (1.10.2) - press Ctrl+C to exit (type h() ENTER for help) iex(7)> handle_result = fn ...(7)> {:ok, result} -> IO.puts "Handling result..." ...(7)> {:ok} -> IO.puts "Single Item" ...(7)> {:error} -> IO.puts "An error has occurred!" ...(7)> end iex(8)> some_result = 2 2 iex(9)> handle_result.({:ok, some_result}) Handling result... :ok iex(10)> handle_result.({:ok}) Single Item :ok Pattern Matching # Elixir Shell
  • 13. Interactive Elixir (1.10.2) - press Ctrl+C to exit (type h() ENTER for help) iex(14)> 1..1_000_000 ...(14)> |> Enum.map(&(Task.async(fn -> &1 * &1 end))) ...(14)> |> Enum.map(&Task.await/1) [1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401, 2500, ...] Processes (1) # Elixir Shell
  • 14. $ iex --sname bejo@localhost Erlang/OTP 22 [erts-10.6.4] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] Interactive Elixir (1.10.2) - press Ctrl+C to exit (type h() ENTER for help) iex(bejo@localhost)1> defmodule Bejo do ...(bejo@localhost)1> def say_name do ...(bejo@localhost)1> IO.puts "Halo, Nama gue bejo." ...(bejo@localhost)1> end ...(bejo@localhost)1> end $iex --sname surti@localhost Erlang/OTP 22 [erts-10.6.4] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] Interactive Elixir (1.10.2) - press Ctrl+C to exit (type h() ENTER for help) iex(surti@localhost)1> Node.spawn_link(:bejo@localhost, fn -> Bejo.say_name end) Halo, Nama gue bejo. #PID<10888.124.0> Processes (2) # Elixir Shell
  • 15. (3) Quality Assurance on Elixir Code source various respective sources license CC-BY-SA -> ->
  • 16. Code Review by Peers ( senior engineer, tech lead / head, architect ). 1) Code Review Run unit test on pipeline. Block if it bellow coverage 2) Unit Testing Run credo linter of pipeline. Block if linter state that part of code need more review 3) Code Lint Typespec, Unreachable Code, Pattern that never match. Block if discrepancy found 4) Discrepancy Check Check if any dependencies for a project contain CVE. Block if a CVE found 5) CVE Checking Elixir Pipeline with Quality as Concern
  • 17. Same with previous step. The different is only we do CVE check on Docker Image that use for a project deployment 6)Docker Image CVE Checking Elixir Pipeline with Quality as Concern Functional Test done by QA officer. It can be automated and embedded within pipeline 7)Functional Testing
  • 18. Code Linting using Credo (1) https://github.com/rrrene/credo
  • 19. Code Linting using Credo (2) https://github.com/rrrene/credo # Bash Shell # add credo in your project $ vi mix.exs … defp deps do [ {:credo, "~> 1.3", only: [:dev, :test], runtime: false} ] end …
  • 20. Code Linting using Credo (3) https://github.com/rrrene/credo
  • 21. Discrepancy Check using Dialyxir (1) https://github.com/jeremyjh/dialyxir
  • 22. # Bash Shell # add dialyxir in your project $ vi mix.exs … def project do [ dialyzer: [ plt_add_deps: :transitive, plt_add_apps: [:mix, :ex_unit], check_plt: true, ignore_warnings: "dialyzer.ignore-warnings" ] end … defp deps do [ {:dialyxir, "~> 1.0", only: [:dev, :test], runtime: false} ] end … Discrepancy Check using Dialyxir (2) https://github.com/jeremyjh/dialyxir
  • 23. Unit Test Coverage using Excoveralls (1) https://github.com/parroty/excoveralls
  • 24. # Bash Shell # coveralls.json $ cat coveralls.json … { "coverage_options": { "minimum_coverage": 90 }, "skip_files": [ "lib/phxchat_web.ex" ] } … Unit Test Coverage using Excoveralls (2) https://github.com/parroty/excoveralls
  • 25. # Bash Shell # add excoverallw into your project $ vi mix.exs … def project do [ … test_coverage: [tool: ExCoveralls], preferred_cli_env: [ coveralls: :test, "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test ], … ] end … defp deps do [ {:excoveralls, "~> 0.12", only: [:dev, :test]} ] end … Unit Test Coverage using Excoveralls (3) https://github.com/parroty/excoveralls
  • 27. Reference List for Elixir Study Sites : ○ https://elixircasts.io/ ○ https://elixirschool.com/en/ ○ https://alchemist.camp/ ○ https://elixirweekly.net/ ○ https://elixirstatus.com/ ○ https://www.nerves-project.org/ Books : ○ Learn Functional Programming with Elixir, by Ulises Amelia ○ Functional Web Development with Elixir, OTP, and Phoenix, by Lance Halvorsen ○ Elixir in Action Second Edition, by Sasa Juric
  • 28. Q & A