<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mukesh Ranjan</title>
    <description>The latest articles on DEV Community by Mukesh Ranjan (@mukesh-ranjan-dev).</description>
    <link>https://dev.to/mukesh-ranjan-dev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3693367%2F5cacc317-179c-45cd-bfc2-819bb18e7e49.jpg</url>
      <title>DEV Community: Mukesh Ranjan</title>
      <link>https://dev.to/mukesh-ranjan-dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mukesh-ranjan-dev"/>
    <language>en</language>
    <item>
      <title>Lessons from building a Solana project using iPhone</title>
      <dc:creator>Mukesh Ranjan</dc:creator>
      <pubDate>Thu, 08 Jan 2026 03:01:52 +0000</pubDate>
      <link>https://dev.to/mukesh-ranjan-dev/lessons-from-building-a-solana-project-using-iphone-2ck3</link>
      <guid>https://dev.to/mukesh-ranjan-dev/lessons-from-building-a-solana-project-using-iphone-2ck3</guid>
      <description>&lt;p&gt;So I lost my primary laptop dell xps to a motherboard failure and then other backup dell vostro to some parrot os booting issue(was trying to set up solana ecosystem and messed up with parrot os and I had set up bios admin password and didn’t remember which meant I cannot reinstall parrot os using live usb or any other os as it requires changing boot order).  Currently I have almost zero money so no money to buy new laptop . I booked a laptop on rent and started searching for ways to get this bios admin password reset. (SPOILER ALERT: I was not able to get bios admin password reset and ultimately had to sell both laptops cheap. There were various reasons but main reason ZERO MONEY. The rented laptop did arrive though after 2 weeks but by that time I did not needed it)&lt;/p&gt;

&lt;p&gt;While searching for options and also waiting for a rented laptop to arrive I started searching for ways to do development on iPhone. I found ish app. It is emulator based on alpine Linux and you can download Linux packages. But its very low powered one and simulates 32 bit architecture and can’t support latest versions of many packages.I was developing on Rust and wanted to work on a project on Solana blockchain with  Anchor framework. Failed to get even rust development started on ish as I was able to download only an old rust version (1.52.1) and my current code written in rust did not compile. Setting up solana and anchor definitely went out of window.&lt;/p&gt;

&lt;p&gt;After spending some time brushing my Linux concept and also making a solana wallet balance checker using shell scripting ( very nicely supported and doable in ish app &lt;a href="https://codeberg.org/mranjan7/balance_checker" rel="noopener noreferrer"&gt;balance checker&lt;/a&gt; ) I decided to try the idea of using ish app just for coding and CI pipelines available for free on platforms like GitHub, Gitlab and Codeberg for compiling and building (SPOILER ALERT: I was able to build thr project and also deploy on devnet using just iPhone and CI pipelines. So in rest of the articles I will go about how I did it .(I do not think any one will be as desperate situation as mine but it may be some interesting read. I have also shared all the links of the solana project and the CI pipelines)).&lt;/p&gt;

&lt;p&gt;While researching for some app to do coding I did come around some other apps like &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a-shell(good but does not have rust)&lt;/li&gt;
&lt;li&gt;Blink(Probably has rust pre installed. But it’s paid so did not check much )&lt;/li&gt;
&lt;li&gt;UTM VM : It seems like many people are able to work with it . Only complain I see is it’s slow. It allows many Linux distros and even mac and windows vm. I have old iPhone models and didn’t work for me)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I quickly settled on ish app and CI pipelines combo. While working on a project on shell scripting I started liking ish app and using CI pipelines made my work flow mirror how it is done in production work environment. Developers work on their local machines and check in their code. When code is stable it is moved to QA Testing, staging and production using CI pipelines. Also no local environment headache. I was not able to set up solana and anchor on parrot os due to some incompatible packages and then I tried to set up docker to get out of this local machine package crap but this package crap probably had already messed up with my parrot os and was not able to get into my workspace on next boot. The CI pipeline gave me same functionality of docker environment.&lt;/p&gt;

