SlideShare a Scribd company logo
1 of 49
Download to read offline
Gitlab and
Lingvokot
+
Gitlab
Almost same as GitHub
Organizations
Almost same as GitHub
Projects
Almost same as GitHub
Issues
Almost same as GitHub
Issues with Labels
Almost same as GitHub
Pull Requests named as Merge Requests
Almost same as GitHub
Milestones
Almost same as GitHub
Tags
and other...
...but
Integrated CI
Pipelines
Combination of actions: test, build, deploy
Integrated CI
Builds
Job run: logs and result
Gitlab Continuous Integration
Short info about Gitlab CI
differences
Runner
A server that processes builds. It receives commands from
GitLab CI.
Build
Execution of a particular job.
Job
"Wrapped" bash script (before_script, "only" git ref, runner tags,
cache...)
Stage
Group of jobs. Builds of next stage are run after success of
previous.
Environment
Just a group of deploy jobs for now. Later will have approvement
for each environment in chain.
Easy setup
Add runners
Easy setup
Add .gitlab-ci.yml
Generated by bash shell script in Gitlab CI
job.
Custom addons
Badges
Custom addons
Badges
Actually they are links to our static WEB server,
where gets exported coverage info, static analysis results
Coverage on WEB Server
Generated by Jest, test runner used with React Native
Static analysis WEB Server
Generated by Plato
More info
See in this presentation:
Using Gitlab CI
Gitlab Continuous Delivery
TL;DR: How to create CD
process
both for beta and prod
Find a tool for working with stores (upload apk, ipa, upload
metadata of app), get wraps for xcode, gradle
Export your secrets (keys, accounts) into servers, make these
servers tagged Gitlab CI runners
Create a super-tweaked job in .gitlab-ci.yml
"a tool for stores"
Fastlane
Fastlane can (for us)...
Run native tests (still a TODO)
Build & sign xcode project in a CLI with dozen options (builds
gradle projects for sure)
Upload builded bundle (apk, ipa) to store on all 3 channels for
GPlay and TestFlight+AppStore for iOS
Also, upload app metadata (screenshots, description,
changelogs...) on that stores
Send slack messages by the way (may be useless...)
And magic Gitlab CI job
Not so magic, but how to do it?
A Condition: Fastlane lanes are written (build, deploy for android &
iOS), remote servers handle it just ne, they attached to Gitlab CI as
runners and have tags
Build: Job depends on npm test job. run fastlane ios build on a
build stage, capture your XCode archive and ipa as artifacts
Deploy: Job depends on build job. run fastlane ios beta on a
deploy stage, on some environment beta and prod
Almost same for android
A code snippet for ios build
Notice that react-native packager terrible workaround
ios:build:
before_script:
- source /etc/profile
- export PATH="$CI_PROJECT_DIR/node_modules/.bin:$PATH"
- nvm use
- npm set progress=false && npm prune && npm install && npm set progress=true
stage: build
script:
- react-native start &
- sleep 2
- kill_packager () { kill -9 $(lsof -n -ti4TCP:8081); kill -9 $(lsof -at -c node -c watchman
- fastlane ios build && kill_packager || (kill_packager; exit 2)
dependencies:
- run:node
artifacts:
paths:
- Break a Сode.ipa
- Mastermind.xcarchive
tags:
- nvm
- xcode
- fastlane
cache:
key: "$CI_BUILD_REF_NAME"
paths:
- node_modules/
Code snippet for ios deploy to
TestFlight
ios:deploy:beta:
before_script:
- source /etc/profile
stage: deploy
environment: beta
script:
- export FL_IOS_BUILD_VERSION=$(git describe --tags --abbrev=0 
--contain --match "v[0-9]*" 2>/dev/null | 
sed 's/.*v([0-9.]*).*/1/' 2>/dev/null);
- '[ "$FL_IOS_BUILD_VERSION" ] 
&& echo "Deploy $FL_IOS_BUILD_VERSION to beta" 
|| (echo "Skip deploy to beta channel" 1>&2 ; exit 2)'
- fastlane ios beta
only:
- /^v[0-9.]+$/
dependencies:
- ios:build
tags:
- xcode
- fastlane
About versioning
A contract: v1.0 for beta releases, v1.0-production for production
releases
Use git tags for deployment
Restrict executing of deploy jobs for that git tags with a regexp:
/^v[0-9.]+/ for beta and /^v[0-9.]+-production/
Use git commit count as a version code (xcode) or build number
(gradle)
In a job scripts, capture git tag and use it as version name
If no git tag speci ed, use 0.0.1 by default (fallback)
Code for versioning
SHORT_VERSION=$(git --git-dir="${PROJECT_DIR}/../.git" describe 
--tags --abbrev=0 --contain --match "v[0-9]*" | 
sed 's/.*v([0-9.]*).*/1/' 2>/dev/null)
VERSION=$(git --git-dir="${PROJECT_DIR}/../.git" rev-list 
--no-merges --count master)
APP_INFO_PLIST_PATH="${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
defaults write "$APP_INFO_PLIST_PATH" CFBundleShortVersionString $SHORT_VERSION
defaults write "$APP_INFO_PLIST_PATH" CFBundleVersion $VERSION
React Native and friends
Bootstrappin
React Native provides generator which created xcode project and
android project
Next steps: npm install, code and have fun!
Things to use with RN
Eslint with custom .eslintrc
Flow (integrates with Nuclide, RN IDE)
Jest (test runner)
Redux (mix of ux, elm...)
Workflow
Github flow
Master is always stable and deployable
For every feature (or bug x) new branch is created from master
Developer pushes feature branch on a server many times
After work seems done, developer creates Pull Request into
master
After PR gets merged into master, feature branch is removed
Redux ducks
TL;DR; actionCreators, actionTypes, reducers are in one le
And:
ducks export default a reducer function
exports actionTypes and actionCreators as named exports
actionType naming form: module/action
actionType variable is UPPER_UNDERSCORE_CASE
Our file structure
A bunch of modules
Will this work?
NO (about 60% of les are inside of /game/)
How my commit gets
deployed?
1. It gets reviewed on Merge Request rst
2. At same time, CI server runs [unit] tests and analyzes coverage
3. After commit gets merged into master, CI server runs [unit] tests
for master branch
4. After "Green", build job are launched for iOS and android in
parallel, resulting in artifacts (ipa + apk)
5. Then, after "Green" build, on a master branch, nothing is
happened
6. We download artifacts, launch and test (if you want), then add a
tag on that commit
7. Gitlab CI runs all sequence of test+build for tag ref (v1.0)
8. Then, nally, it runs deploy job for git tag ref. Channel (beta, prod)
is selected by tag name (v1.0 for beta, v1.0-production for
production)
Rollback
Stores are immutable, so you need to add a next version with patch
version bump and release it
v1.0
➡ OMG, fail
➡ git bisect to stable or fix a bug
➡ v1.0.1
Questions?
THE END
Presentation Max Sysoev. My GitHub:
Our organization on GitHub:
github.com/ColCh
github.com/Lingvokot

More Related Content

What's hot

Travis-CI - Continuos integration in the cloud for PHP
Travis-CI - Continuos integration in the cloud for PHPTravis-CI - Continuos integration in the cloud for PHP
Travis-CI - Continuos integration in the cloud for PHP
Federico Damián Lozada Mosto
 
Using Git with Drupal
Using Git with DrupalUsing Git with Drupal
Using Git with Drupal
Ryan Cross
 

What's hot (20)

Log monitoring with Logstash and Icinga
Log monitoring with Logstash and IcingaLog monitoring with Logstash and Icinga
Log monitoring with Logstash and Icinga
 
Travis-CI - Continuos integration in the cloud for PHP
Travis-CI - Continuos integration in the cloud for PHPTravis-CI - Continuos integration in the cloud for PHP
Travis-CI - Continuos integration in the cloud for PHP
 
Gitlab ci e kubernetes, build test and deploy your projects like a pro
Gitlab ci e kubernetes, build test and deploy your projects like a proGitlab ci e kubernetes, build test and deploy your projects like a pro
Gitlab ci e kubernetes, build test and deploy your projects like a pro
 
沒有 GUI 的 Git
沒有 GUI 的 Git沒有 GUI 的 Git
沒有 GUI 的 Git
 
Advanced Git Techniques: Subtrees, Grafting, and Other Fun Stuff
Advanced Git Techniques: Subtrees, Grafting, and Other Fun StuffAdvanced Git Techniques: Subtrees, Grafting, and Other Fun Stuff
Advanced Git Techniques: Subtrees, Grafting, and Other Fun Stuff
 
"Wix Serverless from inside", Mykola Borozdin
"Wix Serverless from inside", Mykola Borozdin"Wix Serverless from inside", Mykola Borozdin
"Wix Serverless from inside", Mykola Borozdin
 
CI/CD Pipeline mit Gitlab CI und Kubernetes
CI/CD Pipeline mit Gitlab CI und KubernetesCI/CD Pipeline mit Gitlab CI und Kubernetes
CI/CD Pipeline mit Gitlab CI und Kubernetes
 
Using Git with Drupal
Using Git with DrupalUsing Git with Drupal
Using Git with Drupal
 
Puppet Camp Paris 2015: Continuous Integration of Puppet Code (Intermediate)
Puppet Camp Paris 2015: Continuous Integration of Puppet Code (Intermediate) Puppet Camp Paris 2015: Continuous Integration of Puppet Code (Intermediate)
Puppet Camp Paris 2015: Continuous Integration of Puppet Code (Intermediate)
 
KubeCon EU 2016: "rktnetes": what's new with container runtimes and Kubernetes
KubeCon EU 2016: "rktnetes": what's new with container runtimes and KubernetesKubeCon EU 2016: "rktnetes": what's new with container runtimes and Kubernetes
KubeCon EU 2016: "rktnetes": what's new with container runtimes and Kubernetes
 
Git Tutorial
Git TutorialGit Tutorial
Git Tutorial
 
Intro to Git for Drupal 7
Intro to Git for Drupal 7Intro to Git for Drupal 7
Intro to Git for Drupal 7
 
Introduction to GitHub Actions
Introduction to GitHub ActionsIntroduction to GitHub Actions
Introduction to GitHub Actions
 
Git Tutorial I
Git Tutorial IGit Tutorial I
Git Tutorial I
 
Hacking Git and GitHub
Hacking Git and GitHubHacking Git and GitHub
Hacking Git and GitHub
 
Git Started With Git
Git Started With GitGit Started With Git
Git Started With Git
 
CI : the first_step: Auto Testing with CircleCI - (MOSG)
CI : the first_step: Auto Testing with CircleCI - (MOSG)CI : the first_step: Auto Testing with CircleCI - (MOSG)
CI : the first_step: Auto Testing with CircleCI - (MOSG)
 
Introduction to Git and Github
Introduction to Git and GithubIntroduction to Git and Github
Introduction to Git and Github
 
7 Habits of Highly Effective Jenkins Users
7 Habits of Highly Effective Jenkins Users7 Habits of Highly Effective Jenkins Users
7 Habits of Highly Effective Jenkins Users
 
Git and github 101
Git and github 101Git and github 101
Git and github 101
 

Viewers also liked

Introduction to Gitlab
Introduction to GitlabIntroduction to Gitlab
Introduction to Gitlab
Julien Pivotto
 

Viewers also liked (11)

GitLab 8.6 - Release Webcast
GitLab 8.6 - Release Webcast GitLab 8.6 - Release Webcast
GitLab 8.6 - Release Webcast
 
Introduction to Gitlab
Introduction to GitlabIntroduction to Gitlab
Introduction to Gitlab
 
React, Redux, ES2015 by Max Petruck
React, Redux, ES2015 by Max PetruckReact, Redux, ES2015 by Max Petruck
React, Redux, ES2015 by Max Petruck
 
Using GitLab CI
Using GitLab CIUsing GitLab CI
Using GitLab CI
 
AWS Deployment Best Practices
AWS Deployment Best PracticesAWS Deployment Best Practices
AWS Deployment Best Practices
 
Continuous Delivery
Continuous DeliveryContinuous Delivery
Continuous Delivery
 
Gitlab Training with GIT and SourceTree
Gitlab Training with GIT and SourceTreeGitlab Training with GIT and SourceTree
Gitlab Training with GIT and SourceTree
 
Continuous Delivery
Continuous DeliveryContinuous Delivery
Continuous Delivery
 
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
 
Googleのインフラ技術から考える理想のDevOps
Googleのインフラ技術から考える理想のDevOpsGoogleのインフラ技術から考える理想のDevOps
Googleのインフラ技術から考える理想のDevOps
 
Principles and Practices in Continuous Deployment at Etsy
Principles and Practices in Continuous Deployment at EtsyPrinciples and Practices in Continuous Deployment at Etsy
Principles and Practices in Continuous Deployment at Etsy
 

Similar to Gitlab and Lingvokot

Life of a Chromium Developer
Life of a Chromium DeveloperLife of a Chromium Developer
Life of a Chromium Developer
mpaproductions
 

Similar to Gitlab and Lingvokot (20)

DevOps(4) : Ansible(2) - (MOSG)
DevOps(4) : Ansible(2) - (MOSG)DevOps(4) : Ansible(2) - (MOSG)
DevOps(4) : Ansible(2) - (MOSG)
 
Infrastructure as code
Infrastructure as codeInfrastructure as code
Infrastructure as code
 
Serverless Container with Source2Image
Serverless Container with Source2ImageServerless Container with Source2Image
Serverless Container with Source2Image
 
Serverless containers … with source-to-image
Serverless containers  … with source-to-imageServerless containers  … with source-to-image
Serverless containers … with source-to-image
 
Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014
 
Toolbox of a Ruby Team
Toolbox of a Ruby TeamToolbox of a Ruby Team
Toolbox of a Ruby Team
 
Git
GitGit
Git
 
Cloud meets Fog & Puppet A Story of Version Controlled Infrastructure
Cloud meets Fog & Puppet A Story of Version Controlled InfrastructureCloud meets Fog & Puppet A Story of Version Controlled Infrastructure
Cloud meets Fog & Puppet A Story of Version Controlled Infrastructure
 
DrupalCon Los Angeles - Continuous Integration Toolbox
DrupalCon Los Angeles - Continuous Integration ToolboxDrupalCon Los Angeles - Continuous Integration Toolbox
DrupalCon Los Angeles - Continuous Integration Toolbox
 
Mac ruby deployment
Mac ruby deploymentMac ruby deployment
Mac ruby deployment
 
Switching to Git
Switching to GitSwitching to Git
Switching to Git
 
Exploring MySQL Operator for Kubernetes in Python
Exploring MySQL Operator for Kubernetes in PythonExploring MySQL Operator for Kubernetes in Python
Exploring MySQL Operator for Kubernetes in Python
 
An introduction to maven gradle and sbt
An introduction to maven gradle and sbtAn introduction to maven gradle and sbt
An introduction to maven gradle and sbt
 
Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)
Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)
Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)
 