&lt;p&gt;My setup of iPhone connected to my ducky keyboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0eougw8n0myfwjxso6x.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0eougw8n0myfwjxso6x.jpeg" alt=" " width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Can be made more ergonomic like this&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvqjhkv73hwtte2flh7nw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvqjhkv73hwtte2flh7nw.jpeg" alt=" " width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For git platform I selected &lt;a href="https://codeberg.org/" rel="noopener noreferrer"&gt;Codeberg&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpqczm5o2reyb0kruroz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpqczm5o2reyb0kruroz9.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub does not allow me to use GitHub Actions as I had some payment issue. My credit card did not work and my account was restricted. I was not able to fix this . As I mentioned earlier ZERO MONEY. I tried Gitlab next. But I was using a free VPN and sometimes it used to route me through Hong Kong servers and it turns out Gitlab does not allow to use their services there and they use to route to me a different site which was not Gitlab(But probably like Gitlab. Did not research on it). Both GitHub and Gitlab are good git platforms. GitHub very popular and Gitlab solid . But did not work for me. I then bumped into Codeberg. It’s free ( really free . No credit card crap) and also open source. (SPOILER ALERT: It worked out really nice.)&lt;/p&gt;

&lt;p&gt;So I finalized my work set up ish app in iPhone and external ducky keyboard for coding and after I push my code to Codeberg CI will help with compiling, building and then deploying.&lt;/p&gt;

&lt;p&gt;Following are the steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  Install &lt;a href="https://apps.apple.com/in/app/ish-shell/id1436902243" rel="noopener noreferrer"&gt;ish app&lt;/a&gt; from App Store
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6umis1bof56h6c6j5dj3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6umis1bof56h6c6j5dj3.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Install git vim and openssh
&lt;/h3&gt;

&lt;p&gt;In ish terminal type following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apk add git vim openssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configure ssh in ish
&lt;/h3&gt;

&lt;p&gt;Make a .ssh directory in root folder&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir ~/.ssh

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get inside the .ssh folder&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/.ssh

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And type this command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-keygen

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And press enter&lt;/p&gt;

&lt;p&gt;It will ask for your key file name and you can specify any name (i.e MyKey) if you just press enter it will take a default one. And after that you need to enter a pass phrase or keep it blank. If you enter passphrase then please remember it as you will be asked to enter later.&lt;/p&gt;

&lt;p&gt;If you run “ls” command you will see it has created two files&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr45ikj4ijdp5uqiljwq3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr45ikj4ijdp5uqiljwq3.png" alt=" " width="800" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MyKey is private key and needed to be kept secret. MyKey.pub it public key .&lt;/p&gt;

&lt;p&gt;We need to copy the contents of public key &lt;/p&gt;

&lt;p&gt;If you open Files app in iPhone you will see ish entry along side other folders . &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F328m5vzh3kkqlf3q20rx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F328m5vzh3kkqlf3q20rx.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;click it and you will see various folders inside it . You will also see a root folder .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3q9g7d9n5pbl1fxhv7p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3q9g7d9n5pbl1fxhv7p.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;br&gt;
 This is the folder in which we will be working in this post.&lt;/p&gt;

&lt;p&gt;We need to copy contents of MyKey.pub and create a ssh key entry in Codeberg . &lt;/p&gt;

&lt;p&gt;Files app does not show folders starting with “.”. So it will not be visible to us to get its contents. A workaround I followed is to copy MyKey.pub to root folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
cp ~/.ssh/MyKey.pub ~/

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you will see MyKey.pub in root folder .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdrs6i2dwrx4tt7b3fj83.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdrs6i2dwrx4tt7b3fj83.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on it and copy it contents. Make sure it does not have any spaces at start or end. &lt;/p&gt;

&lt;p&gt;Create an account if you don’t have in &lt;a href="https://codeberg.org/" rel="noopener noreferrer"&gt;codeberg&lt;/a&gt; and login.&lt;br&gt;
Go to Settings page by clicking on three lines icon at top right &amp;gt; your profile icon &amp;gt; settings option.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh177nr80h30u2kccq50e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh177nr80h30u2kccq50e.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on SSH/GPG keys option in Settings menu &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foanb24n7fi8v55mocd3l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foanb24n7fi8v55mocd3l.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add a ssh key(If you are using iPhone after clicking on SSH/GPG keys option you need to scroll down to bottom to see the SSH/GPG key section)&lt;br&gt;
Give any name to the newly added ssh key and paste the contents of public key you copied earlier in contents section.&lt;/p&gt;

&lt;p&gt;Start the ssh agent and add the key with below command (please write below commands manually DO NOT copy and paste as it messes with quotes style and also replace MyKey name with name you specified for your key)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eval “$(ssh-agent -s)”
ssh-add ~/.ssh/MyKey
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Always run the above two commands whenever later you get message like this&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftoil3sbw0jkjgzqfgajn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftoil3sbw0jkjgzqfgajn.png" alt=" " width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Set up project directory
&lt;/h3&gt;

&lt;p&gt;Create a blank repository in &lt;a href="https://codeberg.org/" rel="noopener noreferrer"&gt;Codeberg&lt;/a&gt; with name profiles &lt;/p&gt;

&lt;p&gt;Go to codeberg home page and click on three lines icon at right&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzeyd6u912x30qmxyz34v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzeyd6u912x30qmxyz34v.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And then click on create and create a repository with name profiles&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecvmk0xnu2weojhep0av.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecvmk0xnu2weojhep0av.png" alt=" " width="800" height="1086"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we need to copy the ssh git url of the blank repository created earlier. Click on your profile icon , Click on Repositories menu and then click on your newly created repository . You will see HTTPS and SSH option for git url and we need to copy ssh url. Copy the ssh url.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgetyt7rx9fwogv7rjb1j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgetyt7rx9fwogv7rjb1j.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open the ish app , go to your root directory and clone the repository&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
git clone your_repository_copied_ssh_git_url

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you may get confirmation message and you just need to type yes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7r76pkj94xpss033szj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7r76pkj94xpss033szj.png" alt=" " width="800" height="123"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you can get inside the folder and work on your project and commit and push your code. &lt;/p&gt;

&lt;h3&gt;
  
  
  Create CI yaml
&lt;/h3&gt;

&lt;p&gt;The focus of this post will be to show how you can use CI pipelines for compiling and deploying so I am not going to go over details of anchor framework and its components.For this tutorial sake if you are following along I would like you to copy my &lt;a href="https://codeberg.org/mranjan7/profiles" rel="noopener noreferrer"&gt;profiles project&lt;/a&gt; as zip file from codeberg, unzip and copy the contents inside profiles directory created earlier in your root directory. &lt;/p&gt;

&lt;p&gt;The way I did was to make a temp folder in root folder of ish app and copy the zip file there.&lt;/p&gt;

&lt;p&gt;After the I used following commands in the terminal.&lt;/p&gt;

&lt;p&gt;First I added required packages&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apk add zip unzip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I executed below commands to copy the contents from unzipped profiles directory in temp to the profiles directory created earlier at root&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd temp/

unzip profiles-main.zip 