Infrastructure as code - Python Saati #36
Infrastructure as code - Python Saati #36Infrastructure as code - Python Saati #36
Infrastructure as code - Python Saati #36
 
CIbox - OpenSource solution for making your #devops better
CIbox - OpenSource solution for making your #devops betterCIbox - OpenSource solution for making your #devops better
CIbox - OpenSource solution for making your #devops better
 
Openstack Third-Party CI and the review of a few Openstack Infrastructure pro...
Openstack Third-Party CI and the review of a few Openstack Infrastructure pro...Openstack Third-Party CI and the review of a few Openstack Infrastructure pro...
Openstack Third-Party CI and the review of a few Openstack Infrastructure pro...
 
Life of a Chromium Developer
Life of a Chromium DeveloperLife of a Chromium Developer
Life of a Chromium Developer
 
Jenkins Pipelines
Jenkins PipelinesJenkins Pipelines
Jenkins Pipelines
 
Capistrano deploy Magento project in an efficient way
Capistrano deploy Magento project in an efficient wayCapistrano deploy Magento project in an efficient way
Capistrano deploy Magento project in an efficient way
 

Recently uploaded

%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
masabamasaba
 
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Medical / Health Care (+971588192166) Mifepristone and Misoprostol tablets 200mg
 
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Medical / Health Care (+971588192166) Mifepristone and Misoprostol tablets 200mg
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
masabamasaba
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 

Recently uploaded (20)

%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
 
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - Keynote
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
 

Gitlab and Lingvokot