cp -r profiles/* ~/profiles/

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now make following directory inside your profiles repository&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; mkdir -p .forgejo/workflows
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get current &lt;a href="https://codeberg.org/mranjan7/profiles/src/branch/main/.forgejo/workflows/demo.yaml" rel="noopener noreferrer"&gt;CI yaml file&lt;/a&gt; and copy in the above created folder.&lt;/p&gt;

&lt;p&gt;As .forgejo will not be visible in files app in iPhone I copied the file to root folder and then copied to required file using terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 cp demo.yaml profiles/.forgezo/workflows/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After this content inside your profiles directory will look like this &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2p64eh2vqu1sg705y7uv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2p64eh2vqu1sg705y7uv.png" alt=" " width="800" height="123"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbtgtn63w08mjvtpyz0a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbtgtn63w08mjvtpyz0a.png" alt=" " width="800" height="572"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open .forgejo/workflows/demo.yaml . The file may look intimidating to someone who is new to CI pipelines and yaml but after you have made your first yaml file you will realise its most uncomplicated thing in the project.&lt;/p&gt;

&lt;p&gt;Following section makes CI execute on every push . You can change the name main to the git branch you want this functionality.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Rust + Anchor CI
on:
  push:
    branches: [ main ]
  pull_request:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After this you will see there are two jobs: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;build-and-test&lt;/li&gt;
&lt;li&gt;deploy-devnet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As obvious first one will build and execute test cases if you have provided and the second one will deploy. &lt;/p&gt;

&lt;p&gt;Only trick thing in whole yaml is this variable &lt;em&gt;DEVNET_DEPLOY_KEY_BASE64&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;But before coming to this variable part to understand the workings of CI yaml I want you to go over this pdf &lt;a href="https://codeberg.org/mranjan7/profiles/src/branch/main/CI_YAML_OVERVIEW.pdf" rel="noopener noreferrer"&gt;CI yaml overview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I created this pdf with the help of &lt;a href="https://grok.com/" rel="noopener noreferrer"&gt;Grok&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I opened grok site and in the ask me anything window I typed&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;please explain me below Codeberg CI yaml file&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and then I pressed enter and copied the contents of yaml file and clicked on send. I recommend using AI assistants to get your doubts cleared or understanding new things in general.&lt;/p&gt;

&lt;p&gt;Assuming you have read the pdf I will come to the variable part. This is base64 string of public key. &lt;/p&gt;

&lt;p&gt;As mentioned earlier I was not able to set up solana and anchor toolchain in ish app so I was also not able to generate any public key required for devnet deploy in my ish app. To get the key also I used help of CI. &lt;/p&gt;

&lt;p&gt;So now go on and delete the current yaml file . We will put this again once we have set the required variable.&lt;/p&gt;

&lt;p&gt;The variable contains the base 64 string of the private key and public key pair which represents a solana wallet. This is used in deploy process. As we need to pay the transaction fees.&lt;/p&gt;

&lt;p&gt;To generate new wallet key pair we use solana cli and through this command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solana-keygen new
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To delete the current yaml file got to your project root directory and type following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rm ~/.forgejo/workflows/demo.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then get the &lt;a href="https://codeberg.org/mranjan7/profiles/src/branch/main/yaml_file_for_base64_variable.yaml" rel="noopener noreferrer"&gt;yaml file for base 64 string&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please place this in workflows folder.&lt;/p&gt;

&lt;p&gt;Now you need to enable actions in codeberg. Go to your repository settings &amp;gt; Units &amp;gt; Overview and check “Enable integrated CI/CD pipelines with Forgejo Actions” under Actions&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vp6kpi8hmfm83huuat5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vp6kpi8hmfm83huuat5.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnnpggg43ytrs06okt51x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnnpggg43ytrs06okt51x.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;br&gt;
Run following commands to commit and push all code. This will trigger the CI workflow too.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add .
git commit -m “initial commit “
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are using git first time after install you may have to set your email and name&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global user.email "your.email@example.com"
git config --global user.name "Your Full Name"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go to your repository page in codeberg and you should see “…” at right side &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnjjh2s3rhvh5mmewrrb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnjjh2s3rhvh5mmewrrb.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you click on it you will see actions option &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqqsg1m7a7b45a197kxb0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqqsg1m7a7b45a197kxb0.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select actions and you will go the page where all your CI pipelines will be visible. If you are doing first then there will be only one entry&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fml7m4bf7ruk4bes0tbj4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fml7m4bf7ruk4bes0tbj4.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the action and you should see all the step and the step on which we are generating the key should show as completed . It takes couple of minutes to complete all steps in CI yaml so wait till all steps are complete.&lt;br&gt;
You will also see the base 64 string printed on the console.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7nf6qfm1lv1xc8bsz3m8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7nf6qfm1lv1xc8bsz3m8.png" alt=" " width="800" height="1497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the string and click on your profile icon in codeberg and then go to Settings option and then Actions and then Secrets. Click on add secret and enter the name DEVNET_DEPLOY_KEY_BASE64 and paste the copied base 64 in value section.&lt;/p&gt;

&lt;p&gt;Now change your yaml file to current version in repository.&lt;/p&gt;

&lt;p&gt;Your CI pipeline for ish and iPhone combo is all done !&lt;/p&gt;

&lt;p&gt;Now we code on ish terminal and push our code. Pipeline run shows us if there is compilation error and test cases shows us if the functionality is working fine. If some issues we correct it, push the code and check pipeline run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;It is observed that if you are using wired external keyboard to connect to iPhone it does not connect sometimes. The solution for this is to disconnect and wait for 30 - 120 sec and the connect and it works. &lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://doc.rust-lang.org/stable/book/" rel="noopener noreferrer"&gt;Rust book&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.anchor-lang.com/docs" rel="noopener noreferrer"&gt;Anchor docs&lt;/a&gt;&lt;br&gt;
&lt;a href="https://m.youtube.com/watch?v=amAq-WHAFs8" rel="noopener noreferrer"&gt;Solana boot camp&lt;/a&gt;&lt;br&gt;
AI assistants : &lt;a href="https://grok.com/" rel="noopener noreferrer"&gt;Grok&lt;/a&gt; &lt;a href="https://chatgpt.com/" rel="noopener noreferrer"&gt;ChatGpt&lt;/a&gt; &lt;a href="https://www.deepseek.com/en" rel="noopener noreferrer"&gt;DeepSeek&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>ios</category>
      <category>learning</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
